Yet more SSE insns.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1696 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_from_ucode.c b/coregrind/vg_from_ucode.c
index af63fa2..8b699e6 100644
--- a/coregrind/vg_from_ucode.c
+++ b/coregrind/vg_from_ucode.c
@@ -1563,11 +1563,11 @@
}
static void emit_SSE4 ( FlagSet uses_sflags,
- FlagSet sets_sflags,
- UChar first_byte,
- UChar second_byte,
- UChar third_byte,
- UChar fourth_byte )
+ FlagSet sets_sflags,
+ UChar first_byte,
+ UChar second_byte,
+ UChar third_byte,
+ UChar fourth_byte )
{
VG_(new_emit)(True, uses_sflags, sets_sflags);
VG_(emitB) ( first_byte );
@@ -1581,12 +1581,12 @@
}
static void emit_SSE5 ( FlagSet uses_sflags,
- FlagSet sets_sflags,
- UChar first_byte,
- UChar second_byte,
- UChar third_byte,
- UChar fourth_byte,
- UChar fifth_byte )
+ FlagSet sets_sflags,
+ UChar first_byte,
+ UChar second_byte,
+ UChar third_byte,
+ UChar fourth_byte,
+ UChar fifth_byte )
{
VG_(new_emit)(True, uses_sflags, sets_sflags);
VG_(emitB) ( first_byte );
@@ -1602,10 +1602,10 @@
}
static void emit_SSE3 ( FlagSet uses_sflags,
- FlagSet sets_sflags,
- UChar first_byte,
- UChar second_byte,
- UChar third_byte )
+ FlagSet sets_sflags,
+ UChar first_byte,
+ UChar second_byte,
+ UChar third_byte )
{
VG_(new_emit)(True, uses_sflags, sets_sflags);
VG_(emitB) ( first_byte );
@@ -1617,6 +1617,28 @@
(UInt)third_byte );
}
+static void emit_SSE3ag_MemRd_RegWr ( FlagSet uses_sflags,
+ FlagSet sets_sflags,
+ UChar first_byte,
+ UChar second_byte,
+ UChar third_byte,
+ Int addr_reg,
+ Int dest_reg )
+{
+ VG_(new_emit)(True, uses_sflags, sets_sflags);
+ VG_(emitB) ( first_byte );
+ VG_(emitB) ( second_byte );
+ VG_(emitB) ( third_byte );
+ /* 4th byte can be completely synthesised from addr_reg and
+ dest_reg. */
+ emit_amode_regmem_reg ( addr_reg, dest_reg );
+ if (dis)
+ VG_(printf)("\n\t\tsse-0x%x:0x%x:0x%x(addr=%s, dest=%s)\n",
+ (UInt)first_byte, (UInt)second_byte,
+ (UInt)third_byte, nameIReg(4, addr_reg),
+ nameIReg(4, dest_reg));
+}
+
static void emit_MMX2_reg_to_mmxreg ( FlagSet uses_sflags,
FlagSet sets_sflags,
UChar first_byte,
@@ -3944,6 +3966,23 @@
u->val2 & 0xFF );
break;
+ case SSE3ag_MemRd_RegWr:
+ vg_assert(u->size == 4 || u->size == 8);
+ vg_assert(u->tag1 == RealReg);
+ vg_assert(u->tag2 == RealReg);
+ vg_assert(u->tag3 == NoValue);
+ vg_assert(!anyFlagUse(u));
+ if (!(*sselive)) {
+ emit_get_sse_state();
+ *sselive = True;
+ }
+ emit_SSE3ag_MemRd_RegWr ( u->flags_r, u->flags_w,
+ (u->lit32 >> 24) & 0xFF,
+ (u->lit32 >> 16) & 0xFF,
+ (u->lit32 >> 8) & 0xFF,
+ u->val1, u->val2 );
+ break;
+
default:
if (VG_(needs).extended_UCode) {
if (*sselive) {