|
132 | 132 | (λ (a dst x n) |
133 | 133 | (unless (register? dst) |
134 | 134 | (error n "expects register; given ~v" dst)) |
135 | | - (unless (exp? x) |
| 135 | + (unless (or (exp? x) (Mem? x)) |
136 | 136 | (error n "expects memory expression; given ~v" x)) |
137 | 137 | (values a (arg-normalize dst) (arg-normalize x)))) |
138 | 138 |
|
|
303 | 303 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
304 | 304 | ;; Effective Addresses |
305 | 305 |
|
306 | | -(provide Mem Mem? displacement?) |
| 306 | +(provide Mem Mem?) |
307 | 307 |
|
308 | 308 | ;; 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, |
311 | 311 | ;; index cannot be 'rsp |
312 | 312 |
|
313 | 313 | ;; type Scale = 1 | 2 | 4 | 8 |
314 | 314 |
|
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)])) |
356 | 338 |
|
357 | 339 | (define (scale? x) |
358 | 340 | (memq x '(1 2 4 8))) |
359 | 341 |
|
360 | | -(struct %mem (disp base index scale) |
| 342 | +(struct %mem (label off base index scale) |
361 | 343 | #:reflection-name 'Mem |
362 | 344 | #:transparent |
363 | 345 | #: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)) |
369 | 351 | (when (and base (not (register? base))) |
370 | 352 | (error name "base must be a register or #f, given ~v" base)) |
371 | 353 | (when (and index (not (register? index))) |
372 | 354 | (error name "index must be a register (other than rsp) or #f, given ~v" index)) |
373 | 355 | (when (and scale (not (scale? scale))) |
374 | 356 | (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")) |
375 | 359 | (when (eq? index 'rsp) |
376 | 360 | (error name "index cannot be rsp")) |
377 | | - (values disp base index scale))) |
| 361 | + (values label off base index scale))) |
378 | 362 |
|
379 | 363 | (define Mem? %mem?) |
380 | 364 |
|
381 | 365 | (define-match-expander Mem |
382 | 366 | (λ (stx) |
383 | 367 | (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)])) |
385 | 369 | (λ (stx) |
386 | 370 | (syntax-case stx () |
387 | 371 | [m (identifier? #'m) #'make-Mem] |
|
0 commit comments