Skip to content

Commit e93b286

Browse files
authored
Rework Mem. (#27)
1 parent fb53a02 commit e93b286

File tree

2 files changed

+53
-71
lines changed

2 files changed

+53
-71
lines changed

a86/ast.rkt

Lines changed: 37 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
(λ (a dst x n)
133133
(unless (register? dst)
134134
(error n "expects register; given ~v" dst))
135-
(unless (exp? x)
135+
(unless (or (exp? x) (Mem? x))
136136
(error n "expects memory expression; given ~v" x))
137137
(values a (arg-normalize dst) (arg-normalize x))))
138138

@@ -303,85 +303,69 @@
303303
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
304304
;; Effective Addresses
305305

306-
(provide Mem Mem? displacement?)
306+
(provide Mem Mem?)
307307

308308
;; type Mem =
309-
;; | (Mem [Maybe Disp] [Maybe Register] [Maybe Register] [Maybe Scale])
310-
;; where at least one of disp, base, or index must be given,
309+
;; | (Mem [Maybe Label] [Maybe Integer] [Maybe Register] [Maybe Register] [Maybe Scale])
310+
;; where at least one of label, base, or index must be given,
311311
;; index cannot be 'rsp
312312

313313
;; type Scale = 1 | 2 | 4 | 8
314314

315-
;; type Disp =
316-
;; | Label
317-
;; | (Plus Label Integer)
318-
319-
(define (displacement? x)
320-
(and (normalize-disp x) #t))
321-
322-
(define (normalize-disp d)
323-
(match d
324-
[($ _) d]
325-
[(? label?) ($ d)]
326-
[(? integer?) d]
327-
[(Plus ($ _) (? integer? i)) d]
328-
[(Plus (? label? l) (? integer? i)) (Plus ($ l) i)]
329-
[_ #f]))
330-
331-
(define make-Mem
332-
(case-lambda
333-
[(d b i s) (%mem (normalize-disp d) b i s)]
334-
[(x)
335-
(match x
336-
[(? register? r) (make-Mem #f r #f #f)]
337-
[(? displacement? d) (make-Mem d #f #f #f)]
338-
[_
339-
(error 'Mem "unknown argument type, given ~a" x)])]
340-
[(x y)
341-
(match* (x y)
342-
[((? register?) (? register?))
343-
(make-Mem #f x y #f)]
344-
[((? displacement?) (? register?))
345-
(make-Mem x y #f #f)]
346-
[(_ _) (error 'Mem "unknown argument type, given ~a ~a" x y)])]
347-
[(x y z)
348-
(match* (x y z)
349-
[((? register?) (? register?) (? scale?))
350-
(make-Mem #f x y z)]
351-
[((? displacement?) (? register?) (? scale?))
352-
(make-Mem x #f y z)]
353-
[((? register?) (? register?) (? scale?))
354-
(make-Mem #f x y z)]
355-
[(_ _ _) (error 'Mem "unknown argument type, given ~a ~a ~a" x y z)])]))
315+
(define (make-Mem . args)
316+
(match args
317+
[(list (? exact-integer? o) (? register? r))
318+
(%mem #f o r #f #f)]
319+
[(list (? register? r))
320+
(%mem #f #f r #f #f)]
321+
[(list (? register? r1) (? register? r2))
322+
(%mem #f #f r1 r2 #f)]
323+
[(list (or (? label? l) ($ l)))
324+
(%mem ($ l) #f #f #f #f)]
325+
[(list (? register? r) (? exact-integer? o))
326+
(%mem #f o r #f #f)]
327+
[(list (or (? label? l) ($ l)) (? exact-integer? o))
328+
(%mem ($ l) o #f #f #f)]
329+
330+
[(list (or (? label? l) ($ l))
331+
(? exact-integer? o)
332+
(? register? r1)
333+
(? register? r2)
334+
(? integer? s))
335+
(%mem ($ l) o r1 r2 s)]
336+
[_
337+
(error 'Mem "bad args: ~a" args)]))
356338

357339
(define (scale? x)
358340
(memq x '(1 2 4 8)))
359341

360-
(struct %mem (disp base index scale)
342+
(struct %mem (label off base index scale)
361343
#:reflection-name 'Mem
362344
#:transparent
363345
#:guard
364-
(λ (disp base index scale name)
365-
(when (and disp (not (displacement? disp)))
366-
(error name "displacement must be a displacement or #f, given ~v" disp))
367-
(when (not (or disp base index))
368-
(error name "must have at least one of displacement, base, or index"))
346+
(λ (label off base index scale name)
347+
(when (and label (not ($? label)))
348+
(error name "label must be a label or #f, given ~v" label))
349+
(when (and off (not (exact-integer? off)))
350+
(error name "offset must be an exact integer or #f, given ~v" off))
369351
(when (and base (not (register? base)))
370352
(error name "base must be a register or #f, given ~v" base))
371353
(when (and index (not (register? index)))
372354
(error name "index must be a register (other than rsp) or #f, given ~v" index))
373355
(when (and scale (not (scale? scale)))
374356
(error name "scale must be 1,2,4,8 or #f, given ~v" scale))
357+
(when (not (or label base index))
358+
(error name "must have at least one of label, base, or index"))
375359
(when (eq? index 'rsp)
376360
(error name "index cannot be rsp"))
377-
(values disp base index scale)))
361+
(values label off base index scale)))
378362

379363
(define Mem? %mem?)
380364

381365
(define-match-expander Mem
382366
(λ (stx)
383367
(syntax-case stx ()
384-
[(_ d b i s) #'(%mem d b i s)]))
368+
[(_ l o b i s) #'(%mem l o b i s)]))
385369
(λ (stx)
386370
(syntax-case stx ()
387371
[m (identifier? #'m) #'make-Mem]

a86/printer.rkt

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,34 +58,24 @@
5858
;; Mem -> String
5959
(define (mem->string m)
6060
(define (x->string x)
61-
(cond [(displacement? x) (displacement->string x)]
62-
[(symbol? x) (symbol->string x)]))
61+
(match x
62+
[(? integer?) (number->string x)]
63+
[(? symbol?) (symbol->string x)]
64+
[($ x) (label-symbol->string x)]))
6365
(match m
64-
[(Mem d b i s)
66+
[(Mem l o b i s)
6567
(string-append
66-
"["
67-
(apply string-append (add-between (map x->string (filter identity (list d b i))) " + "))
68+
(apply string-append (add-between (map x->string (filter identity (list l o b i))) " + "))
6869
(match s
6970
[#f ""]
7071
[1 ""]
71-
[i (string-append " * " (number->string i))])
72-
"]")]))
73-
74-
(define (displacement->string d)
75-
(match d
76-
[(? integer?) (number->string d)]
77-
[(or (Plus ($ l) 0) ($ l))
78-
(label-symbol->string l)]
79-
[(Plus ($ l) i)
80-
(string-append (label-symbol->string l)
81-
" + "
82-
(number->string i))]))
72+
[i (string-append " * " (number->string i))]))]))
8373

8474
;; Exp ∪ Reg ∪ Offset -> String
8575
(define (arg->string e)
8676
(match e
8777
[(? register?) (symbol->string e)]
88-
[(? Mem?) (mem->string e)]
78+
[(? Mem?) (string-append "[" (mem->string e) "]")]
8979
[(Offset e)
9080
(string-append "[" (exp->string e) "]")]
9181
[_ (exp->string e)]))
@@ -122,6 +112,10 @@
122112
[(Data n) (string-append tab (data-section n))]
123113
[(Extern ($ l)) (string-append tab "extern " (extern-label-decl-symbol->string l))]
124114
[(Label ($ l)) (string-append (label-symbol->string l) ":")]
115+
[(Lea d (? Mem? m))
116+
(string-append tab "lea "
117+
(arg->string d) ", [rel "
118+
(mem->string m) "]")]
125119
[(Lea d e)
126120
(string-append tab "lea "
127121
(arg->string d) ", [rel "
@@ -131,6 +125,10 @@
131125
(symbol->string x)
132126
" equ "
133127
(number->string c))]
128+
[(Dq (? Mem? m))
129+
(string-append tab "dq " (mem->string m))]
130+
[(Dd (? Mem? m))
131+
(string-append tab "dd " (mem->string m))]
134132
[(Db (? bytes? bs))
135133
(apply string-append tab "db " (add-between (map number->string (bytes->list bs)) ", "))]
136134
[_ (common-instruction->string i)]))

0 commit comments

Comments
 (0)