519613 Valgrind incorrectly unpacks the result of sys_port (port_getn)
on error, leading to a ~60s wallclock time delay on every call
520482 Advertise POPCNT on x86 via CPUID
+520753 Advertise LZCNT via CPUID for x86 (32-bit) clients
520856 unhandled instruction bytes: 0x2E 0xFF 0x14 0x85
520861 Update FAQ for C++ standard library
extern void x86g_dirtyhelper_CPUID_mmxext ( VexGuestX86State* );
extern void x86g_dirtyhelper_CPUID_sse1 ( VexGuestX86State* );
extern void x86g_dirtyhelper_CPUID_sse2 ( VexGuestX86State* );
-extern void x86g_dirtyhelper_CPUID_sse3 ( VexGuestX86State* );
+extern void x86g_dirtyhelper_CPUID_sse3 ( VexGuestX86State*, UInt );
extern void x86g_dirtyhelper_FINIT ( VexGuestX86State* );
address sizes : 36 bits physical, 48 bits virtual
power management:
*/
-void x86g_dirtyhelper_CPUID_sse3 ( VexGuestX86State* st )
+void x86g_dirtyhelper_CPUID_sse3 ( VexGuestX86State* st,
+ UInt hasLZCNT )
{
# define SET_ABCD(_a,_b,_c,_d) \
do { st->guest_EAX = (UInt)(_a); \
case 0x80000000:
SET_ABCD(0x80000008, 0x00000000, 0x00000000, 0x00000000);
break;
- case 0x80000001:
- SET_ABCD(0x00000000, 0x00000000, 0x00000001, 0x20100000);
+ case 0x80000001: {
+ UInt ecx_extra = 0;
+ ecx_extra = hasLZCNT ? (1U << 5) : 0;
+ SET_ABCD(0x00000000, 0x00000000, 0x00000001 | ecx_extra,
+ 0x20100000);
break;
+ }
case 0x80000002:
SET_ABCD(0x65746e49, 0x2952286c, 0x726f4320, 0x4d542865);
break;
vpanic("disInstr(x86)(cpuid)");
vassert(fName); vassert(fAddr);
- d = unsafeIRDirty_0_N ( 0/*regparms*/,
- fName, fAddr, mkIRExprVec_1(IRExpr_GSPTR()) );
+ IRExpr** args = NULL;
+ if (fAddr == &x86g_dirtyhelper_CPUID_sse3) {
+ Bool hasLZCNT = (archinfo->hwcaps & VEX_HWCAPS_X86_LZCNT) != 0;
+ args = mkIRExprVec_2(IRExpr_GSPTR(),
+ mkIRExpr_HWord(hasLZCNT ? 1 : 0));
+ } else {
+ args = mkIRExprVec_1(IRExpr_GSPTR());
+ }
+ d = unsafeIRDirty_0_N ( 0/*regparms*/, fName, fAddr, args );
/* declare guest state effects */
d->nFxState = 4;
vex_bzero(&d->fxState, sizeof(d->fxState));