Skip to content

Commit 3bf4889

Browse files
authored
Merge pull request #166 from cmsc430/fix-164-165
Close 164 and 165
2 parents 1756d7f + a89cc0c commit 3bf4889

3 files changed

Lines changed: 327 additions & 51 deletions

File tree

langs/a86/ast.rkt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
(error n "expects register or offset; given ~v" a2))
3838
(values a a1 a2)))
3939

40-
(define check:arith
40+
(define check:arith
4141
(λ (a a1 a2 n)
4242
(unless (register? a1)
4343
(error n "expects register; given ~v" a1))
@@ -88,7 +88,7 @@
8888
(unless (or (and (exact-integer? a2) (<= 0 a2 63))
8989
(eq? 'cl a2))
9090
(error n "expects exact integer in [0,63]; given ~v" a2))
91-
(values a a1 a2)))
91+
(values a a1 a2)))
9292

9393
(define check:offset
9494
(λ (a r i n)
@@ -150,7 +150,7 @@
150150
(syntax-case stx ()
151151
[(instruct Name (x ...) guard)
152152
(with-syntax ([Name? (datum->syntax stx (string->symbol (string-append (symbol->string (syntax->datum #'Name)) "?")))])
153-
#'(begin (provide Name Name?)
153+
#'(begin (provide Name Name?)
154154
(define-match-expander Name
155155
(lambda (stx)
156156
(syntax-case stx ()
@@ -170,13 +170,13 @@
170170
(struct->vector i2))))
171171
(define hash-proc (λ (i hash) (hash (struct->vector i))))
172172
(define hash2-proc (λ (i hash) (hash (struct->vector i))))]
173-
173+
174174
#:property prop:custom-print-quotable 'never
175175
#:methods gen:custom-write
176176
[(define write-proc
177177
(instr-print 'Name)
178178
#;(make-constructor-style-printer
179-
(lambda (obj) 'Name)
179+
(lambda (obj) 'Name)
180180
(lambda (obj)
181181
(rest (rest (vector->list (struct->vector obj)))))))])
182182
(define Name? %Name?)))]))
@@ -212,6 +212,8 @@
212212
(instruct Sub (dst src) check:arith)
213213
(instruct Cmp (a1 a2) check:src-dest)
214214
(instruct Jmp (x) check:target)
215+
(instruct Jz (x) check:target)
216+
(instruct Jnz (x) check:target)
215217
(instruct Je (x) check:target)
216218
(instruct Jne (x) check:target)
217219
(instruct Jl (x) check:target)
@@ -222,6 +224,8 @@
222224
(instruct Jno (x) check:target)
223225
(instruct Jc (x) check:target)
224226
(instruct Jnc (x) check:target)
227+
(instruct Cmovz (dst src) check:cmov)
228+
(instruct Cmovnz (dst src) check:cmov)
225229
(instruct Cmove (dst src) check:cmov)
226230
(instruct Cmovne (dst src) check:cmov)
227231
(instruct Cmovl (dst src) check:cmov)
@@ -237,10 +241,12 @@
237241
(instruct Xor (dst src) check:src-dest)
238242
(instruct Sal (dst i) check:shift)
239243
(instruct Sar (dst i) check:shift)
244+
(instruct Shl (dst i) check:shift)
245+
(instruct Shr (dst i) check:shift)
240246
(instruct Push (a1) check:push)
247+
(instruct Pop (a1) check:register)
241248
(instruct Pushf () check:none)
242249
(instruct Popf () check:none)
243-
(instruct Pop (a1) check:register)
244250
(instruct Lea (dst x) check:lea)
245251
(instruct Not (x) check:register)
246252
(instruct Div (den) check:register)
@@ -340,7 +346,7 @@
340346
[(cons (Label s) asm)
341347
(cons s (label-decls asm))]
342348
[(cons (Extern s) asm)
343-
(cons s (label-decls asm))]
349+
(cons s (label-decls asm))]
344350
[(cons _ asm)
345351
(label-decls asm)]))
346352

@@ -370,7 +376,7 @@
370376
[(cons (Call (? label? s)) asm)
371377
(cons s (label-uses asm))]
372378
[(cons (Lea _ (? label? s)) asm)
373-
(cons s (label-uses asm))]
379+
(cons s (label-uses asm))]
374380
[(cons _ asm)
375381
(label-uses asm)]))
376382

langs/a86/printer.rkt

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
[(Plus e1 e2)
7474
(string-append "(" (exp->string e1) " + " (exp->string e2) ")")]
7575
[_ (label-symbol->string e)]))
76-
76+
7777
(define tab (make-string 8 #\space))
7878

7979
;; Instruction -> String
@@ -84,8 +84,8 @@
8484
(format "~a~a; ~.s" s (make-string (- 40 (string-length s)) #\space) (instruction-annotation i))
8585
(format "~a ; ~.s" s (instruction-annotation i)))
8686
s)))
87-
88-
87+
88+
8989
;; Instruction -> String
9090
(define (simple-instr->string i)
9191
(match i
@@ -107,7 +107,7 @@
107107
[(Sub a1 a2)
108108
(string-append tab "sub "
109109
(arg->string a1) ", "
110-
(arg->string a2))]
110+
(arg->string a2))]
111111
[(Cmp a1 a2)
112112
(string-append tab "cmp "
113113
(arg->string a1) ", "
@@ -120,21 +120,35 @@
120120
(string-append tab "sar "
121121
(arg->string a1) ", "
122122
(arg->string a2))]
123+
[(Shl a1 a2)
124+
(string-append tab "shl "
125+
(arg->string a1) ", "
126+
(arg->string a2))]
127+
[(Shr a1 a2)
128+
(string-append tab "shr "
129+
(arg->string a1) ", "
130+
(arg->string a2))]
123131
[(And a1 a2)
124132
(string-append tab "and "
125133
(arg->string a1) ", "
126134
(arg->string a2))]
127135
[(Or a1 a2)
128136
(string-append tab "or "
129137
(arg->string a1) ", "
130-
(arg->string a2))]
138+
(arg->string a2))]
131139
[(Xor a1 a2)
132140
(string-append tab "xor "
133141
(arg->string a1) ", "
134142
(arg->string a2))]
135143
[(Jmp l)
136144
(string-append tab "jmp "
137145
(jump-target->string l))]
146+
[(Jz l)
147+
(string-append tab "jz "
148+
(jump-target->string l))]
149+
[(Jnz l)
150+
(string-append tab "jnz "
151+
(jump-target->string l))]
138152
[(Je l)
139153
(string-append tab "je "
140154
(jump-target->string l))]
@@ -165,6 +179,14 @@
165179
[(Jnc l)
166180
(string-append tab "jnc "
167181
(jump-target->string l))]
182+
[(Cmovz dst src)
183+
(string-append tab "cmovz "
184+
(reg->string dst) ", "
185+
(arg->string src))]
186+
[(Cmovnz dst src)
187+
(string-append tab "cmovnz "
188+
(reg->string dst) ", "
189+
(arg->string src))]
168190
[(Cmove dst src)
169191
(string-append tab "cmove "
170192
(reg->string dst) ", "
@@ -211,13 +233,13 @@
211233
[(Push a)
212234
(string-append tab "push "
213235
(arg->string a))]
236+
[(Pop r)
237+
(string-append tab "pop "
238+
(reg->string r))]
214239
[(Pushf)
215240
(string-append tab "pushf")]
216241
[(Popf)
217242
(string-append tab "popf")]
218-
[(Pop r)
219-
(string-append tab "pop "
220-
(reg->string r))]
221243
[(Lea d (? offset? x))
222244
(string-append tab "lea "
223245
(arg->string d) ", "

0 commit comments

Comments
 (0)