]> granicus.if.org Git - yasm/commitdiff
Fix pshift instructions by fixing meaning of MOD_Gap0 to actually eat the
authorPeter Johnson <peter@tortall.net>
Fri, 24 Oct 2003 01:32:22 +0000 (01:32 -0000)
committerPeter Johnson <peter@tortall.net>
Fri, 24 Oct 2003 01:32:22 +0000 (01:32 -0000)
first parameter (before MOD_Op2Add).  Before this change, MOD_Gap0 did not
eat a parameter until AFTER MOD_Op2Add.

Reported by: Edouard Gomez <ed.gomez@free.fr>

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

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

index 076659b18bfe8e9020c47d8fba0c3f5450de3180..7e1d821c915c5a2504b15392720eaf97418856b2 100644 (file)
@@ -89,6 +89,9 @@ EXTRA_DIST += modules/arch/x86/tests/opsize-err.errwarn
 EXTRA_DIST += modules/arch/x86/tests/overflow.asm
 EXTRA_DIST += modules/arch/x86/tests/overflow.errwarn
 EXTRA_DIST += modules/arch/x86/tests/overflow.hex
+EXTRA_DIST += modules/arch/x86/tests/pshift.asm
+EXTRA_DIST += modules/arch/x86/tests/pshift.errwarn
+EXTRA_DIST += modules/arch/x86/tests/pshift.hex
 EXTRA_DIST += modules/arch/x86/tests/rep.asm
 EXTRA_DIST += modules/arch/x86/tests/rep.errwarn
 EXTRA_DIST += modules/arch/x86/tests/rep.hex
diff --git a/modules/arch/x86/tests/pshift.asm b/modules/arch/x86/tests/pshift.asm
new file mode 100644 (file)
index 0000000..b864f42
--- /dev/null
@@ -0,0 +1,11 @@
+psrlw mm0, 1
+psrld mm0, 1
+psrlq mm0, 1
+psraw mm1, 1
+psrad mm1, 1
+
+psrlw xmm0, 1
+psrld xmm0, 1
+psrlq xmm0, 1
+psraw xmm1, 1
+psrad xmm1, 1
diff --git a/modules/arch/x86/tests/pshift.errwarn b/modules/arch/x86/tests/pshift.errwarn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/modules/arch/x86/tests/pshift.hex b/modules/arch/x86/tests/pshift.hex
new file mode 100644 (file)
index 0000000..943c9a5
--- /dev/null
@@ -0,0 +1,45 @@
+0f 
+71 
+d0 
+01 
+0f 
+72 
+d0 
+01 
+0f 
+73 
+d0 
+01 
+0f 
+71 
+e1 
+01 
+0f 
+72 
+e1 
+01 
+66 
+0f 
+71 
+d0 
+01 
+66 
+0f 
+72 
+d0 
+01 
+66 
+0f 
+73 
+d0 
+01 
+66 
+0f 
+71 
+e1 
+01 
+66 
+0f 
+72 
+e1 
+01 
index 23b1652f6de97ac09391c8cfa55cb81b61f127e5..1a2da44244482b6d811b9df0c42de459bde6c20b 100644 (file)
@@ -39,16 +39,17 @@ RCSID("$IdPath$");
  * parameters are read from the arch-specific data in LSB->MSB order.
  * (only for asthetic reasons in the lexer code below, no practical reason).
  */
-#define MOD_Op2Add  (1UL<<0)   /* Parameter adds to opcode byte 2 */
-#define MOD_Gap0    (1UL<<1)   /* Eats a parameter */
-#define MOD_Op1Add  (1UL<<2)   /* Parameter adds to opcode byte 1 */
-#define MOD_Gap1    (1UL<<3)   /* Eats a parameter */
-#define MOD_Op0Add  (1UL<<4)   /* Parameter adds to opcode byte 0 */
-#define MOD_SpAdd   (1UL<<5)   /* Parameter adds to "spare" value */
-#define MOD_OpSizeR (1UL<<6)   /* Parameter replaces opersize */
-#define MOD_Imm8    (1UL<<7)   /* Parameter is included as immediate byte */
-#define MOD_AdSizeR (1UL<<8)   /* Parameter replaces addrsize (jmp only) */
-#define MOD_DOpS64R (1UL<<9)   /* Parameter replaces default 64-bit opersize */
+#define MOD_Gap0    (1UL<<0)   /* Eats a parameter */
+#define MOD_Op2Add  (1UL<<1)   /* Parameter adds to opcode byte 2 */
+#define MOD_Gap1    (1UL<<2)   /* Eats a parameter */
+#define MOD_Op1Add  (1UL<<3)   /* Parameter adds to opcode byte 1 */
+#define MOD_Gap2    (1UL<<4)   /* Eats a parameter */
+#define MOD_Op0Add  (1UL<<5)   /* Parameter adds to opcode byte 0 */
+#define MOD_SpAdd   (1UL<<6)   /* Parameter adds to "spare" value */
+#define MOD_OpSizeR (1UL<<7)   /* Parameter replaces opersize */
+#define MOD_Imm8    (1UL<<8)   /* Parameter is included as immediate byte */
+#define MOD_AdSizeR (1UL<<9)   /* Parameter replaces addrsize (jmp only) */
+#define MOD_DOpS64R (1UL<<10)  /* Parameter replaces default 64-bit opersize */
 
 /* Modifiers that aren't actually used as modifiers.  Rather, if set, bits
  * 20-27 in the modifier are used as an index into an array.
@@ -1960,17 +1961,19 @@ yasm_x86__parse_insn(yasm_arch *arch, const unsigned long data[4],
     d.rex = 0;
 
     /* Apply modifiers */
+    if (info->modifiers & MOD_Gap0)
+       mod_data >>= 8;
     if (info->modifiers & MOD_Op2Add) {
        d.op[2] += (unsigned char)(mod_data & 0xFF);
        mod_data >>= 8;
     }
-    if (info->modifiers & MOD_Gap0)
+    if (info->modifiers & MOD_Gap1)
        mod_data >>= 8;
     if (info->modifiers & MOD_Op1Add) {
        d.op[1] += (unsigned char)(mod_data & 0xFF);
        mod_data >>= 8;
     }
-    if (info->modifiers & MOD_Gap1)
+    if (info->modifiers & MOD_Gap2)
        mod_data >>= 8;
     if (info->modifiers & MOD_Op0Add) {
        d.op[0] += (unsigned char)(mod_data & 0xFF);