aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Forney <[email protected]>2021-10-19 13:44:45 -0700
committerMichael Forney <[email protected]>2021-10-19 13:44:45 -0700
commitaa8a1c835b392023d2551257ee02951e43ee27db (patch)
tree1342cc8286c434b63551c2a33c3e12b0261c2419
parent1ac09dc704d199bb680b9b5939907ec828b5a61e (diff)
Use small immediates when possible for imul.
-rw-r--r--asm.peg12
-rw-r--r--test/test.sh1
2 files changed, 7 insertions, 6 deletions
diff --git a/asm.peg b/asm.peg
index 401c56b..4cabefa 100644
--- a/asm.peg
+++ b/asm.peg
@@ -256,13 +256,13 @@ imul = "imul" (
| 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x01000faf, s, d); }
| 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x01000faf, s, d); }
- | 'w'? ws i:imm16 ws? ',' ws? s:r16 ws? ',' ws? d:r16 { $$ = IMMREGREG2({.w=0}, 0x66, 0x69, i, s, d); }
- | 'l'? ws i:imm32 ws? ',' ws? s:r32 ws? ',' ws? d:r32 { $$ = IMMREGREG2({.w=0}, -1, 0x69, i, s, d); }
- | 'q'? ws i:imm32 ws? ',' ws? s:r64 ws? ',' ws? d:r64 { $$ = IMMREGREG2({.w=1}, -1, 0x69, i, s, d); }
+ | 'w'? ws i:imm16-8 ws? ',' ws? s:r16 ws? ',' ws? d:r16 { $$ = IMMREGREG2({.w=0}, 0x66, i.imm.nbytes == 1 ? 0x6b : 0x69, i, s, d); }
+ | 'l'? ws i:imm32-8 ws? ',' ws? s:r32 ws? ',' ws? d:r32 { $$ = IMMREGREG2({.w=0}, -1, i.imm.nbytes == 1 ? 0x6b : 0x69, i, s, d); }
+ | 'q'? ws i:imm32-8 ws? ',' ws? s:r64 ws? ',' ws? d:r64 { $$ = IMMREGREG2({.w=1}, -1, i.imm.nbytes == 1 ? 0x6b : 0x69, i, s, d); }
- | 'w'? ws i:imm16 ws? ',' ws? s:mem ws? ',' ws? d:r16 { $$ = IMMMEMREG({.w=0}, 0x66, 0x69, i, s, d); }
- | 'l'? ws i:imm32 ws? ',' ws? s:mem ws? ',' ws? d:r32 { $$ = IMMMEMREG({.w=0}, -1, 0x69, i, s, d); }
- | 'q'? ws i:imm32 ws? ',' ws? s:mem ws? ',' ws? d:r64 { $$ = IMMMEMREG({.w=1}, -1, 0x69, i, s, d); }
+ | 'w'? ws i:imm16-8 ws? ',' ws? s:mem ws? ',' ws? d:r16 { $$ = IMMMEMREG({.w=0}, 0x66, i.imm.nbytes == 1 ? 0x6b : 0x69, i, s, d); }
+ | 'l'? ws i:imm32-8 ws? ',' ws? s:mem ws? ',' ws? d:r32 { $$ = IMMMEMREG({.w=0}, -1, i.imm.nbytes == 1 ? 0x6b : 0x69, i, s, d); }
+ | 'q'? ws i:imm32-8 ws? ',' ws? s:mem ws? ',' ws? d:r64 { $$ = IMMMEMREG({.w=1}, -1, i.imm.nbytes == 1 ? 0x6b : 0x69, i, s, d); }
# Must come last due to peg ordering.
| 'b' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf6, 0x05, a); }
diff --git a/test/test.sh b/test/test.sh
index ecf5ce1..5536d61 100644
--- a/test/test.sh
+++ b/test/test.sh
@@ -44,6 +44,7 @@ t "callq *%r10"
t "callq *(%r10)"
t "movb %r11b, (%rsi, %r12, 1)"
t "mov %rdi, -0x60(%rbp)"
+t "imul \$0x28, %rbx, %rcx"
for r in rax r10
do