|
From: <sv...@va...> - 2012-05-26 01:59:29
|
florian 2012-05-26 02:59:21 +0100 (Sat, 26 May 2012)
New Revision: 2352
Log:
Take advantage of compare immediate insns as more than half
of all comparisons are like that.
Modified files:
trunk/priv/host_s390_defs.c
Modified: trunk/priv/host_s390_defs.c (+33 -0)
===================================================================
--- trunk/priv/host_s390_defs.c 2012-05-25 16:53:01 +01:00 (rev 2351)
+++ trunk/priv/host_s390_defs.c 2012-05-26 02:59:21 +01:00 (rev 2352)
@@ -1524,6 +1524,18 @@
static UChar *
+s390_emit_CGFI(UChar *p, UChar r1, UInt i2)
+{
+ vassert(s390_host_has_eimm);
+
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ s390_disasm(ENC3(MNM, GPR, INT), "cgfi", r1, i2);
+
+ return emit_RIL(p, 0xc20c00000000ULL, r1, i2);
+}
+
+
+static UChar *
s390_emit_CS(UChar *p, UChar r1, UChar r3, UChar b2, UShort d2)
{
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
@@ -1624,6 +1636,18 @@
static UChar *
+s390_emit_CLGFI(UChar *p, UChar r1, UInt i2)
+{
+ vassert(s390_host_has_eimm);
+
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ s390_disasm(ENC3(MNM, GPR, UINT), "clgfi", r1, i2);
+
+ return emit_RIL(p, 0xc20e00000000ULL, r1, i2);
+}
+
+
+static UChar *
s390_emit_DR(UChar *p, UChar r1, UChar r2)
{
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
@@ -6309,6 +6333,15 @@
return s390_emit_CLFIw(buf, r1, value);
case 8:
+ if (s390_host_has_eimm) {
+ if (signed_comparison) {
+ if (ulong_fits_signed_32bit(value))
+ return s390_emit_CGFI(buf, r1, value);
+ } else {
+ if (ulong_fits_unsigned_32bit(value))
+ return s390_emit_CLGFI(buf, r1, value);
+ }
+ }
buf = s390_emit_load_64imm(buf, R0, value);
if (signed_comparison)
return s390_emit_CGR(buf, r1, R0);
|