-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdecision.S
145 lines (125 loc) · 2.29 KB
/
decision.S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
CODEHEADER TRUE, COLON, 0x01
addi sp, sp, -8
j gt_true
CODEHEADERZ GT, >, TRUE, 0x01
ld t1, 0(sp)
ld t0, 8(sp)
addi sp, sp, 8
gt_test:
bgt t0, t1, gt_true
gt_false:
sd zero, 0(sp)
tail NEXT
gt_true:
li t0, -1
sd t0, 0(sp)
tail NEXT
CODEHEADER LTEQ, GT, 0x01
#non-standard less than or equal
#(n n -- f)
ld t0, 0(sp)
ld t1, 8(sp)
lteq_as_gteq:
addi sp, sp, 8
ble t1, t0, gt_true
j gt_false
CODEHEADER GTEQ, LTEQ, 0x01
#non-standard greater than or equal
#(n n -- f)
ld t1, 0(sp)
ld t0, 8(sp)
j lteq_as_gteq
CODEHEADERZ NE, <>, GTEQ, 0x01
# (n n -- flag)
ld t0, 0(sp)
ld t1, 8(sp)
beq t0, t1, ne_ne
li t0, -1
sd t0, 8(sp)
addi sp, sp, 8
tail NEXT
ne_ne:
sd zero, 8(sp)
addi sp, sp, 8
tail NEXT
CODEHEADERZ LT, <, NE, 0x01
ld t0, 0(sp)
ld t1, 8(sp)
addi sp, sp, 8
j gt_test
CODEHEADER FALSE, LT, 0x01
addi sp, sp, -8
j gt_false
CODEHEADER EQUAL, FALSE, 0x01
ld t0, 0(sp)
ld t1, 8(sp)
addi sp, sp, 8
bne t0, t1, gt_false
j gt_true
CODEHEADER AND, EQUAL, 0x01
ld t0, 0(sp)
ld t1, 8(sp)
and t3, t0, t1
sd t3, 8(sp)
addi sp, sp, 8
tail NEXT
CODEHEADER OR, AND, 0x01
ld t0, 0(sp)
ld t1, 8(sp)
or t3, t0, t1
sd t3, 8(sp)
addi sp, sp, 8
tail NEXT
CODEHEADER XOR, OR, 0x01
ld t0, 0(sp)
ld t1, 8(sp)
xor t3, t0, t1
sd t3, 8(sp)
addi sp, sp, 8
tail NEXT
CODEHEADER INVERT, XOR, 0x01
ld t0, 0(sp)
not t1, t0
sd t1, 0(sp)
tail NEXT
#IF for compiled code
CODEHEADER _IF, INVERT, 0x00
ld t1, 0(sp)
addi sp, sp, 8
beqz t1, _if_handle_false
#In TRUE lane
#so execute next words
addi s7, s7, 16
tail NEXT
_if_handle_false:
#FALSE lane
ld t2, 0(s7)
beqz t2, _if_handle_then
#have an else clause
mv s7, t2
tail NEXT
_if_handle_then:
ld t2, 8(s7)
beqz t2, _if_failure
mv s7, t2
tail NEXT
_if_failure:
#no THEN created
print badif
tail NEXT
CODEHEADER IF, _IF, 0x01
#just a place holder in immediate mode
tail NEXT
CODEHEADER THEN, IF, 0x01
tail NEXT
#ELSE for compiled code
CODEHEADER _ELSE, THEN, 0x0
#only get here if we were executing TRUE path
ld t1, 0(s7)
beqz t1, _else_failure
mv s7, t1
tail NEXT
_else_failure:
tail trackback_failed_else
CODEHEADER ELSE, _ELSE, 0x01
tail NEXT