summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2008-10-07 11:26:41 -0700
committerH. Peter Anvin <hpa@zytor.com>2008-10-07 11:26:41 -0700
commit65feb5ae3376d02c6ac89b6e58a3e802da6a222e (patch)
treef2e144399bbed8030eb7ad10ef2020bd2eb6a9b7
parent37c6d166d266b04fca3c384d00ad7576282ee583 (diff)
downloadnasm-65feb5ae3376d02c6ac89b6e58a3e802da6a222e.tar.gz
Add missing IMUL pattern: reg64,imm8
Make "imul rax,byte 5" work as expected. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r--insns.dat1
-rw-r--r--test/imul.asm89
2 files changed, 90 insertions, 0 deletions
diff --git a/insns.dat b/insns.dat
index 15c63fa9..2aebe54f 100644
--- a/insns.dat
+++ b/insns.dat
@@ -569,6 +569,7 @@ IMUL reg32,imm8 \321\1\x6B\100\15 386
IMUL reg32,sbyte32 \321\1\x6B\100\15 386,SM,ND
IMUL reg32,imm32 \321\1\x69\100\41 386
IMUL reg32,imm \321\155\x69\100\151 386,SM,ND
+IMUL reg64,imm8 \324\1\x6B\100\15 X64
IMUL reg64,sbyte64 \324\1\x6B\100\15 X64,SM,ND
IMUL reg64,imm32 \324\1\x69\100\255 X64
IMUL reg64,imm \324\155\x69\100\251 X64,SM,ND
diff --git a/test/imul.asm b/test/imul.asm
new file mode 100644
index 00000000..5b0a8eac
--- /dev/null
+++ b/test/imul.asm
@@ -0,0 +1,89 @@
+;Testname=test; Arguments=-fbin -oimul.bin; Files=stdout stderr imul.bin
+
+%macro test 1-2 5
+ bits %1
+
+%undef MEM
+%if %1 == 16
+ %define MEM [di]
+%elif %1 == 32
+ %define MEM [edi]
+%elif %1 == 64
+ %define MEM [rdi]
+%endif
+
+ imul al
+ imul byte MEM
+ imul ax
+ imul word MEM
+ imul eax
+ imul dword MEM
+%if %1 == 64
+ imul rdx
+ imul qword MEM
+%endif
+
+ imul ax,cx
+ imul ax,MEM
+ imul ax,word MEM
+ imul eax,ecx
+ imul eax,MEM
+ imul eax,dword MEM
+%if %1 == 64
+ imul rax,rcx
+ imul rax,MEM
+ imul rax,qword MEM
+%endif
+
+ imul ax,cx,%2
+ imul ax,cx,byte %2
+ imul ax,MEM,%2
+ imul ax,word MEM,%2
+ imul eax,ecx,%2
+ imul eax,ecx,byte %2
+ imul eax,MEM,%2
+ imul eax,dword MEM,%2
+%if %1 == 64
+ imul rax,rcx,%2
+ imul rax,rcx,byte %2
+ imul rax,MEM,%2
+ imul rax,qword MEM,%2
+%endif
+
+ imul ax,%2
+ imul ax,byte %2
+ imul eax,%2
+ imul eax,byte %2
+%if %1 == 64
+ imul rax,%2
+; imul rax,byte %2 ; ERROR
+%endif
+
+ imul ax,cx,0x1234
+ imul ax,MEM,0x1234
+ imul ax,word MEM,0x1234
+ imul eax,ecx,0x12345678
+ imul eax,MEM,0x12345678
+ imul eax,dword MEM,0x12345678
+%if %1 == 64
+ imul rax,rcx,0x12345678
+ imul rax,MEM,0x12345678
+ imul rax,qword MEM,0x12345678
+%endif
+
+ imul ax,0x1234
+ imul eax,0x12345678
+%if %1 == 64
+ imul rax,0x12345678
+%endif
+%endmacro
+
+ test 16
+ test 32
+ test 64
+
+%ifdef WARN
+ test 16,0x999
+ test 32,0x999999
+ test 64,0x999999999
+%endif