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