]> granicus.if.org Git - yasm/commitdiff
* x86id.re: Implement string, protection, SSE2 instructions for GAS mode.
authorPeter Johnson <peter@tortall.net>
Wed, 5 Oct 2005 06:57:37 +0000 (06:57 -0000)
committerPeter Johnson <peter@tortall.net>
Wed, 5 Oct 2005 06:57:37 +0000 (06:57 -0000)
While we're here, add 64-bit register versions of SSE2 instructions movmskps,
pextrw, pinsrw, and pmovmskb that are documented by Intel but not AMD.

Add test for above.

svn path=/trunk/yasm/; revision=1265

modules/arch/x86/tests/gas64/Makefile.inc
modules/arch/x86/tests/gas64/gas-moreinsn.asm [new file with mode: 0644]
modules/arch/x86/tests/gas64/gas-moreinsn.errwarn [new file with mode: 0644]
modules/arch/x86/tests/gas64/gas-moreinsn.hex [new file with mode: 0644]
modules/arch/x86/x86id.re

index 8d87fd9a95c88bc265834ae2eae7a607ccc89f04..148f3f370e2881fdd6c277550f59d5d7083ca727 100644 (file)
@@ -15,6 +15,9 @@ EXTRA_DIST += modules/arch/x86/tests/gas64/gas-fp.hex
 EXTRA_DIST += modules/arch/x86/tests/gas64/gas-inout.asm
 EXTRA_DIST += modules/arch/x86/tests/gas64/gas-inout.errwarn
 EXTRA_DIST += modules/arch/x86/tests/gas64/gas-inout.hex
+EXTRA_DIST += modules/arch/x86/tests/gas64/gas-moreinsn.asm
+EXTRA_DIST += modules/arch/x86/tests/gas64/gas-moreinsn.errwarn
+EXTRA_DIST += modules/arch/x86/tests/gas64/gas-moreinsn.hex
 EXTRA_DIST += modules/arch/x86/tests/gas64/gas-movdq64.asm
 EXTRA_DIST += modules/arch/x86/tests/gas64/gas-movdq64.errwarn
 EXTRA_DIST += modules/arch/x86/tests/gas64/gas-movdq64.hex
