Skip to content

Commit f2bef67

Browse files
authored
Merge pull request #37 from laelath/arith-op-immediate-widths
Disallow immediate values that are too many bits
2 parents e01e3fd + a2511ac commit f2bef67

2 files changed

Lines changed: 30 additions & 10 deletions

File tree

a86/ast.rkt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,12 @@
6161
(error n "expects register; given ~v" a1))
6262
(unless (or (exact-integer? a2) (register? a2) (offset? a2))
6363
(error n "expects exact integer, register, or offset; given ~v" a2))
64-
(when (and (exact-integer? a2) (> (integer-size a2) 32))
65-
(error n "literal must not exceed 32-bits; given ~v (~v bits); go through a register instead" a2 (integer-size a2)))
64+
(when (and (register? a1) (exact-integer? a2) (> (integer-size a2) (register-size a1)))
65+
(error n "literal must not exceed register size (~v-bits); given ~v (~v bits)"
66+
(register-size a1) a2 (integer-size a2)))
67+
(when (and (register? a1) (= (register-size a1) 64) (exact-integer? a2) (> (integer-length a2) 31))
68+
(error n "literal must not exceed 32-bits signed; given ~v (~v bits signed); go through a register instead"
69+
a2 (add1 (integer-length a2))))
6670
(when (and (register? a1) (register? a2) (not (= (register-size a1) (register-size a2))))
6771
(error n "cannot move between registers of unequal size; given ~v (~v-bit), ~v (~v-bit)"
6872
a1 (register-size a1)
@@ -83,8 +87,12 @@
8387
(error n "expects register, offset, exact integer, or defined constant; given ~v" a2))
8488
(when (and (offset? a1) (offset? a2))
8589
(error n "cannot use two memory locations; given ~v, ~v" a1 a2))
86-
(when (and (exact-integer? a2) (> (integer-size a2) 32))
87-
(error n "literal must not exceed 32-bits; given ~v (~v bits); go through a register instead" a2 (integer-size a2)))
90+
(when (and (register? a1) (exact-integer? a2) (> (integer-size a2) (register-size a1)))
91+
(error n "literal must not exceed register size (~v-bits); given ~v (~v bits)"
92+
(register-size a1) a2 (integer-size a2)))
93+
(when (and (register? a1) (= (register-size a1) 64) (exact-integer? a2) (> (integer-length a2) 31))
94+
(error n "literal must not exceed 32-bits signed; given ~v (~v bits signed); go through a register instead"
95+
a2 (add1 (integer-length a2))))
8896
(when (and (offset? a1) (exact-integer? a2))
8997
(error n "cannot use a memory locations and literal; given ~v, ~v; go through a register instead" a1 a2))
9098
(when (and (register? a1) (register? a2) (not (= (register-size a1) (register-size a2))))

a86/test/errors.rkt

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,50 @@
1010
(check-not-exn (thunk (Mov 'rax (- (expt 2 63)))))
1111
(check-exn exn:fail? (thunk (Cmp 'rax (expt 2 32))))
1212
(check-exn exn:fail? (thunk (Cmp 'rax (- (add1 (expt 2 31))))))
13-
(check-not-exn (thunk (Cmp 'rax (sub1 (expt 2 32)))))
13+
(check-not-exn (thunk (Cmp 'rax (sub1 (expt 2 31)))))
1414
(check-not-exn (thunk (Cmp 'rax (- (expt 2 31)))))
1515
(check-exn exn:fail? (thunk (And 'rax (expt 2 32))))
1616
(check-exn exn:fail? (thunk (And 'rax (- (add1 (expt 2 31))))))
17-
(check-not-exn (thunk (And 'rax (sub1 (expt 2 32)))))
17+
(check-not-exn (thunk (And 'rax (sub1 (expt 2 31)))))
1818
(check-not-exn (thunk (And 'rax (- (expt 2 31)))))
1919
(check-exn exn:fail? (thunk (Or 'rax (expt 2 32))))
2020
(check-exn exn:fail? (thunk (Or 'rax (- (add1 (expt 2 31))))))
21-
(check-not-exn (thunk (Or 'rax (sub1 (expt 2 32)))))
21+
(check-not-exn (thunk (Or 'rax (sub1 (expt 2 31)))))
2222
(check-not-exn (thunk (Or 'rax (- (expt 2 31)))))
2323
(check-exn exn:fail? (thunk (Xor 'rax (expt 2 32))))
2424
(check-exn exn:fail? (thunk (Xor 'rax (- (add1 (expt 2 31))))))
25-
(check-not-exn (thunk (Xor 'rax (sub1 (expt 2 32)))))
25+
(check-not-exn (thunk (Xor 'rax (sub1 (expt 2 31)))))
2626
(check-not-exn (thunk (Xor 'rax (- (expt 2 31)))))
2727
(check-exn exn:fail? (thunk (Push (expt 2 32))))
2828
(check-exn exn:fail? (thunk (Push (- (add1 (expt 2 31))))))
2929
(check-not-exn (thunk (Push (sub1 (expt 2 32)))))
3030
(check-not-exn (thunk (Push (- (expt 2 31)))))
3131
(check-exn exn:fail? (thunk (Add 'rax (expt 2 32))))
3232
(check-exn exn:fail? (thunk (Add 'rax (- (add1 (expt 2 31))))))
33-
(check-not-exn (thunk (Add 'rax (sub1 (expt 2 32)))))
33+
(check-not-exn (thunk (Add 'rax (sub1 (expt 2 31)))))
3434
(check-not-exn (thunk (Add 'rax (- (expt 2 31)))))
3535
(check-exn exn:fail? (thunk (Sub 'rax (expt 2 32))))
3636
(check-exn exn:fail? (thunk (Sub 'rax (- (add1 (expt 2 31))))))
37-
(check-not-exn (thunk (Sub 'rax (sub1 (expt 2 32)))))
37+
(check-not-exn (thunk (Sub 'rax (sub1 (expt 2 31)))))
3838
(check-not-exn (thunk (Sub 'rax (- (expt 2 31)))))
3939

4040
;; Checking literal widths with sub-64-bit registers
4141
(check-exn exn:fail? (thunk (Mov 'eax (expt 2 32))))
4242
(check-not-exn (thunk (Mov 'eax (sub1 (expt 2 32)))))
4343
(check-exn exn:fail? (thunk (Mov 'al (expt 2 8))))
4444
(check-not-exn (thunk (Mov 'al (sub1 (expt 2 8)))))
45+
(check-not-exn (thunk (Cmp 'eax (sub1 (expt 2 31)))))
46+
(check-exn exn:fail? (thunk (Cmp 'al (expt 2 8))))
47+
(check-not-exn (thunk (And 'eax (sub1 (expt 2 31)))))
48+
(check-exn exn:fail? (thunk (And 'al (expt 2 8))))
49+
(check-not-exn (thunk (Or 'eax (sub1 (expt 2 31)))))
50+
(check-exn exn:fail? (thunk (Or 'al (expt 2 8))))
51+
(check-not-exn (thunk (Xor 'eax (sub1 (expt 2 31)))))
52+
(check-exn exn:fail? (thunk (Xor 'al (expt 2 8))))
53+
(check-not-exn (thunk (Add 'eax (sub1 (expt 2 31)))))
54+
(check-exn exn:fail? (thunk (Add 'al (expt 2 8))))
55+
(check-not-exn (thunk (Sub 'eax (sub1 (expt 2 31)))))
56+
(check-exn exn:fail? (thunk (Sub 'al (expt 2 8))))
4557

4658
;; Check prog
4759
(check-exn exn:fail? (thunk (prog (Ret))))

0 commit comments

Comments
 (0)