|
From: Tom H. <th...@cy...> - 2005-01-02 16:16:19
|
CVS commit by thughes:
Complete PINSRW support - we weren't handling the case with one
operand in memory rather than a register.
BUG: 94645
M +4 -0 addrcheck/tests/x86/insn_sse.stdout.exp 1.2
M +8 -0 addrcheck/tests/x86/insn_sse2.stdout.exp 1.2
M +4 -0 cachegrind/tests/x86/insn_sse.stdout.exp 1.2
M +8 -0 cachegrind/tests/x86/insn_sse2.stdout.exp 1.2
M +25 -7 coregrind/vg_to_ucode.c 1.149
M +4 -0 helgrind/tests/x86/insn_sse.stdout.exp 1.2
M +8 -0 helgrind/tests/x86/insn_sse2.stdout.exp 1.2
M +4 -0 memcheck/tests/x86/insn_sse.stdout.exp 1.2
M +8 -0 memcheck/tests/x86/insn_sse2.stdout.exp 1.2
M +4 -0 none/tests/x86/insn_sse.def 1.2
M +4 -0 none/tests/x86/insn_sse.stdout.exp 1.2
M +8 -0 none/tests/x86/insn_sse2.def 1.2
M +8 -0 none/tests/x86/insn_sse2.stdout.exp 1.2
--- valgrind/addrcheck/tests/x86/insn_sse.stdout.exp #1.1:1.2
@@ -95,4 +95,8 @@
pinsrw_3 ... ok
pinsrw_4 ... ok
+pinsrw_5 ... ok
+pinsrw_6 ... ok
+pinsrw_7 ... ok
+pinsrw_8 ... ok
pmaxsw_1 ... ok
pmaxsw_2 ... ok
--- valgrind/addrcheck/tests/x86/insn_sse2.stdout.exp #1.1:1.2
@@ -176,4 +176,12 @@
pinsrw_7 ... ok
pinsrw_8 ... ok
+pinsrw_9 ... ok
+pinsrw_10 ... ok
+pinsrw_11 ... ok
+pinsrw_12 ... ok
+pinsrw_13 ... ok
+pinsrw_14 ... ok
+pinsrw_15 ... ok
+pinsrw_16 ... ok
pmaddwd_1 ... ok
pmaddwd_2 ... ok
--- valgrind/cachegrind/tests/x86/insn_sse.stdout.exp #1.1:1.2
@@ -95,4 +95,8 @@
pinsrw_3 ... ok
pinsrw_4 ... ok
+pinsrw_5 ... ok
+pinsrw_6 ... ok
+pinsrw_7 ... ok
+pinsrw_8 ... ok
pmaxsw_1 ... ok
pmaxsw_2 ... ok
--- valgrind/cachegrind/tests/x86/insn_sse2.stdout.exp #1.1:1.2
@@ -176,4 +176,12 @@
pinsrw_7 ... ok
pinsrw_8 ... ok
+pinsrw_9 ... ok
+pinsrw_10 ... ok
+pinsrw_11 ... ok
+pinsrw_12 ... ok
+pinsrw_13 ... ok
+pinsrw_14 ... ok
+pinsrw_15 ... ok
+pinsrw_16 ... ok
pmaddwd_1 ... ok
pmaddwd_2 ... ok
--- valgrind/coregrind/vg_to_ucode.c #1.148:1.149
@@ -5039,5 +5039,4 @@ static Addr disInstr ( UCodeBlock* cb, A
if (epartIsReg(modrm)) {
uInstr2(cb, GET, 2, ArchReg, eregOfRM(modrm), TempReg, t1);
- vg_assert(epartIsReg(modrm));
uInstr3(cb, SSE3e1_RegRd, 2,
Lit16, (((UShort)0x66) << 8) | (UShort)insn[0],
@@ -5050,5 +5049,16 @@ static Addr disInstr ( UCodeBlock* cb, A
eip += 4;
} else {
- VG_(core_panic)("PINSRW mem");
+ pair = disAMode ( cb, sorb, eip + 2, dis_buf );
+ t2 = LOW24(pair);
+ uInstr2(cb, LOAD, 2, TempReg, t2, TempReg, t1);
+ uInstr3(cb, SSE3e1_RegRd, 2,
+ Lit16, (((UShort)0x66) << 8) | (UShort)insn[0],
+ Lit16, (((UShort)insn[1]) << 8) | (UShort)modrm,
+ TempReg, t1 );
+ abyte = insn[2 + HI8(pair)];
+ uLiteral(cb, abyte);
+ DIP("pinsrw %s, %d, %s\n",
+ dis_buf, abyte, nameXMMReg(gregOfRM(modrm)));
+ eip += 3 + HI8(pair);
}
goto decode_success;
@@ -7265,8 +7275,16 @@ static Addr disInstr ( UCodeBlock* cb, A
vg_assert(sz == 4);
t1 = newTemp(cb);
- modrm = getUChar(eip); eip++;
- abyte = getUChar(eip); eip++;
- vg_assert(epartIsReg(modrm));
+ modrm = getUChar(eip);
+ if (epartIsReg(modrm)) {
+ VG_(strcpy)(dis_buf, nameIReg(2, eregOfRM(modrm)));
uInstr2(cb, GET, 2, ArchReg, eregOfRM(modrm), TempReg, t1);
+ eip++;
+ } else {
+ pair = disAMode ( cb, sorb, eip, dis_buf );
+ t2 = LOW24(pair);
+ uInstr2(cb, LOAD, 2, TempReg, t2, TempReg, t1);
+ eip += HI8(pair);
+ }
+ abyte = getUChar(eip); eip++;
uInstr3(cb, SSE2e1_RegRd, 2,
Lit16, (((UShort)(0x0F)) << 8) | (UShort)(opc),
@@ -7274,5 +7292,5 @@ static Addr disInstr ( UCodeBlock* cb, A
TempReg, t1 );
uLiteral(cb, abyte);
- DIP("pinsrw %s, %d, %s\n", nameIReg(2, eregOfRM(modrm)),
+ DIP("pinsrw %s, %d, %s\n", dis_buf,
(Int)abyte, nameMMXReg(gregOfRM(modrm)));
break;
--- valgrind/helgrind/tests/x86/insn_sse.stdout.exp #1.1:1.2
@@ -95,4 +95,8 @@
pinsrw_3 ... ok
pinsrw_4 ... ok
+pinsrw_5 ... ok
+pinsrw_6 ... ok
+pinsrw_7 ... ok
+pinsrw_8 ... ok
pmaxsw_1 ... ok
pmaxsw_2 ... ok
--- valgrind/helgrind/tests/x86/insn_sse2.stdout.exp #1.1:1.2
@@ -176,4 +176,12 @@
pinsrw_7 ... ok
pinsrw_8 ... ok
+pinsrw_9 ... ok
+pinsrw_10 ... ok
+pinsrw_11 ... ok
+pinsrw_12 ... ok
+pinsrw_13 ... ok
+pinsrw_14 ... ok
+pinsrw_15 ... ok
+pinsrw_16 ... ok
pmaddwd_1 ... ok
pmaddwd_2 ... ok
--- valgrind/memcheck/tests/x86/insn_sse.stdout.exp #1.1:1.2
@@ -95,4 +95,8 @@
pinsrw_3 ... ok
pinsrw_4 ... ok
+pinsrw_5 ... ok
+pinsrw_6 ... ok
+pinsrw_7 ... ok
+pinsrw_8 ... ok
pmaxsw_1 ... ok
pmaxsw_2 ... ok
--- valgrind/memcheck/tests/x86/insn_sse2.stdout.exp #1.1:1.2
@@ -176,4 +176,12 @@
pinsrw_7 ... ok
pinsrw_8 ... ok
+pinsrw_9 ... ok
+pinsrw_10 ... ok
+pinsrw_11 ... ok
+pinsrw_12 ... ok
+pinsrw_13 ... ok
+pinsrw_14 ... ok
+pinsrw_15 ... ok
+pinsrw_16 ... ok
pmaddwd_1 ... ok
pmaddwd_2 ... ok
--- valgrind/none/tests/x86/insn_sse.def #1.1:1.2
@@ -95,4 +95,8 @@
pinsrw imm8[2] r32.ud[0xffffffff] mm.uw[1234,5678,4321,8765] => 2.uw[1234,5678,65535,8765]
pinsrw imm8[3] r32.ud[0xffffffff] mm.uw[1234,5678,4321,8765] => 2.uw[1234,5678,4321,65535]
+pinsrw imm8[0] m16.uw[0xffff] mm.uw[1234,5678,4321,8765] => 2.uw[65535,5678,4321,8765]
+pinsrw imm8[1] m16.uw[0xffff] mm.uw[1234,5678,4321,8765] => 2.uw[1234,65535,4321,8765]
+pinsrw imm8[2] m16.uw[0xffff] mm.uw[1234,5678,4321,8765] => 2.uw[1234,5678,65535,8765]
+pinsrw imm8[3] m16.uw[0xffff] mm.uw[1234,5678,4321,8765] => 2.uw[1234,5678,4321,65535]
pmaxsw mm.sw[-1,2,-3,4] mm.sw[2,-3,4,-5] => 1.sw[2,2,4,4]
pmaxsw m64.sw[-1,2,-3,4] mm.sw[2,-3,4,-5] => 1.sw[2,2,4,4]
--- valgrind/none/tests/x86/insn_sse.stdout.exp #1.1:1.2
@@ -95,4 +95,8 @@
pinsrw_3 ... ok
pinsrw_4 ... ok
+pinsrw_5 ... ok
+pinsrw_6 ... ok
+pinsrw_7 ... ok
+pinsrw_8 ... ok
pmaxsw_1 ... ok
pmaxsw_2 ... ok
--- valgrind/none/tests/x86/insn_sse2.def #1.1:1.2
@@ -176,4 +176,12 @@
pinsrw imm8[6] r32.ud[0xffffffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[1234,5678,4321,8765,1111,2222,65535,4444]
pinsrw imm8[7] r32.ud[0xffffffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[1234,5678,4321,8765,1111,2222,3333,65535]
+pinsrw imm8[0] m16.uw[0xffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[65535,5678,4321,8765,1111,2222,3333,4444]
+pinsrw imm8[1] m16.uw[0xffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[1234,65535,4321,8765,1111,2222,3333,4444]
+pinsrw imm8[2] m16.uw[0xffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[1234,5678,65535,8765,1111,2222,3333,4444]
+pinsrw imm8[3] m16.uw[0xffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[1234,5678,4321,65535,1111,2222,3333,4444]
+pinsrw imm8[4] m16.uw[0xffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[1234,5678,4321,8765,65535,2222,3333,4444]
+pinsrw imm8[5] m16.uw[0xffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[1234,5678,4321,8765,1111,65535,3333,4444]
+pinsrw imm8[6] m16.uw[0xffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[1234,5678,4321,8765,1111,2222,65535,4444]
+pinsrw imm8[7] m16.uw[0xffff] xmm.uw[1234,5678,4321,8765,1111,2222,3333,4444] => 2.uw[1234,5678,4321,8765,1111,2222,3333,65535]
pmaddwd xmm.sw[1234,5678,-4321,-8765,1234,5678,-4321,-8765] xmm.sw[1111,-2222,3333,-4444,1111,-2222,3333,-4444] => 1.sd[-11245542,24549767,-11245542,24549767]
pmaddwd m128.sw[1234,5678,-4321,-8765,1234,5678,-4321,-8765] xmm.sw[1111,-2222,3333,-4444,1111,-2222,3333,-4444] => 1.sd[-11245542,24549767,-11245542,24549767]
--- valgrind/none/tests/x86/insn_sse2.stdout.exp #1.1:1.2
@@ -176,4 +176,12 @@
pinsrw_7 ... ok
pinsrw_8 ... ok
+pinsrw_9 ... ok
+pinsrw_10 ... ok
+pinsrw_11 ... ok
+pinsrw_12 ... ok
+pinsrw_13 ... ok
+pinsrw_14 ... ok
+pinsrw_15 ... ok
+pinsrw_16 ... ok
pmaddwd_1 ... ok
pmaddwd_2 ... ok
|