|
43 | 43 | (error n "expects register; given ~v" a1)) |
44 | 44 | (unless (or (exact-integer? a2) (register? a2) (offset? a2)) |
45 | 45 | (error n "expects exact integer, register, or offset; given ~v" a2)) |
| 46 | + (when (and (exact-integer? a2) (> (integer-length a2) 32)) |
| 47 | + (error n "literal must not exceed 32-bits; given ~v (~v bits); go through a register instead" a2 (integer-length a2))) |
46 | 48 | (values a1 a2))) |
47 | 49 |
|
48 | 50 | (define check:register |
|
59 | 61 | (error n "expects register, offset, exact integer, or defined constant; given ~v" a2)) |
60 | 62 | (when (and (offset? a1) (offset? a2)) |
61 | 63 | (error n "cannot use two memory locations; given ~v, ~v" a1 a2)) |
| 64 | + (when (and (exact-integer? a2) (> (integer-length a2) 32)) |
| 65 | + (error n "literal must not exceed 32-bits; given ~v (~v bits); go through a register instead" a2 (integer-length a2))) |
| 66 | + (when (and (offset? a1) (exact-integer? a2)) |
| 67 | + (error n "cannot use a memory locations and literal; given ~v, ~v; go through a register instead" a1 a2)) |
| 68 | + (values a1 a2))) |
| 69 | + |
| 70 | +(define check:mov |
| 71 | + (λ (a1 a2 n) |
| 72 | + (unless (or (register? a1) (offset? a1)) |
| 73 | + (error n "expects register or offset; given ~v" a1)) |
| 74 | + (unless (or (register? a2) (offset? a2) (exact-integer? a2) (Const? a2)) |
| 75 | + (error n "expects register, offset, exact integer, or defined constant; given ~v" a2)) |
| 76 | + (when (and (offset? a1) (offset? a2)) |
| 77 | + (error n "cannot use two memory locations; given ~v, ~v" a1 a2)) |
| 78 | + (when (and (exact-integer? a2) (> (integer-length a2) 64)) |
| 79 | + (error n "literal must not exceed 64-bits; given ~v (~v bits)" a2 (integer-length a2))) |
62 | 80 | (when (and (offset? a1) (exact-integer? a2)) |
63 | 81 | (error n "cannot use a memory locations and literal; given ~v, ~v; go through a register instead" a1 a2)) |
64 | 82 | (values a1 a2))) |
|
84 | 102 | (λ (a1 n) |
85 | 103 | (unless (or (exact-integer? a1) (register? a1)) |
86 | 104 | (error n "expects exact integer or register; given ~v" a1)) |
| 105 | + (when (and (exact-integer? a1) (> (integer-length a1) 32)) |
| 106 | + (error n "literal must not exceed 32-bits; given ~v (~v bits); go through a register instead" a1 (integer-length a1))) |
87 | 107 | a1)) |
88 | 108 |
|
89 | 109 | (define check:lea |
|
134 | 154 | (instruct Label (x) check:label-symbol) |
135 | 155 | (instruct Call (x) check:target) |
136 | 156 | (instruct Ret () check:none) |
137 | | -(instruct Mov (dst src) check:src-dest) |
| 157 | +(instruct Mov (dst src) check:mov) |
138 | 158 | (instruct Add (dst src) check:arith) |
139 | 159 | (instruct Sub (dst src) check:arith) |
140 | 160 | (instruct Cmp (a1 a2) check:src-dest) |
|
192 | 212 | (symbol? x) |
193 | 213 | (integer? x))) |
194 | 214 |
|
195 | | -(provide offset? register? instruction? label?) |
| 215 | +(provide offset? register? instruction? label? 64-bit-integer? 32-bit-integer?) |
196 | 216 |
|
197 | 217 | (define offset? Offset?) |
198 | 218 |
|
199 | 219 | (define (register? x) |
200 | 220 | (and (memq x '(cl eax rax rbx rcx rdx rbp rsp rsi rdi r8 r9 r10 r11 r12 r13 r14 r15)) |
201 | 221 | #t)) |
202 | 222 |
|
| 223 | +(define (64-bit-integer? x) |
| 224 | + (and (exact-integer? x) |
| 225 | + (<= (integer-length x) 64))) |
| 226 | + |
| 227 | +(define (32-bit-integer? x) |
| 228 | + (and (exact-integer? x) |
| 229 | + (<= (integer-length x) 32))) |
| 230 | + |
203 | 231 | (define (label? x) |
204 | 232 | (and (symbol? x) |
205 | 233 | (nasm-label? x) |
|
0 commit comments