diff --git a/modules/arch/x86/tests/gas64/gas-moreinsn.asm b/modules/arch/x86/tests/gas64/gas-moreinsn.asm
new file mode 100644 (file)
index 0000000..9e32183
--- /dev/null
@@ -0,0 +1,66 @@
+movsl
+movsq
+
+smovb
+smovw
+smovl
+smovq
+
+scasl
+scasq
+
+sscab
+sscaw
+sscal
+sscaq
+
+lgdtq 0
+lidtq 0
+lldtw 0
+
+ltrw 0
+
+sgdtq 0
+sidtq 0
+sldtw %ax
+sldtl %eax
+sldtq %rax
+smsww %ax
+smswl %eax
+smswq %rax
+
+cvtsi2ssl %eax, %xmm0
+cvtsi2ssq %rax, %xmm0
+cvtss2sil %xmm0, %eax
+cvtss2siq %xmm0, %rax
+cvttss2sil %xmm0, %eax
+cvttss2siq %xmm0, %rax
+
+movmskpsl %xmm0, %eax
+movmskpsq %xmm0, %rax
+
+pextrwl $5, %mm0, %eax
+pextrwq $10, %mm1, %rax
+pextrwl $5, %xmm0, %eax
+pextrwq $10, %xmm1, %rax
+
+pinsrwl $5, %eax, %mm0
+pinsrwq $10, %rax, %mm1
+pinsrwl $5, %eax, %xmm0
+pinsrwq $10, %rax, %xmm1
+
+pmovmskbl %mm0, %eax
+pmovmskbq %mm0, %rax
+pmovmskbl %xmm0, %eax
+pmovmskbq %xmm0, %rax
+
+cvtsi2sdl %eax, %xmm0
+cvtsi2sdq %rax, %xmm0
+
+cvttsd2sil %xmm0, %eax
+cvttsd2siq %xmm0, %rax
+
+fistps 0
+fistpl 0
+fistpq 0
+fistpll 0
diff --git a/modules/arch/x86/tests/gas64/gas-moreinsn.errwarn b/modules/arch/x86/tests/gas64/gas-moreinsn.errwarn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/modules/arch/x86/tests/gas64/gas-moreinsn.hex b/modules/arch/x86/tests/gas64/gas-moreinsn.hex
new file mode 100644 (file)
index 0000000..399c179
--- /dev/null
@@ -0,0 +1,720 @@
+7f 
+45 
+4c 
+46 
+02 
+01 
+01 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+01 
+00 
+3e 
+00 
+01 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+90 
+01 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+40 
+00 
+00 
+00 
+00 
+00 
+40 
+00 
+05 
+00 
+01 
+00 
+a5 
+48 
+a5 
+a4 
+66 
+a5 
+a5 
+48 
+a5 
+af 
+48 
+af 
+ae 
+66 
+af 
+af 
+48 
+af 
+0f 
+01 
+14 
+25 
+00 
+00 
+00 
+00 
+0f 
+01 
+1c 
+25 
+00 
+00 
+00 
+00 
+0f 
+00 
+14 
+25 
+00 
+00 
+00 
+00 
+0f 
+00 
+1c 
+25 
+00 
+00 
+00 
+00 
+0f 
+01 
+04 
+25 
+00 
+00 
+00 
+00 
+0f 
+01 
+0c 
+25 
+00 
+00 
+00 
+00 
+66 
+0f 
+00 
+c0 
+0f 
+00 
+c0 
+48 
+0f 
+00 
+c0 
+66 
+0f 
+01 
+e0 
+0f 
+01 
+e0 
+48 
+0f 
+01 
+e0 
+f3 
+0f 
+2a 
+c0 
+f3 
+48 
+0f 
+2a 
+c0 
+f3 
+0f 
+2d 
+c0 
+f3 
+48 
+0f 
+2d 
+c0 
+f3 
+0f 
+2c 
+c0 
+f3 
+48 
+0f 
+2c 
+c0 
+0f 
+50 
+c0 
+48 
+0f 
+50 
+c0 
+0f 
+c5 
+c0 
+05 
+48 
+0f 
+c5 
+c1 
+0a 
+66 
+0f 
+c5 
+c0 
+05 
+66 
+48 
+0f 
+c5 
+c1 
+0a 
+0f 
+c4 
+c0 
+05 
+48 
+0f 
+c4 
+c8 
+0a 
+66 
+0f 
+c4 
+c0 
+05 
+66 
+48 
+0f 
+c4 
+c8 
+0a 
+0f 
+d7 
+c0 
+48 
+0f 
+d7 
+c0 
+66 
+0f 
+d7 
+c0 
+66 
+48 
+0f 
+d7 
+c0 
+f2 
+0f 
+2a 
+c0 
+f2 
+48 
+0f 
+2a 
+c0 
+f2 
+0f 
+2c 
+c0 
+f2 
+48 
+0f 
+2c 
+c0 
+df 
+1c 
+25 
+00 
+00 
+00 
+00 
+db 
+1c 
+25 
+00 
+00 
+00 
+00 
+df 
+3c 
+25 
+00 
+00 
+00 
+00 
+df 
+3c 
+25 
+00 
+00 
+00 
+00 
+00 
+2e 
+74 
+65 
+78 
+74 
+00 
+2e 
+73 
+74 
+72 
+74 
+61 
+62 
+00 
+2e 
+73 
+79 
+6d 
+74 
+61 
+62 
+00 
+2e 
+73 
+68 
+73 
+74 
+72 
+74 
+61 
+62 
+00 
+00 
+00 
+00 
+00 
+2d 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+01 
+00 
+00 
+00 
+04 
+00 
+f1 
+ff 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+03 
+00 
+04 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+17 
+00 
+00 
+00 
+03 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+20 
+01 
+00 
+00 
+00 
+00 
+00 
+00 
+21 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+07 
+00 
+00 
+00 
+03 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+44 
+01 
+00 
+00 
+00 
+00 
+00 
+00 
+03 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+0f 
+00 
+00 
+00 
+02 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+48 
+01 
+00 
+00 
+00 
+00 
+00 
+00 
+48 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+02 
+00 
+00 
+00 
+03 
+00 
+00 
+00 
+08 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+18 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+01 
+00 
+00 
+00 
+01 
+00 
+00 
+00 
+06 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+40 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+e0 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+10 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
index 1735877f0bc585054ea0af0eda140f8da3df68f7..a21058c16c20c28e13a15fe72cefb0f9631f4537 100644 (file)
@@ -303,7 +303,8 @@ static const x86_insn_info onebyte_prefix_insn[] = {
 
 /* Two byte opcode instructions with no operands */
 static const x86_insn_info twobyte_insn[] = {
-    { CPU_Any, MOD_Op1Add|MOD_Op0Add, 0, 0, 0, 2, {0, 0, 0}, 0, 0, {0, 0, 0} }
+    { CPU_Any, MOD_Op1Add|MOD_Op0Add|MOD_GasSufL|MOD_GasSufQ, 0, 0, 0, 2,
+      {0, 0, 0}, 0, 0, {0, 0, 0} }
 };
 
 /* Three byte opcode instructions with no operands */
@@ -1348,32 +1349,32 @@ static const x86_insn_info arpl_insn[] = {
       {OPT_RM|OPS_16|OPS_Relaxed|OPA_EA, OPT_Reg|OPS_16|OPA_Spare, 0} }
 };
 static const x86_insn_info str_insn[] = {
-    { CPU_Hammer, 0, 16, 0, 0, 2, {0x0F, 0x00, 0}, 1, 1,
+    { CPU_Hammer, MOD_GasSufW, 16, 0, 0, 2, {0x0F, 0x00, 0}, 1, 1,
       {OPT_Reg|OPS_16|OPA_EA, 0, 0} },
-    { CPU_Hammer, 0, 32, 0, 0, 2, {0x0F, 0x00, 0}, 1, 1,
+    { CPU_Hammer, MOD_GasSufL, 32, 0, 0, 2, {0x0F, 0x00, 0}, 1, 1,
       {OPT_Reg|OPS_32|OPA_EA, 0, 0} },
-    { CPU_Hammer|CPU_64, 0, 64, 0, 0, 2, {0x0F, 0x00, 0}, 1, 1,
+    { CPU_Hammer|CPU_64, MOD_GasSufQ, 64, 0, 0, 2, {0x0F, 0x00, 0}, 1, 1,
       {OPT_Reg|OPS_64|OPA_EA, 0, 0} },
-    { CPU_286, MOD_Op1Add|MOD_SpAdd, 0, 0, 0, 2, {0x0F, 0x00, 0}, 0, 1,
-      {OPT_RM|OPS_16|OPS_Relaxed|OPA_EA, 0, 0} }
+    { CPU_286, MOD_Op1Add|MOD_SpAdd|MOD_GasSufW, 0, 0, 0, 2, {0x0F, 0x00, 0},
+      0, 1, {OPT_RM|OPS_16|OPS_Relaxed|OPA_EA, 0, 0} }
 };
 static const x86_insn_info prot286_insn[] = {
-    { CPU_286, MOD_Op1Add|MOD_SpAdd, 0, 0, 0, 2, {0x0F, 0x00, 0}, 0, 1,
-      {OPT_RM|OPS_16|OPS_Relaxed|OPA_EA, 0, 0} }
+    { CPU_286, MOD_Op1Add|MOD_SpAdd|MOD_GasSufW, 0, 0, 0, 2, {0x0F, 0x00, 0},
+      0, 1, {OPT_RM|OPS_16|OPS_Relaxed|OPA_EA, 0, 0} }
 };
 static const x86_insn_info sldtmsw_insn[] = {
-    { CPU_286, MOD_Op1Add|MOD_SpAdd, 0, 0, 0, 2, {0x0F, 0x00, 0}, 0, 1,
-      {OPT_Mem|OPS_16|OPS_Relaxed|OPA_EA, 0, 0} },
-    { CPU_386, MOD_Op1Add|MOD_SpAdd, 0, 0, 0, 2, {0x0F, 0x00, 0}, 0, 1,
-      {OPT_Mem|OPS_32|OPS_Relaxed|OPA_EA, 0, 0} },
-    { CPU_Hammer|CPU_64, MOD_Op1Add|MOD_SpAdd, 0, 0, 0, 2, {0x0F, 0x00, 0},
-      0, 1, {OPT_Mem|OPS_64|OPS_Relaxed|OPA_EA, 0, 0} },
-    { CPU_286, MOD_Op1Add|MOD_SpAdd, 16, 0, 0, 2, {0x0F, 0x00, 0}, 0, 1,
-      {OPT_Reg|OPS_16|OPA_EA, 0, 0} },
-    { CPU_386, MOD_Op1Add|MOD_SpAdd, 32, 0, 0, 2, {0x0F, 0x00, 0}, 0, 1,
-      {OPT_Reg|OPS_32|OPA_EA, 0, 0} },
-    { CPU_Hammer|CPU_64, MOD_Op1Add|MOD_SpAdd, 64, 0, 0, 2, {0x0F, 0x00, 0},
-      0, 1, {OPT_Reg|OPS_64|OPA_EA, 0, 0} }
+    { CPU_286, MOD_Op1Add|MOD_SpAdd|MOD_GasSufW, 0, 0, 0, 2, {0x0F, 0x00, 0},
+      0, 1, {OPT_Mem|OPS_16|OPS_Relaxed|OPA_EA, 0, 0} },
+    { CPU_386, MOD_Op1Add|MOD_SpAdd|MOD_GasSufL, 0, 0, 0, 2, {0x0F, 0x00, 0},
+      0, 1, {OPT_Mem|OPS_32|OPS_Relaxed|OPA_EA, 0, 0} },
+    { CPU_Hammer|CPU_64, MOD_Op1Add|MOD_SpAdd|MOD_GasSufQ, 0, 0, 0, 2,
+      {0x0F, 0x00, 0}, 0, 1, {OPT_Mem|OPS_64|OPS_Relaxed|OPA_EA, 0, 0} },
+    { CPU_286, MOD_Op1Add|MOD_SpAdd|MOD_GasSufW, 16, 0, 0, 2, {0x0F, 0x00, 0},
+      0, 1, {OPT_Reg|OPS_16|OPA_EA, 0, 0} },
+    { CPU_386, MOD_Op1Add|MOD_SpAdd|MOD_GasSufL, 32, 0, 0, 2, {0x0F, 0x00, 0},
+      0, 1, {OPT_Reg|OPS_32|OPA_EA, 0, 0} },
+    { CPU_Hammer|CPU_64, MOD_Op1Add|MOD_SpAdd|MOD_GasSufQ, 64, 0, 0, 2,
+      {0x0F, 0x00, 0}, 0, 1, {OPT_Reg|OPS_64|OPA_EA, 0, 0} }
 };
 
 /* Floating point instructions - load/store with pop (integer and normal) */
@@ -1645,32 +1646,40 @@ static const x86_insn_info cvt_xmm_xmm32_insn[] = {
     }
 };
 static const x86_insn_info cvt_rx_xmm64_insn[] = {
-    { CPU_SSE, MOD_PreAdd|MOD_Op1Add, 0, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_SSE, MOD_PreAdd|MOD_Op1Add|MOD_GasSufL, 0, 0, 0x00, 2,
+      {0x0F, 0x00, 0}, 0, 2,
       {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0}
     },
-    { CPU_SSE, MOD_PreAdd|MOD_Op1Add, 0, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_SSE, MOD_PreAdd|MOD_Op1Add|MOD_GasSufL, 0, 0, 0x00, 2,
+      {0x0F, 0x00, 0}, 0, 2,
       {OPT_Reg|OPS_32|OPA_Spare, OPT_Mem|OPS_64|OPS_Relaxed|OPA_EA, 0}
     },
     /* REX */
-    { CPU_SSE|CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add, 64, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_SSE|CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add|MOD_GasSufQ, 64, 0,
+      0x00, 2, {0x0F, 0x00, 0}, 0, 2,
       {OPT_Reg|OPS_64|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0}
     },
-    { CPU_SSE|CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add, 64, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_SSE|CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add|MOD_GasSufQ, 64, 0,
+      0x00, 2, {0x0F, 0x00, 0}, 0, 2,
       {OPT_Reg|OPS_64|OPA_Spare, OPT_Mem|OPS_64|OPS_Relaxed|OPA_EA, 0}
     }
 };
 static const x86_insn_info cvt_rx_xmm32_insn[] = {
-    { CPU_SSE, MOD_PreAdd|MOD_Op1Add, 0, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_SSE, MOD_PreAdd|MOD_Op1Add|MOD_GasSufL, 0, 0, 0x00, 2,
+      {0x0F, 0x00, 0}, 0, 2,
       {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0}
     },
-    { CPU_SSE, MOD_PreAdd|MOD_Op1Add, 0, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_SSE, MOD_PreAdd|MOD_Op1Add|MOD_GasSufL, 0, 0, 0x00, 2,
+      {0x0F, 0x00, 0}, 0, 2,
       {OPT_Reg|OPS_32|OPA_Spare, OPT_Mem|OPS_32|OPS_Relaxed|OPA_EA, 0}
     },
     /* REX */
-    { CPU_SSE|CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add, 64, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_SSE|CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add|MOD_GasSufQ, 64, 0,
+      0x00, 2, {0x0F, 0x00, 0}, 0, 2,
       {OPT_Reg|OPS_64|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0}
     },
-    { CPU_SSE|CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add, 64, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_SSE|CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add|MOD_GasSufQ, 64, 0,
+      0x00, 2, {0x0F, 0x00, 0}, 0, 2,
       {OPT_Reg|OPS_64|OPA_Spare, OPT_Mem|OPS_32|OPS_Relaxed|OPA_EA, 0}
     }
 };
@@ -1698,11 +1707,13 @@ static const x86_insn_info cvt_xmm_mm_ps_insn[] = {
     }
 };
 static const x86_insn_info cvt_xmm_rmx_insn[] = {
-    { CPU_SSE, MOD_PreAdd|MOD_Op1Add, 0, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_SSE, MOD_PreAdd|MOD_Op1Add|MOD_GasSufL, 0, 0, 0x00, 2,
+      {0x0F, 0x00, 0}, 0, 2,
       {OPT_SIMDReg|OPS_128|OPA_Spare, OPT_RM|OPS_32|OPS_Relaxed|OPA_EA, 0}
     },
     /* REX */
-    { CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add, 64, 0, 0x00, 2, {0x0F, 0x00, 0}, 0, 2,
+    { CPU_Hammer|CPU_64, MOD_PreAdd|MOD_Op1Add|MOD_GasSufQ, 64, 0, 0x00, 2,
+      {0x0F, 0x00, 0}, 0, 2,
       {OPT_SIMDReg|OPS_128|OPA_Spare, OPT_RM|OPS_64|OPS_Relaxed|OPA_EA, 0}
     }
 };
@@ -1758,8 +1769,10 @@ static const x86_insn_info movhlps_insn[] = {
       {OPT_Mem|OPS_64|OPS_Relaxed|OPA_EA, OPT_SIMDReg|OPS_128|OPA_Spare, 0} }
 };
 static const x86_insn_info movmskps_insn[] = {
-    { CPU_SSE, 0, 0, 0, 0, 2, {0x0F, 0x50, 0}, 0, 2,
-      {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0} }
+    { CPU_SSE, MOD_GasSufL, 0, 0, 0, 2, {0x0F, 0x50, 0}, 0, 2,
+      {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0} },
+    { CPU_Hammer|CPU_64, MOD_GasSufQ, 64, 0, 0, 2, {0x0F, 0x50, 0}, 0, 2,
+      {OPT_Reg|OPS_64|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0} }
 };
 static const x86_insn_info movntps_insn[] = {
     { CPU_SSE, 0, 0, 0, 0, 2, {0x0F, 0x2B, 0}, 0, 2,
@@ -1778,32 +1791,48 @@ static const x86_insn_info movss_insn[] = {
       {OPT_Mem|OPS_32|OPS_Relaxed|OPA_EA, OPT_SIMDReg|OPS_128|OPA_Spare, 0} }
 };
 static const x86_insn_info pextrw_insn[] = {
-    { CPU_P3|CPU_MMX, 0, 0, 0, 0, 2, {0x0F, 0xC5, 0}, 0, 3,
+    { CPU_P3|CPU_MMX, MOD_GasSufL, 0, 0, 0, 2, {0x0F, 0xC5, 0}, 0, 3,
       {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_64|OPA_EA,
        OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} },
-    { CPU_SSE2, 0, 0, 0, 0x66, 2, {0x0F, 0xC5, 0}, 0, 3,
+    { CPU_SSE2, MOD_GasSufL, 0, 0, 0x66, 2, {0x0F, 0xC5, 0}, 0, 3,
       {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA,
+       OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} },
+    { CPU_Hammer|CPU_64, MOD_GasSufQ, 64, 0, 0, 2, {0x0F, 0xC5, 0}, 0, 3,
+      {OPT_Reg|OPS_64|OPA_Spare, OPT_SIMDReg|OPS_64|OPA_EA,
+       OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} },
+    { CPU_Hammer|CPU_64, MOD_GasSufQ, 64, 0, 0x66, 2, {0x0F, 0xC5, 0}, 0, 3,
+      {OPT_Reg|OPS_64|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA,
        OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} }
 };
 static const x86_insn_info pinsrw_insn[] = {
-    { CPU_P3|CPU_MMX, 0, 0, 0, 0, 2, {0x0F, 0xC4, 0}, 0, 3,
+    { CPU_P3|CPU_MMX, MOD_GasSufL, 0, 0, 0, 2, {0x0F, 0xC4, 0}, 0, 3,
       {OPT_SIMDReg|OPS_64|OPA_Spare, OPT_Reg|OPS_32|OPA_EA,
        OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} },
-    { CPU_P3|CPU_MMX, 0, 0, 0, 0, 2, {0x0F, 0xC4, 0}, 0, 3,
+    { CPU_Hammer|CPU_64, MOD_GasSufQ, 64, 0, 0, 2, {0x0F, 0xC4, 0}, 0, 3,
+      {OPT_SIMDReg|OPS_64|OPA_Spare, OPT_Reg|OPS_64|OPA_EA,
+       OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} },
+    { CPU_P3|CPU_MMX, MOD_GasSufL, 0, 0, 0, 2, {0x0F, 0xC4, 0}, 0, 3,
       {OPT_SIMDReg|OPS_64|OPA_Spare, OPT_Mem|OPS_16|OPS_Relaxed|OPA_EA,
        OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} },
-    { CPU_SSE2, 0, 0, 0, 0x66, 2, {0x0F, 0xC4, 0}, 0, 3,
+    { CPU_SSE2, MOD_GasSufL, 0, 0, 0x66, 2, {0x0F, 0xC4, 0}, 0, 3,
       {OPT_SIMDReg|OPS_128|OPA_Spare, OPT_Reg|OPS_32|OPA_EA,
        OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} },
-    { CPU_SSE2, 0, 0, 0, 0x66, 2, {0x0F, 0xC4, 0}, 0, 3,
+    { CPU_Hammer|CPU_64, MOD_GasSufQ, 64, 0, 0x66, 2, {0x0F, 0xC4, 0}, 0, 3,
+      {OPT_SIMDReg|OPS_128|OPA_Spare, OPT_Reg|OPS_64|OPA_EA,
+       OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} },
+    { CPU_SSE2, MOD_GasSufL, 0, 0, 0x66, 2, {0x0F, 0xC4, 0}, 0, 3,
       {OPT_SIMDReg|OPS_128|OPA_Spare, OPT_Mem|OPS_16|OPS_Relaxed|OPA_EA,
        OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} }
 };
 static const x86_insn_info pmovmskb_insn[] = {
-    { CPU_P3|CPU_MMX, 0, 0, 0, 0, 2, {0x0F, 0xD7, 0}, 0, 2,
+    { CPU_P3|CPU_MMX, MOD_GasSufL, 0, 0, 0, 2, {0x0F, 0xD7, 0}, 0, 2,
       {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_64|OPA_EA, 0} },
-    { CPU_SSE2, 0, 0, 0, 0x66, 2, {0x0F, 0xD7, 0}, 0, 2,
-      {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0} }
+    { CPU_SSE2, MOD_GasSufL, 0, 0, 0x66, 2, {0x0F, 0xD7, 0}, 0, 2,
+      {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0} },
+    { CPU_Hammer|CPU_64, MOD_GasSufQ, 64, 0, 0, 2, {0x0F, 0xD7, 0}, 0, 2,
+      {OPT_Reg|OPS_64|OPA_Spare, OPT_SIMDReg|OPS_64|OPA_EA, 0} },
+    { CPU_Hammer|CPU_64, MOD_GasSufQ, 64, 0, 0x66, 2, {0x0F, 0xD7, 0}, 0, 2,
+      {OPT_Reg|OPS_64|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0} }
 };
 static const x86_insn_info pshufw_insn[] = {
     { CPU_P3|CPU_MMX, 0, 0, 0, 0, 2, {0x0F, 0x70, 0}, 0, 3,
@@ -1813,7 +1842,7 @@ static const x86_insn_info pshufw_insn[] = {
 
 /* SSE2 instructions */
 static const x86_insn_info cmpsd_insn[] = {
-    { CPU_Any, 0, 32, 0, 0, 1, {0xA7, 0, 0}, 0, 0, {0, 0, 0} },
+    { CPU_Any, MOD_GasIllegal, 32, 0, 0, 1, {0xA7, 0, 0}, 0, 0, {0, 0, 0} },
     { CPU_SSE2, 0, 0, 0, 0xF2, 2, {0x0F, 0xC2, 0}, 0, 3,
       {OPT_SIMDReg|OPS_128|OPA_Spare, OPT_SIMDRM|OPS_128|OPS_Relaxed|OPA_EA,
        OPT_Imm|OPS_8|OPS_Relaxed|OPA_Imm} }
@@ -1833,7 +1862,7 @@ static const x86_insn_info movhlpd_insn[] = {
       {OPT_Mem|OPS_64|OPS_Relaxed|OPA_EA, OPT_SIMDReg|OPS_128|OPA_Spare, 0} }
 };
 static const x86_insn_info movmskpd_insn[] = {
-    { CPU_SSE2, 0, 0, 0, 0x66, 2, {0x0F, 0x50, 0}, 0, 2,
+    { CPU_SSE2, MOD_GasSufL, 0, 0, 0x66, 2, {0x0F, 0x50, 0}, 0, 2,
       {OPT_Reg|OPS_32|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0} }
 };
 static const x86_insn_info movntpddq_insn[] = {
@@ -1841,7 +1870,7 @@ static const x86_insn_info movntpddq_insn[] = {
       {OPT_Mem|OPS_128|OPS_Relaxed|OPA_EA, OPT_SIMDReg|OPS_128|OPA_Spare, 0} }
 };
 static const x86_insn_info movsd_insn[] = {
-    { CPU_Any, 0, 32, 0, 0, 1, {0xA5, 0, 0}, 0, 0, {0, 0, 0} },
+    { CPU_Any, MOD_GasIllegal, 32, 0, 0, 1, {0xA5, 0, 0}, 0, 0, {0, 0, 0} },
     { CPU_SSE2, 0, 0, 0, 0xF2, 2, {0x0F, 0x10, 0}, 0, 2,
       {OPT_SIMDReg|OPS_128|OPA_Spare, OPT_SIMDReg|OPS_128|OPA_EA, 0} },
     { CPU_SSE2, 0, 0, 0, 0xF2, 2, {0x0F, 0x10, 0}, 0, 2,
@@ -3478,6 +3507,7 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
     int not64 = 0;
     int warn64 = 0;
     int suffix_ofs = -1;
+    char suffix_over = '\0';
 
     data[3] = 0;
 
@@ -3786,19 +3816,23 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        C M P S B { RET_INSN(5, onebyte, 0x00A6, CPU_Any); }
        C M P S W { RET_INSN(5, onebyte, 0x10A7, CPU_Any); }
        C M P S D { RET_INSN(5, cmpsd, 0, CPU_Any); }
+       C M P S L { RET_INSN_GAS(5, onebyte, 0x20A7, CPU_386); }
        C M P S Q {
            warn64 = 1;
            RET_INSN(5, onebyte, 0x40A7, CPU_Hammer|CPU_64);
        }
        I N S B { RET_INSN(4, onebyte, 0x006C, CPU_Any); }
        I N S W { RET_INSN(4, onebyte, 0x106D, CPU_Any); }
-       I N S D { RET_INSN(4, onebyte, 0x206D, CPU_386); }
+       I N S D { RET_INSN_NONGAS(4, onebyte, 0x206D, CPU_386); }
+       I N S L { RET_INSN_GAS(4, onebyte, 0x206D, CPU_386); }
        O U T S B { RET_INSN(5, onebyte, 0x006E, CPU_Any); }
        O U T S W { RET_INSN(5, onebyte, 0x106F, CPU_Any); }
-       O U T S D { RET_INSN(5, onebyte, 0x206F, CPU_386); }
+       O U T S D { RET_INSN_NONGAS(5, onebyte, 0x206F, CPU_386); }
+       O U T S L { RET_INSN_GAS(5, onebyte, 0x206F, CPU_386); }
        L O D S B { RET_INSN(5, onebyte, 0x00AC, CPU_Any); }
        L O D S W { RET_INSN(5, onebyte, 0x10AD, CPU_Any); }
-       L O D S D { RET_INSN(5, onebyte, 0x20AD, CPU_386); }
+       L O D S D { RET_INSN_NONGAS(5, onebyte, 0x20AD, CPU_386); }
+       L O D S L { RET_INSN_GAS(5, onebyte, 0x20AD, CPU_386); }
        L O D S Q {
            warn64 = 1;
            RET_INSN(5, onebyte, 0x40AD, CPU_Hammer|CPU_64);
@@ -3806,20 +3840,39 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        M O V S B { RET_INSN(5, onebyte, 0x00A4, CPU_Any); }
        M O V S W { RET_INSN(5, onebyte, 0x10A5, CPU_Any); }
        M O V S D { RET_INSN(5, movsd, 0, CPU_Any); }
+       M O V S L { RET_INSN_GAS(5, onebyte, 0x20A5, CPU_386); }
        M O V S Q {
            warn64 = 1;
            RET_INSN(5, onebyte, 0x40A5, CPU_Any);
        }
+       /* smov alias for movs in GAS mode */
+       S M O V B { RET_INSN_GAS(5, onebyte, 0x00A4, CPU_Any); }
+       S M O V W { RET_INSN_GAS(5, onebyte, 0x10A5, CPU_Any); }
+       S M O V L { RET_INSN_GAS(5, onebyte, 0x20A5, CPU_386); }
+       S M O V Q {
+           warn64 = 1;
+           RET_INSN_GAS(5, onebyte, 0x40A5, CPU_Any);
+       }
        S C A S B { RET_INSN(5, onebyte, 0x00AE, CPU_Any); }
        S C A S W { RET_INSN(5, onebyte, 0x10AF, CPU_Any); }
-       S C A S D { RET_INSN(5, onebyte, 0x20AF, CPU_386); }
+       S C A S D { RET_INSN_NONGAS(5, onebyte, 0x20AF, CPU_386); }
+       S C A S L { RET_INSN_GAS(5, onebyte, 0x20AF, CPU_386); }
        S C A S Q {
            warn64 = 1;
            RET_INSN(5, onebyte, 0x40AF, CPU_Hammer|CPU_64);
        }
+       /* ssca alias for scas in GAS mode */
+       S S C A B { RET_INSN_GAS(5, onebyte, 0x00AE, CPU_Any); }
+       S S C A W { RET_INSN_GAS(5, onebyte, 0x10AF, CPU_Any); }
+       S S C A L { RET_INSN_GAS(5, onebyte, 0x20AF, CPU_386); }
+       S S C A Q {
+           warn64 = 1;
+           RET_INSN_GAS(5, onebyte, 0x40AF, CPU_Hammer|CPU_64);
+       }
        S T O S B { RET_INSN(5, onebyte, 0x00AA, CPU_Any); }
        S T O S W { RET_INSN(5, onebyte, 0x10AB, CPU_Any); }
-       S T O S D { RET_INSN(5, onebyte, 0x20AB, CPU_386); }
+       S T O S D { RET_INSN_NONGAS(5, onebyte, 0x20AB, CPU_386); }
+       S T O S L { RET_INSN_GAS(5, onebyte, 0x20AB, CPU_386); }
        S T O S Q {
            warn64 = 1;
            RET_INSN(5, onebyte, 0x40AB, CPU_Hammer|CPU_64);
@@ -3861,19 +3914,19 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
            RET_INSN(4, arpl, 0, CPU_286|CPU_Prot);
        }
        L A R [wWlLqQ]? { RET_INSN(3, bsfr, 0x02, CPU_286|CPU_Prot); }
-       L G D T { RET_INSN(4, twobytemem, 0x020F01, CPU_286|CPU_Priv); }
-       L I D T { RET_INSN(4, twobytemem, 0x030F01, CPU_286|CPU_Priv); }
-       L L D T { RET_INSN(4, prot286, 0x0200, CPU_286|CPU_Prot|CPU_Priv); }
-       L M S W { RET_INSN(4, prot286, 0x0601, CPU_286|CPU_Priv); }
+       L G D T [wWlLqQ]? { RET_INSN(4, twobytemem, 0x020F01, CPU_286|CPU_Priv); }
+       L I D T [wWlLqQ]? { RET_INSN(4, twobytemem, 0x030F01, CPU_286|CPU_Priv); }
+       L L D T W? { RET_INSN(4, prot286, 0x0200, CPU_286|CPU_Prot|CPU_Priv); }
+       L M S W W? { RET_INSN(4, prot286, 0x0601, CPU_286|CPU_Priv); }
        L S L [wWlLqQ]? { RET_INSN(3, bsfr, 0x03, CPU_286|CPU_Prot); }
-       L T R { RET_INSN(3, prot286, 0x0300, CPU_286|CPU_Prot|CPU_Priv); }
-       S G D T { RET_INSN(4, twobytemem, 0x000F01, CPU_286|CPU_Priv); }
-       S I D T { RET_INSN(4, twobytemem, 0x010F01, CPU_286|CPU_Priv); }
-       S L D T { RET_INSN(4, sldtmsw, 0x0000, CPU_286); }
-       S M S W { RET_INSN(4, sldtmsw, 0x0401, CPU_286); }
-       S T R { RET_INSN(3, str, 0, CPU_286|CPU_Prot); }
-       V E R R { RET_INSN(4, prot286, 0x0400, CPU_286|CPU_Prot); }
-       V E R W { RET_INSN(4, prot286, 0x0500, CPU_286|CPU_Prot); }
+       L T R W? { RET_INSN(3, prot286, 0x0300, CPU_286|CPU_Prot|CPU_Priv); }
+       S G D T [wWlLqQ]? { RET_INSN(4, twobytemem, 0x000F01, CPU_286|CPU_Priv); }
+       S I D T [wWlLqQ]? { RET_INSN(4, twobytemem, 0x010F01, CPU_286|CPU_Priv); }
+       S L D T [wWlLqQ]? { RET_INSN(4, sldtmsw, 0x0000, CPU_286); }
+       S M S W [wWlLqQ]? { RET_INSN(4, sldtmsw, 0x0401, CPU_286); }
+       S T R [wWlLqQ]? { RET_INSN(3, str, 0, CPU_286|CPU_Prot); }
+       V E R R W? { RET_INSN(4, prot286, 0x0400, CPU_286|CPU_Prot); }
+       V E R W W? { RET_INSN(4, prot286, 0x0500, CPU_286|CPU_Prot); }
        /* Floating point instructions */
        F L D [lLsS]? { RET_INSN(3, fldstp, 0x0500C0, CPU_FPU); }
        F L D T {
@@ -4126,10 +4179,10 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        C O M I S S { RET_INSN(6, sseps, 0x2F, CPU_SSE); }
        C V T P I "2" P S { RET_INSN(8, cvt_xmm_mm_ps, 0x2A, CPU_SSE); }
        C V T P S "2" P I { RET_INSN(8, cvt_mm_xmm64, 0x2D, CPU_SSE); }
-       C V T S I "2" S S { RET_INSN(8, cvt_xmm_rmx, 0xF32A, CPU_SSE); }
-       C V T S S "2" S I { RET_INSN(8, cvt_rx_xmm32, 0xF32D, CPU_SSE); }
+       C V T S I "2" S S [lLqQ]? { RET_INSN(8, cvt_xmm_rmx, 0xF32A, CPU_SSE); }
+       C V T S S "2" S I [lLqQ]? { RET_INSN(8, cvt_rx_xmm32, 0xF32D, CPU_SSE); }
        C V T T P S "2" P I { RET_INSN(9, cvt_mm_xmm64, 0x2C, CPU_SSE); }
-       C V T T S S "2" S I { RET_INSN(9, cvt_rx_xmm32, 0xF32C, CPU_SSE); }
+       C V T T S S "2" S I [lLqQ]? { RET_INSN(9, cvt_rx_xmm32, 0xF32C, CPU_SSE); }
        D I V P S { RET_INSN(5, sseps, 0x5E, CPU_SSE); }
        D I V S S { RET_INSN(5, ssess, 0xF35E, CPU_SSE); }
        L D M X C S R { RET_INSN(7, ldstmxcsr, 0x02, CPU_SSE); }
@@ -4143,7 +4196,7 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        M O V H P S { RET_INSN_NS(movhlps, 0x16, CPU_SSE); }
        M O V L H P S { RET_INSN_NS(movhllhps, 0x16, CPU_SSE); }
        M O V L P S { RET_INSN_NS(movhlps, 0x12, CPU_SSE); }
-       M O V M S K P S { RET_INSN_NS(movmskps, 0, CPU_SSE); }
+       M O V M S K P S [lLqQ]? { RET_INSN(8, movmskps, 0, CPU_SSE); }
        M O V N T P S { RET_INSN_NS(movntps, 0, CPU_SSE); }
        M O V N T Q { RET_INSN_NS(movntq, 0, CPU_SSE); }
        M O V S S { RET_INSN_NS(movss, 0, CPU_SSE); }
@@ -4153,13 +4206,13 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        O R P S { RET_INSN_NS(sseps, 0x56, CPU_SSE); }
        P A V G B { RET_INSN_NS(mmxsse2, 0xE0, CPU_P3|CPU_MMX); }
        P A V G W { RET_INSN_NS(mmxsse2, 0xE3, CPU_P3|CPU_MMX); }
-       P E X T R W { RET_INSN_NS(pextrw, 0, CPU_P3|CPU_MMX); }
-       P I N S R W { RET_INSN_NS(pinsrw, 0, CPU_P3|CPU_MMX); }
+       P E X T R W [lLqQ]? { RET_INSN(6, pextrw, 0, CPU_P3|CPU_MMX); }
+       P I N S R W [lLqQ]? { RET_INSN(6, pinsrw, 0, CPU_P3|CPU_MMX); }
        P M A X S W { RET_INSN_NS(mmxsse2, 0xEE, CPU_P3|CPU_MMX); }
        P M A X U B { RET_INSN_NS(mmxsse2, 0xDE, CPU_P3|CPU_MMX); }
        P M I N S W { RET_INSN_NS(mmxsse2, 0xEA, CPU_P3|CPU_MMX); }
        P M I N U B { RET_INSN_NS(mmxsse2, 0xDA, CPU_P3|CPU_MMX); }
-       P M O V M S K B { RET_INSN_NS(pmovmskb, 0, CPU_SSE); }
+       P M O V M S K B [lLqQ]? { RET_INSN(8, pmovmskb, 0, CPU_SSE); }
        P M U L H U W { RET_INSN_NS(mmxsse2, 0xE4, CPU_P3|CPU_MMX); }
        P R E F E T C H N T A { RET_INSN_NS(twobytemem, 0x000F18, CPU_P3); }
        P R E F E T C H T "0" { RET_INSN_NS(twobytemem, 0x010F18, CPU_P3); }
@@ -4207,7 +4260,7 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        /* C M P S D is in string instructions above */
        C O M I S D { RET_INSN_NS(ssess, 0x662F, CPU_SSE2); }
        C V T P I "2" P D { RET_INSN_NS(cvt_xmm_mm_ss, 0x662A, CPU_SSE2); }
-       C V T S I "2" S D { RET_INSN_NS(cvt_xmm_rmx, 0xF22A, CPU_SSE2); }
+       C V T S I "2" S D [lLqQ]? { RET_INSN(8, cvt_xmm_rmx, 0xF22A, CPU_SSE2); }
        D I V P D { RET_INSN_NS(ssess, 0x665E, CPU_SSE2); }
        D I V S D { RET_INSN_NS(ssess, 0xF25E, CPU_SSE2); }
        M A X P D { RET_INSN_NS(ssess, 0x665F, CPU_SSE2); }
@@ -4217,7 +4270,7 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        M O V A P D { RET_INSN_NS(movaupd, 0x28, CPU_SSE2); }
        M O V H P D { RET_INSN_NS(movhlpd, 0x16, CPU_SSE2); }
        M O V L P D { RET_INSN_NS(movhlpd, 0x12, CPU_SSE2); }
-       M O V M S K P D { RET_INSN_NS(movmskpd, 0, CPU_SSE2); }
+       M O V M S K P D [lLqQ]? { RET_INSN(8, movmskpd, 0, CPU_SSE2); }
        M O V N T P D { RET_INSN_NS(movntpddq, 0x2B, CPU_SSE2); }
        M O V N T D Q { RET_INSN_NS(movntpddq, 0xE7, CPU_SSE2); }
        /* M O V S D is in string instructions above */
@@ -4241,7 +4294,7 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        C V T P D "2" P S { RET_INSN_NS(ssess, 0x665A, CPU_SSE2); }
        C V T P S "2" P D { RET_INSN_NS(cvt_xmm_xmm64_ps, 0x5A, CPU_SSE2); }
        C V T P S "2" D Q { RET_INSN_NS(ssess, 0x665B, CPU_SSE2); }
-       C V T S D "2" S I { RET_INSN_NS(cvt_rx_xmm64, 0xF22D, CPU_SSE2); }
+       C V T S D "2" S I [lLqQ]? { RET_INSN(8, cvt_rx_xmm64, 0xF22D, CPU_SSE2); }
        C V T S D "2" S S { RET_INSN_NS(cvt_xmm_xmm64_ss, 0xF25A, CPU_SSE2); }
        /* P4 VMX Instructions */
        V M C A L L     { RET_INSN_NS(threebyte, 0x0F01C1, CPU_P4); }
@@ -4256,7 +4309,7 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        V M X O N     { RET_INSN_NS(vmxthreebytemem, 0x06F3C7, CPU_P4); }
        C V T S S "2" S D { RET_INSN_NS(cvt_xmm_xmm32, 0xF35A, CPU_SSE2); }
        C V T T P D "2" P I { RET_INSN_NS(cvt_mm_xmm, 0x662C, CPU_SSE2); }
-       C V T T S D "2" S I { RET_INSN_NS(cvt_rx_xmm64, 0xF22C, CPU_SSE2); }
+       C V T T S D "2" S I [lLqQ]? { RET_INSN(9, cvt_rx_xmm64, 0xF22C, CPU_SSE2); }
        C V T T P D "2" D Q { RET_INSN_NS(ssess, 0x66E6, CPU_SSE2); }
        C V T T P S "2" D Q { RET_INSN_NS(ssess, 0xF35B, CPU_SSE2); }
        M A S K M O V D Q U { RET_INSN_NS(maskmovdqu, 0, CPU_SSE2); }
@@ -4275,7 +4328,11 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        /* SSE3 / PNI (Prescott New Instructions) instructions */
        A D D S U B P D { RET_INSN_NS(ssess, 0x66D0, CPU_SSE3); }
        A D D S U B P S { RET_INSN_NS(ssess, 0xF2D0, CPU_SSE3); }
-       F I S T T P { RET_INSN_NS(fildstp, 0x010001, CPU_SSE3); }
+       F I S T T P [sSlLqQ]? { RET_INSN(6, fildstp, 0x010001, CPU_SSE3); }
+       F I S T T P L L {
+           suffix_over='q';
+           RET_INSN_GAS(8, fildstp, 0x07, CPU_FPU);
+       }
        H A D D P D { RET_INSN_NS(ssess, 0x667C, CPU_SSE3); }
        H A D D P S { RET_INSN_NS(ssess, 0xF27C, CPU_SSE3); }
        H S U B P D { RET_INSN_NS(ssess, 0x667D, CPU_SSE3); }
@@ -4316,7 +4373,7 @@ yasm_x86__parse_check_insn(yasm_arch *arch, unsigned long data[4],
        P S W A P D { RET_INSN(6, now3d, 0xBB, CPU_Athlon|CPU_3DNow); }
        /* AMD extensions */
        S Y S C A L L { RET_INSN(7, twobyte, 0x0F05, CPU_686|CPU_AMD); }
-       S Y S R E T { RET_INSN(6, twobyte, 0x0F07, CPU_686|CPU_AMD|CPU_Priv); }
+       S Y S R E T [lLqQ]? { RET_INSN(6, twobyte, 0x0F07, CPU_686|CPU_AMD|CPU_Priv); }
        /* AMD x86-64 extensions */
        S W A P G S {
            warn64 = 1;
@@ -4374,8 +4431,10 @@ done:
        if (arch_x86->parser != X86_PARSER_GAS)
            return 0;
 
+       if (suffix_over == '\0')
+           suffix_over = id[suffix_ofs];
        /* Match suffixes */
-       switch (id[suffix_ofs]) {
+       switch (suffix_over) {
            case 'b':
            case 'B':
                data[3] |= (MOD_GasSufB >> MOD_GasSuf_SHIFT) << 8;