|
From: <sv...@va...> - 2012-05-24 06:17:22
|
sewardj 2012-05-24 07:17:14 +0100 (Thu, 24 May 2012)
New Revision: 2347
Log:
Fix incorrect uses of disAMode in some SSE4 instructions that have an
immediate byte as a subopcode. Fixes #294260. (Patrick J. LoPresti,
lop...@gm...)
Modified files:
trunk/priv/guest_amd64_toIR.c
Modified: trunk/priv/guest_amd64_toIR.c (+5 -5)
===================================================================
--- trunk/priv/guest_amd64_toIR.c 2012-05-24 01:09:27 +01:00 (rev 2346)
+++ trunk/priv/guest_amd64_toIR.c 2012-05-24 07:17:14 +01:00 (rev 2347)
@@ -15595,7 +15595,7 @@
} else {
regNoL = 16; /* use XMM16 as an intermediary */
regNoR = gregOfRexRM(pfx, modrm);
- addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 0 );
+ addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 1 );
/* No alignment check; I guess that makes sense, given that
these insns are for dealing with C style strings. */
stmt( IRStmt_Put( OFFB_YMM16, loadLE(Ity_V128, mkexpr(addr)) ));
@@ -15751,7 +15751,7 @@
imm, nameXMMReg( eregOfRexRM(pfx, modrm) ),
nameXMMReg( gregOfRexRM(pfx, modrm) ) );
} else {
- addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 0 );
+ addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 1 );
gen_SEGV_if_not_16_aligned(addr);
assign( src0, loadLE(Ity_F32,
binop(Iop_Add64, mkexpr(addr), mkU64(0) )));
@@ -15813,7 +15813,7 @@
imm, nameXMMReg( eregOfRexRM(pfx, modrm) ),
nameXMMReg( gregOfRexRM(pfx, modrm) ) );
} else {
- addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 0 );
+ addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 1 );
gen_SEGV_if_not_16_aligned(addr);
assign( src0, loadLE(Ity_F64,
binop(Iop_Add64, mkexpr(addr), mkU64(0) )));
@@ -15868,7 +15868,7 @@
imm, nameXMMReg( eregOfRexRM(pfx, modrm) ),
nameXMMReg( gregOfRexRM(pfx, modrm) ) );
} else {
- addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 0 );
+ addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 1 );
assign( src, loadLE( isD ? Ity_F64 : Ity_F32, mkexpr(addr) ));
imm = getUChar(delta+alen);
if (imm & ~15) goto decode_failure;
@@ -16811,7 +16811,7 @@
} else {
regNoL = 16; /* use XMM16 as an intermediary */
regNoR = gregOfRexRM(pfx, modrm);
- addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 0 );
+ addr = disAMode( &alen, vbi, pfx, delta, dis_buf, 1 );
/* alignment check ???? . */
stmt( IRStmt_Put( OFFB_YMM16, loadLE(Ity_V128, mkexpr(addr)) ));
imm = getUChar(delta+alen);
|