never executed always true always false
    1 module HelVM.HelMA.Automaton.Instruction.Extras.Constructors where
    2 
    3 import           HelVM.HelMA.Automaton.Instruction.Extras.Common
    4 
    5 import           HelVM.HelMA.Automaton.Instruction.Groups.CFInstruction
    6 import           HelVM.HelMA.Automaton.Instruction.Groups.IOInstruction
    7 import           HelVM.HelMA.Automaton.Instruction.Groups.LSInstruction
    8 import           HelVM.HelMA.Automaton.Instruction.Groups.SMInstruction
    9 
   10 import           HelVM.HelMA.Automaton.Instruction
   11 
   12 -- | Constructors
   13 
   14 -- | ISM
   15 
   16 immediateBinaryI :: Integer -> BinaryOperation -> Instruction
   17 immediateBinaryI i = ISM . SPure . Unary . UImmediate i
   18 
   19 consI :: Integer -> Instruction
   20 consI = sal . Cons
   21 
   22 addI , subI , mulI , divI , modI :: Instruction
   23 addI = binary Add
   24 subI = binary Sub
   25 mulI = binary Mul
   26 divI = binary Div
   27 modI = binary Mod
   28 
   29 divModI , negI , halibutI :: Instruction
   30 divModI  = binaries [Mod, Div]
   31 negI     = unary Neg
   32 halibutI = sal Halibut
   33 
   34 dupI , swapI , rotI , copyTI , discardI :: Instruction
   35 dupI     = copyII 0
   36 swapI    = moveII 1
   37 rotI     = moveII 2
   38 copyTI   = sal $ Indexed ITop Copy
   39 discardI = sal Discard
   40 
   41 copyII :: Index -> Instruction
   42 copyII = manipulationII Copy
   43 
   44 moveII :: Index -> Instruction
   45 moveII = manipulationII Move
   46 
   47 slideII :: Index -> Instruction
   48 slideII = manipulationII Slide
   49 
   50 manipulationII :: IndexedOperation -> Index -> Instruction
   51 manipulationII op i = sal $ Indexed (IImmediate i) op
   52 
   53 sInputI , sOutputI , sOutputDecI :: Instruction
   54 sInputI     = sio InputChar
   55 sOutputI    = sio OutputChar
   56 sOutputDecI = sio OutputDec
   57 
   58 binaries :: [BinaryOperation] -> Instruction
   59 binaries = sal . Binaries
   60 
   61 binary :: BinaryOperation -> Instruction
   62 binary = sal . Binary
   63 
   64 unary :: UnaryOperation -> Instruction
   65 unary = sal . Unary
   66 
   67 sal :: SPureInstruction -> Instruction
   68 sal = ISM . SPure
   69 
   70 sio :: IOInstruction -> Instruction
   71 sio = ISM . SIO
   72 
   73 -- | ICF
   74 
   75 markNI :: Natural -> Instruction
   76 markNI = ICF . Mark . MNatural
   77 
   78 markSI :: Label -> Instruction
   79 markSI = ICF . Mark . MArtificial
   80 
   81 jumpTI :: Instruction
   82 jumpTI = labeledT Jump
   83 
   84 jumpII :: Natural -> Instruction
   85 jumpII = labeledI Jump
   86 
   87 callSI , jumpSI :: Label -> Instruction
   88 callSI = labeledA Call
   89 jumpSI = labeledA Jump
   90 
   91 branchSwapI :: BranchTest -> Instruction
   92 branchSwapI = ICF . Branch BSwapped
   93 
   94 bNeTI :: Instruction
   95 bNeTI = branchT NE
   96 
   97 bNeII :: Natural -> Instruction
   98 bNeII = branchI NE
   99 
  100 bEzSI , bLtzSI :: Label -> Instruction
  101 bEzSI  = branchA EZ
  102 bLtzSI = branchA LTZ
  103 
  104 branchT :: BranchTest -> Instruction
  105 branchT = ICF . Branch BTop
  106 
  107 branchI :: BranchTest -> Natural -> Instruction
  108 branchI op n = ICF $ Branch (BImmediate n) op
  109 
  110 branchA :: BranchTest -> Label -> Instruction
  111 branchA op l = ICF $ Branch (BArtificial l) op
  112 
  113 labeledT :: LabelOperation -> Instruction
  114 labeledT = ICF . Labeled LTop
  115 
  116 labeledI :: LabelOperation -> Natural -> Instruction
  117 labeledI op n = ICF $ Labeled (LImmediate n) op
  118 
  119 labeledA :: LabelOperation -> Label -> Instruction
  120 labeledA op l = ICF $ Labeled (LArtificial l) op
  121 
  122 returnI :: Instruction
  123 returnI = ICF Return
  124 
  125 -- | ILS
  126 
  127 storeI , loadI :: Instruction
  128 storeI = ILS Store
  129 loadI  = ILS Load
  130 
  131 mInputI , mInputDecI :: Instruction
  132 mInputI    = mio InputChar
  133 mInputDecI = mio InputDec
  134 
  135 mio :: IOInstruction -> Instruction
  136 mio = ILS . MIO
  137 
  138 storeIDI :: Integer -> Index -> Instruction
  139 storeIDI v = ILS . StoreID v
  140 
  141 loadDI :: Index -> Instruction
  142 loadDI = ILS . LoadD
  143 
  144 moveDI :: Index -> Index -> Instruction
  145 moveDI a = ILS . MoveD a