From 1ac09dc704d199bb680b9b5939907ec828b5a61e Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Tue, 19 Oct 2021 13:41:29 -0700 Subject: Use disp8 when possible for memarg. --- test/test.sh | 1 + 1 file changed, 1 insertion(+) (limited to 'test/test.sh') diff --git a/test/test.sh b/test/test.sh index 152ea2b..ecf5ce1 100644 --- a/test/test.sh +++ b/test/test.sh @@ -43,6 +43,7 @@ t "callq *%rax" t "callq *%r10" t "callq *(%r10)" t "movb %r11b, (%rsi, %r12, 1)" +t "mov %rdi, -0x60(%rbp)" for r in rax r10 do -- cgit v1.2.3 From aa8a1c835b392023d2551257ee02951e43ee27db Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Tue, 19 Oct 2021 13:44:45 -0700 Subject: Use small immediates when possible for imul. --- asm.peg | 12 ++++++------ test/test.sh | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'test/test.sh') 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 -- cgit v1.2.3