Skip to content

Commit a520c45

Browse files
committed
Fix up error message for mov when imm is too big (suggesting going through a register doesn't make sense; the imm was bigger than 64-bits).
1 parent 6c5fc43 commit a520c45

1 file changed

Lines changed: 21 additions & 8 deletions

File tree

langs/a86/ast.rkt

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,33 @@
4545
(error n "expects register; given ~v" a1))
4646
a1))
4747

48-
(define (check:src-dest width)
48+
(define check:src-dest
4949
(λ (a1 a2 n)
5050
(unless (or (register? a1) (offset? a1))
5151
(error n "expects register or offset; given ~v" a1))
5252
(unless (or (register? a2) (offset? a2) (exact-integer? a2) (Const? a2))
5353
(error n "expects register, offset, exact integer, or defined constant; given ~v" a2))
5454
(when (and (offset? a1) (offset? a2))
5555
(error n "cannot use two memory locations; given ~v, ~v" a1 a2))
56-
(when (and (exact-integer? a2) (> (integer-length a2) width))
57-
(error n "literal must not exceed ~v-bits; given ~v (~v bits); go through a register instead" width a2 (integer-length a2)))
56+
(when (and (exact-integer? a2) (> (integer-length a2) 32))
57+
(error n "literal must not exceed 32-bits; given ~v (~v bits); go through a register instead" a2 (integer-length a2)))
5858
(when (and (offset? a1) (exact-integer? a2))
5959
(error n "cannot use a memory locations and literal; given ~v, ~v; go through a register instead" a1 a2))
6060
(values a1 a2)))
6161

62+
(define check:mov
63+
(λ (a1 a2 n)
64+
(unless (or (register? a1) (offset? a1))
65+
(error n "expects register or offset; given ~v" a1))
66+
(unless (or (register? a2) (offset? a2) (exact-integer? a2) (Const? a2))
67+
(error n "expects register, offset, exact integer, or defined constant; given ~v" a2))
68+
(when (and (offset? a1) (offset? a2))
69+
(error n "cannot use two memory locations; given ~v, ~v" a1 a2))
70+
(when (and (exact-integer? a2) (> (integer-length a2) 64))
71+
(error n "literal must not exceed 64-bits; given ~v (~v bits)" a2 (integer-length a2)))
72+
(when (and (offset? a1) (exact-integer? a2))
73+
(error n "cannot use a memory locations and literal; given ~v, ~v; go through a register instead" a1 a2))
74+
(values a1 a2)))
6275

6376
(define check:shift
6477
(λ (a1 a2 n)
@@ -133,20 +146,20 @@
133146
(instruct Label (x) check:label-symbol)
134147
(instruct Call (x) check:target)
135148
(instruct Ret () check:none)
136-
(instruct Mov (dst src) (check:src-dest 64))
149+
(instruct Mov (dst src) check:mov)
137150
(instruct Add (dst src) check:arith)
138151
(instruct Sub (dst src) check:arith)
139-
(instruct Cmp (a1 a2) (check:src-dest 32))
152+
(instruct Cmp (a1 a2) check:src-dest)
140153
(instruct Jmp (x) check:target)
141154
(instruct Je (x) check:target)
142155
(instruct Jne (x) check:target)
143156
(instruct Jl (x) check:target)
144157
(instruct Jle (x) check:target)
145158
(instruct Jg (x) check:target)
146159
(instruct Jge (x) check:target)
147-
(instruct And (dst src) (check:src-dest 32))
148-
(instruct Or (dst src) (check:src-dest 32))
149-
(instruct Xor (dst src) (check:src-dest 32))
160+
(instruct And (dst src) check:src-dest)
161+
(instruct Or (dst src) check:src-dest)
162+
(instruct Xor (dst src) check:src-dest)
150163
(instruct Sal (dst i) check:shift)
151164
(instruct Sar (dst i) check:shift)
152165
(instruct Push (a1) check:push)

0 commit comments

Comments
 (0)