You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
|
|
|
1
(36) |
2
(30) |
|
3
(17) |
4
(21) |
5
(18) |
6
(14) |
7
(23) |
8
(12) |
9
(11) |
|
10
(11) |
11
(12) |
12
(11) |
13
(12) |
14
(11) |
15
(11) |
16
(15) |
|
17
(12) |
18
(15) |
19
(15) |
20
(25) |
21
(26) |
22
(21) |
23
(18) |
|
24
(25) |
25
(28) |
26
(27) |
27
(32) |
28
(13) |
29
(12) |
30
(10) |
|
From: <sv...@va...> - 2005-04-06 20:02:02
|
Author: sewardj
Date: 2005-04-06 21:01:56 +0100 (Wed, 06 Apr 2005)
New Revision: 1125
Modified:
trunk/priv/guest-amd64/toIR.c
trunk/priv/host-amd64/hdefs.c
trunk/priv/host-amd64/hdefs.h
trunk/priv/host-amd64/isel.c
trunk/priv/ir/irdefs.c
trunk/pub/libvex_ir.h
Log:
More AMD64 instructions: sfence, movnti, bsf{w,l,q}
Modified: trunk/priv/guest-amd64/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-amd64/toIR.c 2005-04-06 10:27:11 UTC (rev 1124)
+++ trunk/priv/guest-amd64/toIR.c 2005-04-06 20:01:56 UTC (rev 1125)
@@ -771,7 +771,8 @@
case 2: return Ity_I16;
case 4: return Ity_I32;
case 8: return Ity_I64;
- default: vpanic("szToITy(amd64)");
+ default: vex_printf("\nszToITy(%d)\n", n);
+ vpanic("szToITy(amd64)");
}
}
=20
@@ -6696,114 +6697,125 @@
//.. =20
//.. return delta;
//.. }
-//..=20
-//..=20
-//..=20
-//.. /* Handle BSF/BSR. Only v-size seems necessary. */
-//.. static
-//.. UInt dis_bs_E_G ( UChar sorb, Int sz, ULong delta, Bool fwds )
-//.. {
-//.. Bool isReg;
-//.. UChar modrm;
-//.. HChar dis_buf[50];
-//.. =20
-//.. IRType ty =3D szToITy(sz);
-//.. IRTemp src =3D newTemp(ty);
-//.. IRTemp dst =3D newTemp(ty);
-//..=20
-//.. IRTemp src32 =3D newTemp(Ity_I32);
-//.. IRTemp dst32 =3D newTemp(Ity_I32);
-//.. IRTemp src8 =3D newTemp(Ity_I8);
-//..=20
-//.. vassert(sz =3D=3D 4 || sz =3D=3D 2);
-//..=20
-//.. modrm =3D getUChar(delta);
-//..=20
-//.. isReg =3D epartIsReg(modrm);
-//.. if (isReg) {
-//.. delta++;
-//.. assign( src, getIReg(sz, eregOfRM(modrm)) );
-//.. } else {
-//.. Int len;
-//.. IRTemp addr =3D disAMode( &len, sorb, delta, dis_buf );
-//.. delta +=3D len;
-//.. assign( src, loadLE(ty, mkexpr(addr)) );
-//.. }
-//..=20
-//.. DIP("bs%c%c %s, %s\n",
-//.. fwds ? 'f' : 'r', nameISize(sz),=20
-//.. ( isReg ? nameIReg(sz, eregOfRM(modrm)) : dis_buf ),=20
-//.. nameIReg(sz, gregOfRM(modrm)));
-//..=20
-//.. /* Generate an 8-bit expression which is zero iff the=20
-//.. original is zero, and nonzero otherwise */
-//.. assign( src8,
-//.. unop(Iop_1Uto8, binop(mkSizedOp(ty,Iop_CmpNE8),
-//.. mkexpr(src), mkU(ty,0))) );
-//..=20
-//.. /* Flags: Z is 1 iff source value is zero. All others=20
-//.. are undefined -- we force them to zero. */
-//.. stmt( IRStmt_Put( OFFB_CC_OP, mkU32(X86G_CC_OP_COPY) ));
-//.. stmt( IRStmt_Put( OFFB_CC_DEP2, mkU32(0) ));
-//.. stmt( IRStmt_Put(=20
-//.. OFFB_CC_DEP1,
-//.. IRExpr_Mux0X( mkexpr(src8),
-//.. /* src=3D=3D0 */
-//.. mkU32(X86G_CC_MASK_Z),
-//.. /* src!=3D0 */
-//.. mkU32(0)
-//.. )
-//.. ));
-//..=20
-//.. /* Result: iff source value is zero, we can't use
-//.. Iop_Clz32/Iop_Ctz32 as they have no defined result in that ca=
se.
-//.. But anyway, Intel x86 semantics say the result is undefined i=
n
-//.. such situations. Hence handle the zero case specially. */
-//..=20
-//.. /* Bleh. What we compute:
-//..=20
-//.. bsf32: if src =3D=3D 0 then 0 else Ctz32(src)
-//.. bsr32: if src =3D=3D 0 then 0 else 31 - Clz32(src)
-//..=20
-//.. bsf16: if src =3D=3D 0 then 0 else Ctz32(16Uto32(src))
-//.. bsr16: if src =3D=3D 0 then 0 else 31 - Clz32(16Uto32(s=
rc))
-//..=20
-//.. First, widen src to 32 bits if it is not already.
-//..=20
-//.. Postscript 15 Oct 04: it seems that at least VIA Nehemiah lea=
ves the
-//.. dst register unchanged when src =3D=3D 0. Hence change accor=
dingly.
-//.. */
-//.. if (sz =3D=3D 2)
-//.. assign( src32, unop(Iop_16Uto32, mkexpr(src)) );
-//.. else
-//.. assign( src32, mkexpr(src) );
-//..=20
-//.. /* The main computation, guarding against zero. */
-//.. assign( dst32, =20
-//.. IRExpr_Mux0X(=20
-//.. mkexpr(src8),
-//.. /* src =3D=3D 0 -- leave dst unchanged */
-//.. widenUto32( getIReg( sz, gregOfRM(modrm) ) ),
-//.. /* src !=3D 0 */
-//.. fwds ? unop(Iop_Ctz32, mkexpr(src32))
-//.. : binop(Iop_Sub32,=20
-//.. mkU32(31),=20
-//.. unop(Iop_Clz32, mkexpr(src32)))
-//.. )
-//.. );
-//..=20
-//.. if (sz =3D=3D 2)
-//.. assign( dst, unop(Iop_32to16, mkexpr(dst32)) );
-//.. else
-//.. assign( dst, mkexpr(dst32) );
-//..=20
-//.. /* dump result back */
-//.. putIReg( sz, gregOfRM(modrm), mkexpr(dst) );
-//..=20
-//.. return delta;
-//.. }
=20
=20
+
+/* Handle BSF/BSR. Only v-size seems necessary. */
+static
+ULong dis_bs_E_G ( Prefix pfx, Int sz, ULong delta, Bool fwds )
+{
+ Bool isReg;
+ UChar modrm;
+ HChar dis_buf[50];
+
+ IRType ty =3D szToITy(sz);
+ IRTemp src =3D newTemp(ty);
+ IRTemp dst =3D newTemp(ty);
+ IRTemp src64 =3D newTemp(Ity_I64);
+ IRTemp dst64 =3D newTemp(Ity_I64);
+ IRTemp src8 =3D newTemp(Ity_I8);
+
+ vassert(sz =3D=3D 8 || sz =3D=3D 4 || sz =3D=3D 2);
+
+ modrm =3D getUChar(delta);
+ isReg =3D epartIsReg(modrm);
+ if (isReg) {
+ delta++;
+ assign( src, getIRegE(sz, pfx, modrm) );
+ } else {
+ Int len;
+ IRTemp addr =3D disAMode( &len, pfx, delta, dis_buf, 0 );
+ delta +=3D len;
+ assign( src, loadLE(ty, mkexpr(addr)) );
+ }
+
+ DIP("bs%c%c %s, %s\n",
+ fwds ? 'f' : 'r', nameISize(sz),=20
+ ( isReg ? nameIRegE(sz, pfx, modrm) : dis_buf ),=20
+ nameIRegG(sz, pfx, modrm));
+
+ /* First, widen src to 64 bits if it is not already. */
+ assign( src64, widenUto64(mkexpr(src)) );
+
+ /* Generate an 8-bit expression which is zero iff the=20
+ original is zero, and nonzero otherwise */
+ assign( src8,
+ unop(Iop_1Uto8,=20
+ binop(Iop_CmpNE64,
+ mkexpr(src64), mkU64(0))) );
+
+ /* Flags: Z is 1 iff source value is zero. All others=20
+ are undefined -- we force them to zero. */
+ stmt( IRStmt_Put( OFFB_CC_OP, mkU64(AMD64G_CC_OP_COPY) ));
+ stmt( IRStmt_Put( OFFB_CC_DEP2, mkU64(0) ));
+ stmt( IRStmt_Put(=20
+ OFFB_CC_DEP1,
+ IRExpr_Mux0X( mkexpr(src8),
+ /* src=3D=3D0 */
+ mkU64(AMD64G_CC_MASK_Z),
+ /* src!=3D0 */
+ mkU64(0)
+ )
+ ));
+ /* Set NDEP even though it isn't used. This makes redundant-PUT
+ elimination of previous stores to this field work better. */
+ stmt( IRStmt_Put( OFFB_CC_NDEP, mkU64(0) ));
+
+ /* Result: iff source value is zero, we can't use
+ Iop_Clz64/Iop_Ctz64 as they have no defined result in that case.
+ But anyway, amd64 semantics say the result is undefined in
+ such situations. Hence handle the zero case specially. */
+
+ /* Bleh. What we compute:
+
+ bsf64: if src =3D=3D 0 then {dst is unchanged}=20
+ else Ctz64(src)
+
+ bsr64: if src =3D=3D 0 then {dst is unchanged}=20
+ else 63 - Clz64(src)
+
+ bsf32: if src =3D=3D 0 then {dst is unchanged}=20
+ else Ctz64(32Uto64(src))
+
+ bsr32: if src =3D=3D 0 then {dst is unchanged}
+ else 63 - Clz64(32Uto64(src))
+
+ bsf16: if src =3D=3D 0 then {dst is unchanged}=20
+ else Ctz64(32Uto64(16Uto32(src)))
+
+ bsr16: if src =3D=3D 0 then {dst is unchanged}=20
+ else 63 - Clz64(32Uto64(16Uto32(src)))
+ */
+
+ /* The main computation, guarding against zero. */
+ assign( dst64,
+ IRExpr_Mux0X(=20
+ mkexpr(src8),
+ /* src =3D=3D 0 -- leave dst unchanged */
+ widenUto64( getIRegG( sz, pfx, modrm ) ),
+ /* src !=3D 0 */
+ fwds ? unop(Iop_Ctz64, mkexpr(src64))
+ : binop(Iop_Sub64,=20
+ mkU64(63),=20
+ unop(Iop_Clz64, mkexpr(src64)))
+ )
+ );
+
+ if (sz =3D=3D 2)
+ assign( dst, unop(Iop_32to16, unop(Iop_64to32, mkexpr(dst64))) );
+ else
+ if (sz =3D=3D 4)
+ assign( dst, unop(Iop_64to32, mkexpr(dst64)) );
+ else
+ assign( dst, mkexpr(dst64) );
+
+ /* dump result back */
+ putIRegG( sz, pfx, modrm, mkexpr(dst) );
+
+ return delta;
+}
+
+
/* swap rAX with the reg specified by reg and REX.B */
static=20
void codegen_xchg_rAX_Reg ( Prefix pfx, Int sz, UInt regLo3 )
@@ -8975,19 +8987,20 @@
//.. "rsqrtss", Iop_RSqrt32F0x4=
);
//.. goto decode_success;
//.. }
-//..=20
-//.. /* 0F AE /7 =3D SFENCE -- flush pending operations to memory */
-//.. if (insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xAE
-//.. && epartIsReg(insn[2]) && gregOfRM(insn[2]) =3D=3D 7) {
-//.. vassert(sz =3D=3D 4);
-//.. delta +=3D 3;
-//.. /* Insert a memory fence. It's sometimes important that thes=
e
-//.. are carried through to the generated code. */
-//.. stmt( IRStmt_MFence() );
-//.. DIP("sfence\n");
-//.. goto decode_success;
-//.. }
-//..=20
+
+ /* 0F AE /7 =3D SFENCE -- flush pending operations to memory */
+ if (haveNo66noF2noF3(pfx)=20
+ && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xAE
+ && epartIsReg(insn[2]) && gregLO3ofRM(insn[2]) =3D=3D 7
+ && sz =3D=3D 4) {
+ delta +=3D 3;
+ /* Insert a memory fence. It's sometimes important that these
+ are carried through to the generated code. */
+ stmt( IRStmt_MFence() );
+ DIP("sfence\n");
+ goto decode_success;
+ }
+
//.. /* 0F C6 /r ib =3D SHUFPS -- shuffle packed F32s */
//.. if (sz =3D=3D 4 && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xC6) {
//.. Int select;
@@ -10124,22 +10137,23 @@
//.. }
//.. /* else fall through */
//.. }
-//..=20
-//.. /* 0F C3 =3D MOVNTI -- for us, just a plain ireg store. */
-//.. if (insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xC3) {
-//.. vassert(sz =3D=3D 4);
-//.. modrm =3D getUChar(delta+2);
-//.. if (!epartIsReg(modrm)) {
-//.. addr =3D disAMode ( &alen, sorb, delta+2, dis_buf );
-//.. storeLE( mkexpr(addr), getIReg(4, gregOfRM(modrm)) );
-//.. DIP("movnti %s,%s\n", dis_buf,
-//.. nameIReg(4, gregOfRM(modrm)));
-//.. delta +=3D 2+alen;
-//.. goto decode_success;
-//.. }
-//.. /* else fall through */
-//.. }
=20
+ /* 0F C3 =3D MOVNTI -- for us, just a plain ireg store. */
+ if (haveNo66noF2noF3(pfx) &&
+ insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xC3) {
+ vassert(sz =3D=3D 4 || sz =3D=3D 8);
+ modrm =3D getUChar(delta+2);
+ if (!epartIsReg(modrm)) {
+ addr =3D disAMode ( &alen, pfx, delta+2, dis_buf, 0 );
+ storeLE( mkexpr(addr), getIRegG(sz, pfx, modrm) );
+ DIP("movnti %s,%s\n", dis_buf,
+ nameIRegG(sz, pfx, modrm));
+ delta +=3D 2+alen;
+ goto decode_success;
+ }
+ /* else fall through */
+ }
+
/* 66 0F D6 =3D MOVQ -- move 64 bits from G (lo half xmm) to E (mem
or lo half xmm). */
if (have66noF2noF3(pfx) && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xD6=
) {
@@ -12843,11 +12857,12 @@
break;
}
=20
-//.. /* =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- BSF/BSR -=3D-=3D-=3D-=
=3D-=3D-=3D-=3D-=3D-=3D-=3D */
-//..=20
-//.. case 0xBC: /* BSF Gv,Ev */
-//.. delta =3D dis_bs_E_G ( sorb, sz, delta, True );
-//.. break;
+ /* =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- BSF/BSR -=3D-=3D-=3D-=3D-=3D=
-=3D-=3D-=3D-=3D-=3D */
+
+ case 0xBC: /* BSF Gv,Ev */
+ if (haveF2orF3(pfx)) goto decode_failure;
+ delta =3D dis_bs_E_G ( pfx, sz, delta, True );
+ break;
//.. case 0xBD: /* BSR Gv,Ev */
//.. delta =3D dis_bs_E_G ( sorb, sz, delta, False );
//.. break;
Modified: trunk/priv/host-amd64/hdefs.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-amd64/hdefs.c 2005-04-06 10:27:11 UTC (rev 1124)
+++ trunk/priv/host-amd64/hdefs.c 2005-04-06 20:01:56 UTC (rev 1125)
@@ -779,14 +779,14 @@
i->Ain.Set64.dst =3D dst;
return i;
}
-//.. AMD64Instr* AMD64Instr_Bsfr32 ( Bool isFwds, HReg src, HReg dst ) {
-//.. AMD64Instr* i =3D LibVEX_Alloc(sizeof(AMD64Instr));
-//.. i->tag =3D Xin_Bsfr32;
-//.. i->Xin.Bsfr32.isFwds =3D isFwds;
-//.. i->Xin.Bsfr32.src =3D src;
-//.. i->Xin.Bsfr32.dst =3D dst;
-//.. return i;
-//.. }
+AMD64Instr* AMD64Instr_Bsfr64 ( Bool isFwds, HReg src, HReg dst ) {
+ AMD64Instr* i =3D LibVEX_Alloc(sizeof(AMD64Instr));
+ i->tag =3D Ain_Bsfr64;
+ i->Ain.Bsfr64.isFwds =3D isFwds;
+ i->Ain.Bsfr64.src =3D src;
+ i->Ain.Bsfr64.dst =3D dst;
+ return i;
+}
AMD64Instr* AMD64Instr_MFence ( void )
{
AMD64Instr* i =3D LibVEX_Alloc(sizeof(AMD64Instr));
@@ -1120,12 +1120,12 @@
vex_printf("setq%s ", showAMD64CondCode(i->Ain.Set64.cond));
ppHRegAMD64(i->Ain.Set64.dst);
return;
-//.. case Xin_Bsfr32:
-//.. vex_printf("bs%cl ", i->Xin.Bsfr32.isFwds ? 'f' : 'r');
-//.. ppHRegAMD64(i->Xin.Bsfr32.src);
-//.. vex_printf(",");
-//.. ppHRegAMD64(i->Xin.Bsfr32.dst);
-//.. return;
+ case Ain_Bsfr64:
+ vex_printf("bs%cq ", i->Ain.Bsfr64.isFwds ? 'f' : 'r');
+ ppHRegAMD64(i->Ain.Bsfr64.src);
+ vex_printf(",");
+ ppHRegAMD64(i->Ain.Bsfr64.dst);
+ return;
case Ain_MFence:
vex_printf("mfence" );
return;
@@ -1433,10 +1433,10 @@
case Ain_Set64:
addHRegUse(u, HRmWrite, i->Ain.Set64.dst);
return;
-//.. case Xin_Bsfr32:
-//.. addHRegUse(u, HRmRead, i->Xin.Bsfr32.src);
-//.. addHRegUse(u, HRmWrite, i->Xin.Bsfr32.dst);
-//.. return;
+ case Ain_Bsfr64:
+ addHRegUse(u, HRmRead, i->Ain.Bsfr64.src);
+ addHRegUse(u, HRmWrite, i->Ain.Bsfr64.dst);
+ return;
case Ain_MFence:
return;
//.. case Xin_FpUnary:
@@ -1631,10 +1631,10 @@
case Ain_Set64:
mapReg(m, &i->Ain.Set64.dst);
return;
-//.. case Xin_Bsfr32:
-//.. mapReg(m, &i->Xin.Bsfr32.src);
-//.. mapReg(m, &i->Xin.Bsfr32.dst);
-//.. return;
+ case Ain_Bsfr64:
+ mapReg(m, &i->Ain.Bsfr64.src);
+ mapReg(m, &i->Ain.Bsfr64.dst);
+ return;
case Ain_MFence:
return;
//.. case Xin_FpUnary:
@@ -2695,15 +2695,16 @@
*p++ =3D toUChar(0xC0 + (reg & 7));
goto done;
=20
-//.. case Xin_Bsfr32:
-//.. *p++ =3D 0x0F;
-//.. if (i->Xin.Bsfr32.isFwds) {
-//.. *p++ =3D 0xBC;
-//.. } else {
-//.. *p++ =3D 0xBD;
-//.. }
-//.. p =3D doAMode_R(p, i->Xin.Bsfr32.dst, i->Xin.Bsfr32.src);
-//.. goto done;
+ case Ain_Bsfr64:
+ *p++ =3D rexAMode_R(i->Ain.Bsfr64.dst, i->Ain.Bsfr64.src);
+ *p++ =3D 0x0F;
+ if (i->Ain.Bsfr64.isFwds) {
+ *p++ =3D 0xBC;
+ } else {
+ *p++ =3D 0xBD;
+ }
+ p =3D doAMode_R(p, i->Ain.Bsfr64.dst, i->Ain.Bsfr64.src);
+ goto done;
=20
case Ain_MFence:
/* mfence */
Modified: trunk/priv/host-amd64/hdefs.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-amd64/hdefs.h 2005-04-06 10:27:11 UTC (rev 1124)
+++ trunk/priv/host-amd64/hdefs.h 2005-04-06 20:01:56 UTC (rev 1125)
@@ -370,7 +370,7 @@
Ain_LoadEX, /* mov{s,z}{b,w,l}q from mem to reg */
Ain_Store, /* store 32/16/8 bit value in memory */
Ain_Set64, /* convert condition code to 32-bit value */
-//.. Xin_Bsfr32, /* 32-bit bsf/bsr */
+ Ain_Bsfr64, /* 64-bit bsf/bsr */
Ain_MFence, /* mem fence */
//..=20
//.. Xin_FpUnary, /* FP fake unary op */
@@ -503,12 +503,12 @@
AMD64CondCode cond;
HReg dst;
} Set64;
-//.. /* 32-bit bsf or bsr. */
-//.. struct {
-//.. Bool isFwds;
-//.. HReg src;
-//.. HReg dst;
-//.. } Bsfr32;
+ /* 64-bit bsf or bsr. */
+ struct {
+ Bool isFwds;
+ HReg src;
+ HReg dst;
+ } Bsfr64;
/* Mem fence. In short, an insn which flushes all preceding
loads and stores as much as possible before continuing.
On AMD64 we emit a real "mfence". */
@@ -670,7 +670,7 @@
AMD64AMode* src, HReg dst );
extern AMD64Instr* AMD64Instr_Store ( UChar sz, HReg src, AMD64AMode=
* dst );
extern AMD64Instr* AMD64Instr_Set64 ( AMD64CondCode cond, HReg dst )=
;
-//.. extern AMD64Instr* AMD64Instr_Bsfr32 ( Bool isFwds, HReg src, HR=
eg dst );
+extern AMD64Instr* AMD64Instr_Bsfr64 ( Bool isFwds, HReg src, HReg ds=
t );
extern AMD64Instr* AMD64Instr_MFence ( void );
//..=20
//.. extern AMD64Instr* AMD64Instr_FpUnary ( AMD64FpOp op, HReg src, H=
Reg dst );
Modified: trunk/priv/host-amd64/isel.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-amd64/isel.c 2005-04-06 10:27:11 UTC (rev 1124)
+++ trunk/priv/host-amd64/isel.c 2005-04-06 20:01:56 UTC (rev 1125)
@@ -1276,12 +1276,12 @@
return dst;
}
//.. case Iop_1Uto32:
-//.. case Iop_1Uto8: {
-//.. HReg dst =3D newVRegI(env);
-//.. X86CondCode cond =3D iselCondCode(env, e->Iex.Unop.arg)=
;
-//.. addInstr(env, X86Instr_Set32(cond,dst));
-//.. return dst;
-//.. }
+ case Iop_1Uto8: {
+ HReg dst =3D newVRegI(env);
+ AMD64CondCode cond =3D iselCondCode(env, e->Iex.Unop.arg);
+ addInstr(env, AMD64Instr_Set64(cond,dst));
+ return dst;
+ }
//.. case Iop_1Sto8:
//.. case Iop_1Sto16:
//.. case Iop_1Sto32: {
@@ -1293,13 +1293,13 @@
//.. addInstr(env, X86Instr_Sh32(Xsh_SAR, 31, X86RM_Reg(dst)=
));
//.. return dst;
//.. }
-//.. case Iop_Ctz32: {
-//.. /* Count trailing zeroes, implemented by x86 'bsfl' */
-//.. HReg dst =3D newVRegI(env);
-//.. HReg src =3D iselIntExpr_R(env, e->Iex.Unop.arg);
-//.. addInstr(env, X86Instr_Bsfr32(True,src,dst));
-//.. return dst;
-//.. }
+ case Iop_Ctz64: {
+ /* Count trailing zeroes, implemented by amd64 'bsfq' */
+ HReg dst =3D newVRegI(env);
+ HReg src =3D iselIntExpr_R(env, e->Iex.Unop.arg);
+ addInstr(env, AMD64Instr_Bsfr64(True,src,dst));
+ return dst;
+ }
//.. case Iop_Clz32: {
//.. /* Count leading zeroes. Do 'bsrl' to establish the in=
dex
//.. of the highest set bit, and subtract that value from
Modified: trunk/priv/ir/irdefs.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/ir/irdefs.c 2005-04-06 10:27:11 UTC (rev 1124)
+++ trunk/priv/ir/irdefs.c 2005-04-06 20:01:56 UTC (rev 1125)
@@ -161,7 +161,9 @@
case Iop_MullU32: vex_printf("MullU32"); return;
case Iop_MullU64: vex_printf("MullU64"); return;
=20
+ case Iop_Clz64: vex_printf("Clz64"); return;
case Iop_Clz32: vex_printf("Clz32"); return;
+ case Iop_Ctz64: vex_printf("Ctz64"); return;
case Iop_Ctz32: vex_printf("Ctz32"); return;
=20
case Iop_CmpLT32S: vex_printf("CmpLT32S"); return;
@@ -1283,6 +1285,9 @@
case Iop_Clz32: case Iop_Ctz32:
UNARY(Ity_I32,Ity_I32);
=20
+ case Iop_Clz64: case Iop_Ctz64:
+ UNARY(Ity_I64,Ity_I64);
+
case Iop_DivU32: case Iop_DivS32:
BINARY(Ity_I32, Ity_I32,Ity_I32);
=20
Modified: trunk/pub/libvex_ir.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/pub/libvex_ir.h 2005-04-06 10:27:11 UTC (rev 1124)
+++ trunk/pub/libvex_ir.h 2005-04-06 20:01:56 UTC (rev 1125)
@@ -223,10 +223,10 @@
Iop_MullU8, Iop_MullU16, Iop_MullU32, Iop_MullU64,
=20
/* Wierdo integer stuff */
- Iop_Clz32, /* count leading zeroes */
- Iop_Ctz32, /* count trailing zeros */
- /* Ctz32/Clz32 are UNDEFINED when given arguments of zero.
- You must ensure they are never given a zero argument.=20
+ Iop_Clz64, Iop_Clz32, /* count leading zeroes */
+ Iop_Ctz64, Iop_Ctz32, /* count trailing zeros */
+ /* Ctz64/Ctz32/Clz64/Clz32 are UNDEFINED when given arguments of
+ zero. You must ensure they are never given a zero argument.
*/
=20
/* Ordering not important after here. */
|
|
From: <sv...@va...> - 2005-04-06 10:27:16
|
Author: sewardj
Date: 2005-04-06 11:27:11 +0100 (Wed, 06 Apr 2005)
New Revision: 1124
Modified:
trunk/priv/guest-x86/toIR.c
Log:
Comment-only changes
Modified: trunk/priv/guest-x86/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-x86/toIR.c 2005-04-06 01:45:44 UTC (rev 1123)
+++ trunk/priv/guest-x86/toIR.c 2005-04-06 10:27:11 UTC (rev 1124)
@@ -34,7 +34,7 @@
*/
=20
/* TODO:
- SBB reg with itself
+ SBB reg with itself (copy from amd64 front end)
=20
check flag settings for cmpxchg
FUCOMI(P): what happens to A and S flags? Currently are forced
@@ -64,7 +64,7 @@
zeroes all the FP registers. It should leave the registers
unchanged.
=20
- RDTSC returns zero, always.
+ RDTSC returns one, always.
=20
SAHF should cause eflags[1] =3D=3D 1, and in fact it produces 0. As
per Intel docs this bit has no meaning anyway. Since PUSHF is the
@@ -80,6 +80,21 @@
translate x86 code for execution on a 64-bit host.
*/
=20
+/* Performance holes:
+
+ - fcom ; fstsw %ax ; sahf
+ sahf does not update the O flag (sigh) and so O needs to
+ be computed. This is done expensively; it would be better
+ to have a calculate_eflags_o helper.
+
+ - emwarns; some FP codes can generate huge numbers of these
+ if the fpucw is changed in an inner loop. It would be
+ better for the guest state to have an emwarn-enable reg
+ which can be set zero or nonzero. If it is zero, emwarns
+ are not flagged, and instead control just flows all the
+ way through bbs as usual.
+*/
+
/* Translates x86 code to IR. */
=20
#include "libvex_basictypes.h"
|
|
From: <js...@ac...> - 2005-04-06 03:07:32
|
Nightly build on phoenix ( SuSE 9.1 ) started at 2005-04-06 03:50:01 BST Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow insn_mmx: valgrind ./insn_mmx insn_mmxext: (skipping, prereq failed: ../../../tests/cputest x86-mmxext) insn_sse: valgrind ./insn_sse insn_sse2: (skipping, prereq failed: ../../../tests/cputest x86-sse2) int: valgrind ./int pushpopseg: valgrind ./pushpopseg rcl_assert: valgrind ./rcl_assert seg_override: valgrind ./seg_override -- Finished tests in none/tests/x86 ------------------------------------ yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 201 tests, 5 stderr failures, 0 stdout failures ================= memcheck/tests/pth_once (stderr) memcheck/tests/scalar (stderr) memcheck/tests/threadederrno (stderr) memcheck/tests/writev (stderr) corecheck/tests/fdleak_fcntl (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <to...@co...> - 2005-04-06 02:36:50
|
Nightly build on dunsmere ( athlon, Fedora Core 3 ) started at 2005-04-06 03:30:03 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 185 tests, 78 stderr failures, 2 stdout failures ================= memcheck/tests/addressable (stderr) memcheck/tests/badaddrvalue (stderr) memcheck/tests/badfree-2trace (stderr) memcheck/tests/badfree (stderr) memcheck/tests/badjump (stderr) memcheck/tests/badjump2 (stderr) memcheck/tests/badloop (stderr) memcheck/tests/badpoll (stderr) memcheck/tests/badrw (stderr) memcheck/tests/brk (stderr) memcheck/tests/brk2 (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/clientperm (stderr) memcheck/tests/custom_alloc (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/doublefree (stderr) memcheck/tests/error_counts (stdout) memcheck/tests/errs1 (stderr) memcheck/tests/execve (stderr) memcheck/tests/execve2 (stderr) memcheck/tests/exitprog (stderr) memcheck/tests/fprw (stderr) memcheck/tests/fwrite (stderr) memcheck/tests/inits (stderr) memcheck/tests/inline (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/malloc1 (stderr) memcheck/tests/malloc2 (stderr) memcheck/tests/malloc3 (stderr) memcheck/tests/manuel1 (stderr) memcheck/tests/manuel2 (stderr) memcheck/tests/manuel3 (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/memalign2 (stderr) memcheck/tests/memalign_test (stderr) memcheck/tests/memcmptest (stderr) memcheck/tests/mempool (stderr) memcheck/tests/metadata (stderr) memcheck/tests/mismatches (stderr) memcheck/tests/mmaptest (stderr) memcheck/tests/nanoleak (stderr) memcheck/tests/nanoleak_supp (stderr) memcheck/tests/new_nothrow (stderr) memcheck/tests/new_override (stderr) memcheck/tests/null_socket (stderr) memcheck/tests/overlap (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/post-syscall (stderr) memcheck/tests/realloc1 (stderr) memcheck/tests/realloc2 (stderr) memcheck/tests/realloc3 (stderr) memcheck/tests/scalar (stderr) memcheck/tests/scalar_exit_group (stderr) memcheck/tests/scalar_fork (stderr) memcheck/tests/scalar_supp (stderr) memcheck/tests/scalar_vfork (stderr) memcheck/tests/sigaltstack (stderr) memcheck/tests/signal2 (stderr) memcheck/tests/sigprocmask (stderr) memcheck/tests/str_tester (stderr) memcheck/tests/supp1 (stderr) memcheck/tests/supp2 (stderr) memcheck/tests/suppfree (stderr) memcheck/tests/threadederrno (stderr) memcheck/tests/toobig-allocs (stderr) memcheck/tests/trivialleak (stderr) memcheck/tests/vgtest_ume (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/writev (stderr) memcheck/tests/x86/fpeflags (stderr) memcheck/tests/x86/pushfpopf (stderr) memcheck/tests/x86/tronical (stderr) memcheck/tests/zeropage (stderr) none/tests/faultstatus (stderr) none/tests/selfrun (stdout) none/tests/selfrun (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-04-06 02:31:36
|
Nightly build on audi ( i686, Red Hat 9 ) started at 2005-04-06 03:25:02 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 184 tests, 3 stderr failures, 1 stdout failure ================= memcheck/tests/scalar (stderr) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) none/tests/yield (stdout) |
|
From: Tom H. <th...@cy...> - 2005-04-06 02:25:56
|
Nightly build on ginetta ( i686, Red Hat 8.0 ) started at 2005-04-06 03:20:02 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 183 tests, 4 stderr failures, 0 stdout failures ================= memcheck/tests/scalar (stderr) memcheck/tests/threadederrno (stderr) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-04-06 02:20:40
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2005-04-06 03:15:02 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 183 tests, 17 stderr failures, 0 stdout failures ================= memcheck/tests/addressable (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/scalar (stderr) memcheck/tests/threadederrno (stderr) memcheck/tests/vgtest_ume (stderr) addrcheck/tests/leak-0 (stderr) addrcheck/tests/leak-cycle (stderr) addrcheck/tests/leak-regroot (stderr) addrcheck/tests/leak-tree (stderr) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-04-06 02:13:59
|
Nightly build on honda ( x86_64, Fedora Core 3 ) started at 2005-04-06 03:10:03 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 165 tests, 82 stderr failures, 22 stdout failures ================= memcheck/tests/addressable (stdout) memcheck/tests/addressable (stderr) memcheck/tests/badaddrvalue (stdout) memcheck/tests/badaddrvalue (stderr) memcheck/tests/badfree-2trace (stderr) memcheck/tests/badfree (stderr) memcheck/tests/badjump (stderr) memcheck/tests/badjump2 (stderr) memcheck/tests/badloop (stderr) memcheck/tests/badpoll (stderr) memcheck/tests/badrw (stderr) memcheck/tests/brk (stderr) memcheck/tests/brk2 (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/clientperm (stdout) memcheck/tests/clientperm (stderr) memcheck/tests/custom_alloc (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/doublefree (stderr) memcheck/tests/error_counts (stdout) memcheck/tests/errs1 (stderr) memcheck/tests/execve (stderr) memcheck/tests/execve2 (stderr) memcheck/tests/exitprog (stderr) memcheck/tests/fprw (stderr) memcheck/tests/fwrite (stdout) memcheck/tests/fwrite (stderr) memcheck/tests/inits (stderr) memcheck/tests/inline (stdout) memcheck/tests/inline (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/leakotron (stdout) memcheck/tests/malloc1 (stderr) memcheck/tests/malloc2 (stderr) memcheck/tests/malloc3 (stdout) memcheck/tests/malloc3 (stderr) memcheck/tests/manuel1 (stdout) memcheck/tests/manuel1 (stderr) memcheck/tests/manuel2 (stdout) memcheck/tests/manuel2 (stderr) memcheck/tests/manuel3 (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/memalign_test (stderr) memcheck/tests/memcmptest (stdout) memcheck/tests/memcmptest (stderr) memcheck/tests/mempool (stderr) memcheck/tests/metadata (stdout) memcheck/tests/metadata (stderr) memcheck/tests/mismatches (stderr) memcheck/tests/nanoleak (stderr) memcheck/tests/new_override (stdout) memcheck/tests/new_override (stderr) memcheck/tests/overlap (stdout) memcheck/tests/overlap (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/post-syscall (stdout) memcheck/tests/post-syscall (stderr) memcheck/tests/realloc3 (stderr) memcheck/tests/scalar (stderr) memcheck/tests/scalar_exit_group (stderr) memcheck/tests/scalar_fork (stderr) memcheck/tests/scalar_supp (stderr) memcheck/tests/scalar_vfork (stderr) memcheck/tests/sigaltstack (stderr) memcheck/tests/signal2 (stdout) memcheck/tests/signal2 (stderr) memcheck/tests/sigprocmask (stderr) memcheck/tests/supp2 (stderr) memcheck/tests/suppfree (stderr) memcheck/tests/threadederrno (stdout) memcheck/tests/toobig-allocs (stderr) memcheck/tests/trivialleak (stderr) memcheck/tests/vgtest_ume (stderr) memcheck/tests/weirdioctl (stdout) memcheck/tests/weirdioctl (stderr) memcheck/tests/writev (stderr) memcheck/tests/zeropage (stdout) addrcheck/tests/addressable (stdout) addrcheck/tests/addressable (stderr) addrcheck/tests/badrw (stderr) addrcheck/tests/fprw (stderr) addrcheck/tests/leak-0 (stderr) addrcheck/tests/leak-cycle (stderr) addrcheck/tests/leak-regroot (stderr) addrcheck/tests/leak-tree (stderr) addrcheck/tests/overlap (stdout) addrcheck/tests/overlap (stderr) addrcheck/tests/toobig-allocs (stderr) corecheck/tests/fdleak_cmsg (stderr) corecheck/tests/fdleak_creat (stderr) corecheck/tests/fdleak_dup (stderr) corecheck/tests/fdleak_dup2 (stderr) corecheck/tests/fdleak_fcntl (stderr) corecheck/tests/fdleak_ipv4 (stderr) corecheck/tests/fdleak_open (stderr) corecheck/tests/fdleak_pipe (stderr) corecheck/tests/fdleak_socketpair (stderr) massif/tests/toobig-allocs (stderr) none/tests/faultstatus (stderr) none/tests/selfrun (stdout) none/tests/selfrun (stderr) |
|
From: Tom H. <th...@cy...> - 2005-04-06 02:13:36
|
Nightly build on standard ( i686, Red Hat 7.2 ) started at 2005-04-06 03:10:02 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 183 tests, 175 stderr failures, 68 stdout failures ================= memcheck/tests/addressable (stdout) memcheck/tests/addressable (stderr) memcheck/tests/badaddrvalue (stdout) memcheck/tests/badaddrvalue (stderr) memcheck/tests/badfree-2trace (stderr) memcheck/tests/badfree (stderr) memcheck/tests/badjump (stderr) memcheck/tests/badjump2 (stderr) memcheck/tests/badloop (stderr) memcheck/tests/badpoll (stderr) memcheck/tests/badrw (stderr) memcheck/tests/brk (stderr) memcheck/tests/brk2 (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/clientperm (stdout) memcheck/tests/clientperm (stderr) memcheck/tests/custom_alloc (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/doublefree (stderr) memcheck/tests/error_counts (stdout) memcheck/tests/errs1 (stderr) memcheck/tests/execve (stderr) memcheck/tests/execve2 (stderr) memcheck/tests/exitprog (stderr) memcheck/tests/fprw (stderr) memcheck/tests/fwrite (stdout) memcheck/tests/fwrite (stderr) memcheck/tests/inits (stderr) memcheck/tests/inline (stdout) memcheck/tests/inline (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/leakotron (stdout) memcheck/tests/malloc1 (stderr) memcheck/tests/malloc2 (stderr) memcheck/tests/malloc3 (stdout) memcheck/tests/malloc3 (stderr) memcheck/tests/manuel1 (stdout) memcheck/tests/manuel1 (stderr) memcheck/tests/manuel2 (stdout) memcheck/tests/manuel2 (stderr) memcheck/tests/manuel3 (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/memalign2 (stderr) memcheck/tests/memalign_test (stderr) memcheck/tests/memcmptest (stdout) memcheck/tests/memcmptest (stderr) memcheck/tests/mempool (stderr) memcheck/tests/metadata (stdout) memcheck/tests/metadata (stderr) memcheck/tests/mismatches (stderr) memcheck/tests/mmaptest (stderr) memcheck/tests/nanoleak (stderr) memcheck/tests/nanoleak_supp (stderr) memcheck/tests/new_nothrow (stderr) memcheck/tests/new_override (stdout) memcheck/tests/new_override (stderr) memcheck/tests/null_socket (stderr) memcheck/tests/overlap (stdout) memcheck/tests/overlap (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/post-syscall (stdout) memcheck/tests/post-syscall (stderr) memcheck/tests/realloc1 (stderr) memcheck/tests/realloc2 (stderr) memcheck/tests/realloc3 (stderr) memcheck/tests/scalar (stderr) memcheck/tests/scalar_exit_group (stderr) memcheck/tests/scalar_fork (stderr) memcheck/tests/scalar_supp (stderr) memcheck/tests/scalar_vfork (stderr) memcheck/tests/sigaltstack (stderr) memcheck/tests/signal2 (stdout) memcheck/tests/signal2 (stderr) memcheck/tests/sigprocmask (stderr) memcheck/tests/str_tester (stderr) memcheck/tests/supp1 (stderr) memcheck/tests/supp2 (stderr) memcheck/tests/suppfree (stderr) memcheck/tests/threadederrno (stdout) memcheck/tests/threadederrno (stderr) memcheck/tests/toobig-allocs (stderr) memcheck/tests/trivialleak (stderr) memcheck/tests/vgtest_ume (stderr) memcheck/tests/weirdioctl (stdout) memcheck/tests/weirdioctl (stderr) memcheck/tests/writev (stderr) memcheck/tests/x86/fpeflags (stderr) memcheck/tests/x86/pushfpopf (stdout) memcheck/tests/x86/pushfpopf (stderr) memcheck/tests/x86/tronical (stderr) memcheck/tests/zeropage (stdout) memcheck/tests/zeropage (stderr) addrcheck/tests/addressable (stdout) addrcheck/tests/addressable (stderr) addrcheck/tests/badrw (stderr) addrcheck/tests/fprw (stderr) addrcheck/tests/leak-0 (stderr) addrcheck/tests/leak-cycle (stderr) addrcheck/tests/leak-regroot (stderr) addrcheck/tests/leak-tree (stderr) addrcheck/tests/overlap (stdout) addrcheck/tests/overlap (stderr) addrcheck/tests/toobig-allocs (stderr) cachegrind/tests/chdir (stderr) cachegrind/tests/dlclose (stdout) cachegrind/tests/dlclose (stderr) cachegrind/tests/x86/fpu-28-108 (stderr) corecheck/tests/as_mmap (stderr) corecheck/tests/as_shm (stdout) corecheck/tests/as_shm (stderr) corecheck/tests/erringfds (stdout) corecheck/tests/erringfds (stderr) corecheck/tests/fdleak_cmsg (stderr) corecheck/tests/fdleak_creat (stderr) corecheck/tests/fdleak_dup (stderr) corecheck/tests/fdleak_dup2 (stderr) corecheck/tests/fdleak_fcntl (stderr) corecheck/tests/fdleak_ipv4 (stdout) corecheck/tests/fdleak_ipv4 (stderr) corecheck/tests/fdleak_open (stderr) corecheck/tests/fdleak_pipe (stderr) corecheck/tests/fdleak_socketpair (stderr) corecheck/tests/pth_atfork1 (stdout) corecheck/tests/pth_atfork1 (stderr) corecheck/tests/pth_cancel1 (stdout) corecheck/tests/pth_cancel1 (stderr) corecheck/tests/pth_cancel2 (stderr) corecheck/tests/pth_cvsimple (stdout) corecheck/tests/pth_cvsimple (stderr) corecheck/tests/pth_empty (stderr) corecheck/tests/pth_exit (stderr) corecheck/tests/pth_exit2 (stderr) corecheck/tests/pth_mutexspeed (stdout) corecheck/tests/pth_mutexspeed (stderr) corecheck/tests/pth_once (stdout) corecheck/tests/pth_once (stderr) corecheck/tests/pth_rwlock (stderr) corecheck/tests/res_search (stdout) corecheck/tests/res_search (stderr) corecheck/tests/sigkill (stderr) corecheck/tests/vgprintf (stdout) corecheck/tests/vgprintf (stderr) massif/tests/toobig-allocs (stderr) massif/tests/true_html (stderr) massif/tests/true_text (stderr) lackey/tests/true (stderr) none/tests/args (stdout) none/tests/args (stderr) none/tests/async-sigs (stdout) none/tests/async-sigs (stderr) none/tests/bitfield1 (stderr) none/tests/blockfault (stderr) none/tests/closeall (stderr) none/tests/coolo_sigaction (stdout) none/tests/coolo_sigaction (stderr) none/tests/coolo_strlen (stderr) none/tests/discard (stdout) none/tests/discard (stderr) none/tests/exec-sigmask (stderr) none/tests/execve (stderr) none/tests/faultstatus (stderr) none/tests/fcntl_setown (stderr) none/tests/floored (stdout) none/tests/floored (stderr) none/tests/fork (stdout) none/tests/fork (stderr) none/tests/fucomip (stderr) none/tests/gxx304 (stderr) none/tests/manythreads (stdout) none/tests/manythreads (stderr) none/tests/map_unaligned (stderr) none/tests/map_unmap (stdout) none/tests/map_unmap (stderr) none/tests/mq (stderr) none/tests/mremap (stderr) none/tests/munmap_exe (stderr) none/tests/pending (stdout) none/tests/pending (stderr) none/tests/pth_blockedsig (stdout) none/tests/pth_blockedsig (stderr) none/tests/pth_stackalign (stdout) none/tests/pth_stackalign (stderr) none/tests/rcrl (stdout) none/tests/rcrl (stderr) none/tests/readline1 (stdout) none/tests/readline1 (stderr) none/tests/resolv (stdout) none/tests/resolv (stderr) none/tests/rlimit_nofile (stderr) none/tests/sem (stderr) none/tests/semlimit (stderr) none/tests/sha1_test (stderr) none/tests/shortpush (stderr) none/tests/shorts (stderr) none/tests/sigstackgrowth (stdout) none/tests/sigstackgrowth (stderr) none/tests/smc1 (stdout) none/tests/smc1 (stderr) none/tests/stackgrowth (stdout) none/tests/stackgrowth (stderr) none/tests/syscall-restart1 (stderr) none/tests/syscall-restart2 (stderr) none/tests/system (stderr) none/tests/thread-exits (stdout) none/tests/thread-exits (stderr) none/tests/threaded-fork (stdout) none/tests/threaded-fork (stderr) none/tests/x86/badseg (stdout) none/tests/x86/badseg (stderr) none/tests/x86/bt_everything (stdout) none/tests/x86/bt_everything (stderr) none/tests/x86/bt_literal (stdout) none/tests/x86/bt_literal (stderr) none/tests/x86/cpuid (stdout) none/tests/x86/cpuid (stderr) none/tests/x86/fpu_lazy_eflags (stdout) none/tests/x86/fpu_lazy_eflags (stderr) none/tests/x86/getseg (stdout) none/tests/x86/getseg (stderr) none/tests/x86/insn_basic (stdout) none/tests/x86/insn_basic (stderr) none/tests/x86/insn_cmov (stdout) none/tests/x86/insn_cmov (stderr) none/tests/x86/insn_fpu (stdout) none/tests/x86/insn_fpu (stderr) none/tests/x86/insn_mmx (stdout) none/tests/x86/insn_mmx (stderr) none/tests/x86/insn_mmxext (stdout) none/tests/x86/insn_mmxext (stderr) none/tests/x86/insn_sse (stdout) none/tests/x86/insn_sse (stderr) none/tests/x86/int (stderr) none/tests/x86/pushpopseg (stdout) none/tests/x86/pushpopseg (stderr) none/tests/x86/seg_override (stdout) none/tests/x86/seg_override (stderr) none/tests/x86/sigcontext (stdout) none/tests/x86/sigcontext (stderr) none/tests/yield (stdout) none/tests/yield (stderr) |
|
From: Tom H. <th...@cy...> - 2005-04-06 02:03:01
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2005-04-06 03:00:03 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 165 tests, 82 stderr failures, 22 stdout failures ================= memcheck/tests/addressable (stdout) memcheck/tests/addressable (stderr) memcheck/tests/badaddrvalue (stdout) memcheck/tests/badaddrvalue (stderr) memcheck/tests/badfree-2trace (stderr) memcheck/tests/badfree (stderr) memcheck/tests/badjump (stderr) memcheck/tests/badjump2 (stderr) memcheck/tests/badloop (stderr) memcheck/tests/badpoll (stderr) memcheck/tests/badrw (stderr) memcheck/tests/brk (stderr) memcheck/tests/brk2 (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/clientperm (stdout) memcheck/tests/clientperm (stderr) memcheck/tests/custom_alloc (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/doublefree (stderr) memcheck/tests/error_counts (stdout) memcheck/tests/errs1 (stderr) memcheck/tests/execve (stderr) memcheck/tests/execve2 (stderr) memcheck/tests/exitprog (stderr) memcheck/tests/fprw (stderr) memcheck/tests/fwrite (stdout) memcheck/tests/fwrite (stderr) memcheck/tests/inits (stderr) memcheck/tests/inline (stdout) memcheck/tests/inline (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/leakotron (stdout) memcheck/tests/malloc1 (stderr) memcheck/tests/malloc2 (stderr) memcheck/tests/malloc3 (stdout) memcheck/tests/malloc3 (stderr) memcheck/tests/manuel1 (stdout) memcheck/tests/manuel1 (stderr) memcheck/tests/manuel2 (stdout) memcheck/tests/manuel2 (stderr) memcheck/tests/manuel3 (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/memalign_test (stderr) memcheck/tests/memcmptest (stdout) memcheck/tests/memcmptest (stderr) memcheck/tests/mempool (stderr) memcheck/tests/metadata (stdout) memcheck/tests/metadata (stderr) memcheck/tests/mismatches (stderr) memcheck/tests/nanoleak (stderr) memcheck/tests/new_override (stdout) memcheck/tests/new_override (stderr) memcheck/tests/overlap (stdout) memcheck/tests/overlap (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/post-syscall (stdout) memcheck/tests/post-syscall (stderr) memcheck/tests/realloc3 (stderr) memcheck/tests/scalar (stderr) memcheck/tests/scalar_exit_group (stderr) memcheck/tests/scalar_fork (stderr) memcheck/tests/scalar_supp (stderr) memcheck/tests/scalar_vfork (stderr) memcheck/tests/sigaltstack (stderr) memcheck/tests/signal2 (stdout) memcheck/tests/signal2 (stderr) memcheck/tests/sigprocmask (stderr) memcheck/tests/supp2 (stderr) memcheck/tests/suppfree (stderr) memcheck/tests/threadederrno (stdout) memcheck/tests/toobig-allocs (stderr) memcheck/tests/trivialleak (stderr) memcheck/tests/vgtest_ume (stderr) memcheck/tests/weirdioctl (stdout) memcheck/tests/weirdioctl (stderr) memcheck/tests/writev (stderr) memcheck/tests/zeropage (stdout) addrcheck/tests/addressable (stdout) addrcheck/tests/addressable (stderr) addrcheck/tests/badrw (stderr) addrcheck/tests/fprw (stderr) addrcheck/tests/leak-0 (stderr) addrcheck/tests/leak-cycle (stderr) addrcheck/tests/leak-regroot (stderr) addrcheck/tests/leak-tree (stderr) addrcheck/tests/overlap (stdout) addrcheck/tests/overlap (stderr) addrcheck/tests/toobig-allocs (stderr) corecheck/tests/fdleak_cmsg (stderr) corecheck/tests/fdleak_creat (stderr) corecheck/tests/fdleak_dup (stderr) corecheck/tests/fdleak_dup2 (stderr) corecheck/tests/fdleak_fcntl (stderr) corecheck/tests/fdleak_ipv4 (stderr) corecheck/tests/fdleak_open (stderr) corecheck/tests/fdleak_pipe (stderr) corecheck/tests/fdleak_socketpair (stderr) massif/tests/toobig-allocs (stderr) none/tests/faultstatus (stderr) none/tests/selfrun (stdout) none/tests/selfrun (stderr) |
|
From: <sv...@va...> - 2005-04-06 01:45:48
|
Author: sewardj
Date: 2005-04-06 02:45:44 +0100 (Wed, 06 Apr 2005)
New Revision: 1123
Modified:
trunk/priv/guest-x86/toIR.c
Log:
As per r1121, avoid WaW stalls writing the guest state for movss mem->reg=
.
Modified: trunk/priv/guest-x86/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-x86/toIR.c 2005-04-06 01:11:53 UTC (rev 1122)
+++ trunk/priv/guest-x86/toIR.c 2005-04-06 01:45:44 UTC (rev 1123)
@@ -7805,7 +7805,11 @@
delta +=3D 3+1;
} else {
addr =3D disAMode ( &alen, sorb, delta+3, dis_buf );
- putXMMReg( gregOfRM(modrm), mkV128(0) );
+ /* zero bits 127:64 */
+ putXMMRegLane64( gregOfRM(modrm), 1, mkU64(0) );=20
+ /* zero bits 63:32 */
+ putXMMRegLane32( gregOfRM(modrm), 1, mkU32(0) );=20
+ /* write bits 31:0 */
putXMMRegLane32( gregOfRM(modrm), 0,
loadLE(Ity_I32, mkexpr(addr)) );
DIP("movss %s,%s\n", dis_buf,
@@ -9278,7 +9282,9 @@
delta +=3D 3+1;
} else {
addr =3D disAMode ( &alen, sorb, delta+3, dis_buf );
+ /* zero bits 127:64 */
putXMMRegLane64( gregOfRM(modrm), 1, mkU64(0) );
+ /* write bits 63:0 */
putXMMRegLane64( gregOfRM(modrm), 0,
loadLE(Ity_I64, mkexpr(addr)) );
DIP("movsd %s,%s\n", dis_buf,
|
|
From: <sv...@va...> - 2005-04-06 01:11:57
|
Author: sewardj
Date: 2005-04-06 02:11:53 +0100 (Wed, 06 Apr 2005)
New Revision: 1122
Modified:
trunk/priv/host-x86/isel.c
Log:
iselIntExpr64(const): save a precious register in the case where
the two halves have the same value.
Modified: trunk/priv/host-x86/isel.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-x86/isel.c 2005-04-06 01:11:08 UTC (rev 1121)
+++ trunk/priv/host-x86/isel.c 2005-04-06 01:11:53 UTC (rev 1122)
@@ -1691,10 +1691,17 @@
HReg tLo =3D newVRegI(env);
HReg tHi =3D newVRegI(env);
vassert(e->Iex.Const.con->tag =3D=3D Ico_U64);
- addInstr(env, X86Instr_Alu32R(Xalu_MOV, X86RMI_Imm(wHi), tHi));
- addInstr(env, X86Instr_Alu32R(Xalu_MOV, X86RMI_Imm(wLo), tLo));
- *rHi =3D tHi;
- *rLo =3D tLo;
+ if (wLo =3D=3D wHi) {
+ /* Save a precious Int register in this special case. */
+ addInstr(env, X86Instr_Alu32R(Xalu_MOV, X86RMI_Imm(wLo), tLo));
+ *rHi =3D tLo;
+ *rLo =3D tLo;
+ } else {
+ addInstr(env, X86Instr_Alu32R(Xalu_MOV, X86RMI_Imm(wHi), tHi));
+ addInstr(env, X86Instr_Alu32R(Xalu_MOV, X86RMI_Imm(wLo), tLo));
+ *rHi =3D tHi;
+ *rLo =3D tLo;
+ }
return;
}
=20
|
|
From: <sv...@va...> - 2005-04-06 01:11:14
|
Author: sewardj
Date: 2005-04-06 02:11:08 +0100 (Wed, 06 Apr 2005)
New Revision: 1121
Modified:
trunk/priv/guest-x86/toIR.c
Log:
When generating IR for movsd mem->reg, don't first write the entire
guest reg with zeroes and then overwrite the lower half. This forces
the back end to generate code which creates huge write-after-write
stalls in the memory system of P4s due to the different sized writes.
This apparently small change reduces the run-time of one
sse2-intensive floating point program from 145 seconds to 90 seconds
(--tool=3Dnone).
Modified: trunk/priv/guest-x86/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-x86/toIR.c 2005-04-06 00:47:01 UTC (rev 1120)
+++ trunk/priv/guest-x86/toIR.c 2005-04-06 01:11:08 UTC (rev 1121)
@@ -9278,7 +9278,7 @@
delta +=3D 3+1;
} else {
addr =3D disAMode ( &alen, sorb, delta+3, dis_buf );
- putXMMReg( gregOfRM(modrm), mkV128(0) );
+ putXMMRegLane64( gregOfRM(modrm), 1, mkU64(0) );
putXMMRegLane64( gregOfRM(modrm), 0,
loadLE(Ity_I64, mkexpr(addr)) );
DIP("movsd %s,%s\n", dis_buf,
|
|
From: <sv...@va...> - 2005-04-06 00:47:10
|
Author: sewardj
Date: 2005-04-06 01:47:01 +0100 (Wed, 06 Apr 2005)
New Revision: 1120
Modified:
trunk/priv/host-x86/isel.c
Log:
Add a pattern for 64UtoV128(LDle:I64(addr)), so as to generate a
single movsd. This fixes a common, poorly handed case in generating
sse2 code.
Modified: trunk/priv/host-x86/isel.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-x86/isel.c 2005-04-05 01:54:19 UTC (rev 1119)
+++ trunk/priv/host-x86/isel.c 2005-04-06 00:47:01 UTC (rev 1120)
@@ -2669,9 +2669,14 @@
goto vec_fail; \
} while (0)
=20
- Bool arg1isEReg =3D False;
- X86SseOp op =3D Xsse_INVALID;
- IRType ty =3D typeOfIRExpr(env->type_env,e);
+# define SSE2_OR_ABOVE \
+ (env->subarch !=3D VexSubArchX86_sse0 \
+ && env->subarch !=3D VexSubArchX86_sse1)
+
+ MatchInfo mi;
+ Bool arg1isEReg =3D False;
+ X86SseOp op =3D Xsse_INVALID;
+ IRType ty =3D typeOfIRExpr(env->type_env,e);
vassert(e);
vassert(ty =3D=3D Ity_V128);
=20
@@ -2707,6 +2712,20 @@
}
=20
if (e->tag =3D=3D Iex_Unop) {
+
+ if (SSE2_OR_ABOVE) {=20
+ /* 64UtoV128(LDle:I64(addr)) */
+ DECLARE_PATTERN(p_zwiden_load64);
+ DEFINE_PATTERN(p_zwiden_load64,
+ unop(Iop_64UtoV128, IRExpr_LDle(Ity_I64,bind(0))));
+ if (matchIRExpr(&mi, p_zwiden_load64, e)) {
+ X86AMode* am =3D iselIntExpr_AMode(env, mi.bindee[0]);
+ HReg dst =3D newVRegV(env);
+ addInstr(env, X86Instr_SseLdzLO(8, dst, am));
+ return dst;
+ }
+ }
+
switch (e->Iex.Unop.op) {
=20
case Iop_NotV128: {
@@ -3139,6 +3158,7 @@
=20
# undef REQUIRE_SSE1
# undef REQUIRE_SSE2
+# undef SSE2_OR_ABOVE
}
=20
=20
|