|
From: <sv...@va...> - 2014-12-08 14:01:45
|
Author: florian
Date: Mon Dec 8 14:01:33 2014
New Revision: 3034
Log:
The long displacement facility is now required. There were a
few spots in the code where this was assumed implicitly.
Ugly fixes were possible, but requiring this facility is not
unreasonable as it has been around sind 2003. So let's just
do this.
Modified:
trunk/priv/host_s390_defs.c
trunk/priv/host_s390_isel.c
trunk/priv/main_main.c
Modified: trunk/priv/host_s390_defs.c
==============================================================================
--- trunk/priv/host_s390_defs.c (original)
+++ trunk/priv/host_s390_defs.c Mon Dec 8 14:01:33 2014
@@ -1524,8 +1524,6 @@
static UChar *
s390_emit_AY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "ay", r1, dh2, dl2, x2, b2);
@@ -1536,8 +1534,6 @@
static UChar *
s390_emit_AG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "ag", r1, dh2, dl2, x2, b2);
@@ -1582,8 +1578,6 @@
static UChar *
s390_emit_AHY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "ahy", r1, dh2, dl2, x2, b2);
@@ -1668,8 +1662,6 @@
static UChar *
s390_emit_NY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "ny", r1, dh2, dl2, x2, b2);
@@ -1680,8 +1672,6 @@
static UChar *
s390_emit_NG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "ng", r1, dh2, dl2, x2, b2);
@@ -1796,8 +1786,6 @@
static UChar *
s390_emit_CY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "cy", r1, dh2, dl2, x2, b2);
@@ -1808,8 +1796,6 @@
static UChar *
s390_emit_CG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "cg", r1, dh2, dl2, x2, b2);
@@ -1854,8 +1840,6 @@
static UChar *
s390_emit_CSY(UChar *p, UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC4(MNM, GPR, GPR, SDXB), "csy", r1, r3, dh2, dl2, 0, b2);
@@ -1866,8 +1850,6 @@
static UChar *
s390_emit_CSG(UChar *p, UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC4(MNM, GPR, GPR, SDXB), "csg", r1, r3, dh2, dl2, 0, b2);
@@ -1888,8 +1870,6 @@
static UChar *
s390_emit_CDSY(UChar *p, UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC4(MNM, GPR, GPR, SDXB), "cdsy", r1, r3, dh2, dl2, 0, b2);
@@ -1900,8 +1880,6 @@
static UChar *
s390_emit_CDSG(UChar *p, UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC4(MNM, GPR, GPR, SDXB), "cdsg", r1, r3, dh2, dl2, 0, b2);
@@ -1942,8 +1920,6 @@
static UChar *
s390_emit_CLY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "cly", r1, dh2, dl2, x2, b2);
@@ -1954,8 +1930,6 @@
static UChar *
s390_emit_CLG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "clg", r1, dh2, dl2, x2, b2);
@@ -2030,8 +2004,6 @@
static UChar *
s390_emit_DL(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "dl", r1, dh2, dl2, x2, b2);
@@ -2042,8 +2014,6 @@
static UChar *
s390_emit_DLG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "dlg", r1, dh2, dl2, x2, b2);
@@ -2064,8 +2034,6 @@
static UChar *
s390_emit_DSG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "dsg", r1, dh2, dl2, x2, b2);
@@ -2106,8 +2074,6 @@
static UChar *
s390_emit_XY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "xy", r1, dh2, dl2, x2, b2);
@@ -2118,8 +2084,6 @@
static UChar *
s390_emit_XG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "xg", r1, dh2, dl2, x2, b2);
@@ -2186,8 +2150,6 @@
static UChar *
s390_emit_ICY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "icy", r1, dh2, dl2, x2, b2);
@@ -2312,8 +2274,6 @@
static UChar *
s390_emit_LY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "ly", r1, dh2, dl2, x2, b2);
@@ -2324,8 +2284,6 @@
static UChar *
s390_emit_LG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "lg", r1, dh2, dl2, x2, b2);
@@ -2336,8 +2294,6 @@
static UChar *
s390_emit_LGF(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "lgf", r1, dh2, dl2, x2, b2);
@@ -2428,8 +2384,6 @@
static UChar *
s390_emit_LB(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "lb", r1, dh2, dl2, x2, b2);
@@ -2440,8 +2394,6 @@
static UChar *
s390_emit_LGB(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "lgb", r1, dh2, dl2, x2, b2);
@@ -2506,8 +2458,6 @@
static UChar *
s390_emit_LHY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "lhy", r1, dh2, dl2, x2, b2);
@@ -2518,8 +2468,6 @@
static UChar *
s390_emit_LGH(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "lgh", r1, dh2, dl2, x2, b2);
@@ -2560,8 +2508,6 @@
static UChar *
s390_emit_LLGF(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "llgf", r1, dh2, dl2, x2, b2);
@@ -2608,8 +2554,6 @@
static UChar *
s390_emit_LLGC(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "llgc", r1, dh2, dl2, x2, b2);
@@ -2656,8 +2600,6 @@
static UChar *
s390_emit_LLGH(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "llgh", r1, dh2, dl2, x2, b2);
@@ -2784,8 +2726,6 @@
static UChar *
s390_emit_ML(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "ml", r1, dh2, dl2, x2, b2);
@@ -2796,8 +2736,6 @@
static UChar *
s390_emit_MLG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "mlg", r1, dh2, dl2, x2, b2);
@@ -2838,8 +2776,6 @@
static UChar *
s390_emit_MSY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "msy", r1, dh2, dl2, x2, b2);
@@ -2850,8 +2786,6 @@
static UChar *
s390_emit_MSG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "msg", r1, dh2, dl2, x2, b2);
@@ -2972,8 +2906,6 @@
static UChar *
s390_emit_OY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "oy", r1, dh2, dl2, x2, b2);
@@ -2984,8 +2916,6 @@
static UChar *
s390_emit_OG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "og", r1, dh2, dl2, x2, b2);
@@ -3040,8 +2970,6 @@
static UChar *
s390_emit_SLLG(UChar *p, UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC4(MNM, GPR, GPR, SDXB), "sllg", r1, r3, dh2, dl2, 0, b2);
@@ -3062,8 +2990,6 @@
static UChar *
s390_emit_SRAG(UChar *p, UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC4(MNM, GPR, GPR, SDXB), "srag", r1, r3, dh2, dl2, 0, b2);
@@ -3084,8 +3010,6 @@
static UChar *
s390_emit_SRLG(UChar *p, UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC4(MNM, GPR, GPR, SDXB), "srlg", r1, r3, dh2, dl2, 0, b2);
@@ -3106,8 +3030,6 @@
static UChar *
s390_emit_STY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "sty", r1, dh2, dl2, x2, b2);
@@ -3118,8 +3040,6 @@
static UChar *
s390_emit_STG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "stg", r1, dh2, dl2, x2, b2);
@@ -3140,8 +3060,6 @@
static UChar *
s390_emit_STCY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "stcy", r1, dh2, dl2, x2, b2);
@@ -3162,8 +3080,6 @@
static UChar *
s390_emit_STHY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "sthy", r1, dh2, dl2, x2, b2);
@@ -3204,8 +3120,6 @@
static UChar *
s390_emit_SY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "sy", r1, dh2, dl2, x2, b2);
@@ -3216,8 +3130,6 @@
static UChar *
s390_emit_SG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "sg", r1, dh2, dl2, x2, b2);
@@ -3238,8 +3150,6 @@
static UChar *
s390_emit_SHY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, GPR, SDXB), "shy", r1, dh2, dl2, x2, b2);
@@ -3302,8 +3212,6 @@
static UChar *
s390_emit_LEY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, FPR, SDXB), "ley", r1, dh2, dl2, x2, b2);
@@ -3314,8 +3222,6 @@
static UChar *
s390_emit_LDY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, FPR, SDXB), "ldy", r1, dh2, dl2, x2, b2);
@@ -3410,8 +3316,6 @@
static UChar *
s390_emit_STEY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, FPR, SDXB), "stey", r1, dh2, dl2, x2, b2);
@@ -3422,8 +3326,6 @@
static UChar *
s390_emit_STDY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC3(MNM, FPR, SDXB), "stdy", r1, dh2, dl2, x2, b2);
@@ -4792,8 +4694,6 @@
static UChar *
s390_emit_LOC(UChar *p, UChar r1, UChar m3, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC4(MNM, GPR, UINT, SDXB), "loc", r1, m3, dh2, dl2, 0, b2);
@@ -4804,8 +4704,6 @@
static UChar *
s390_emit_LOCG(UChar *p, UChar r1, UChar m3, UChar b2, UShort dl2, UChar dh2)
{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
s390_disasm(ENC4(MNM, GPR, UINT, SDXB), "locg", r1, m3, dh2, dl2, 0, b2);
@@ -5007,22 +4905,6 @@
}
-/* r1[32:63] = sign_extend(mem[op2addr][0:7]) */
-static UChar *
-s390_emit_LBw(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
-{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
- if (s390_host_has_ldisp) {
- return s390_emit_LB(p, r1, x2, b2, dl2, dh2);
- }
-
- p = s390_emit_IC(p, r1, x2, b2, dl2); /* r1[56:63] = mem[op2addr][0:7] */
- p = s390_emit_SLL(p, r1, R0, 24); /* r1 = r1 << 24 */
- return s390_emit_SRA(p, r1, R0, 24); /* r1 = r1 >>a 24 */
-}
-
-
/* r1[32:63] = sign_extend(r2[56:63]) */
static UChar *
s390_emit_LBRw(UChar *p, UChar r1, UChar r2)
@@ -5037,22 +4919,6 @@
}
-/* r1[0:63] = sign_extend(mem[op2addr][0:7]) */
-static UChar *
-s390_emit_LGBw(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
-{
- vassert(s390_host_has_ldisp || dh2 == 0);
-
- if (s390_host_has_ldisp) {
- return s390_emit_LGB(p, r1, x2, b2, dl2, dh2);
- }
-
- p = s390_emit_IC(p, r1, x2, b2, dl2); /* r1[56:63] = mem[op2addr][0:7] */
- p = s390_emit_SLLG(p, r1, r1, R0, DISP20(56)); /* r1 = r1 << 56 */
- return s390_emit_SRAG(p, r1, r1, R0, DISP20(56)); /* r1 = r1 >>a 56 */
-}
-
-
/* r1[0:63] = sign_extend(r2[56:63]) */
static UChar *
s390_emit_LGBRw(UChar *p, UChar r1, UChar r2)
@@ -5312,17 +5178,8 @@
/* Store the FPR at memory[sp - 8]. This is safe because SP grows towards
smaller addresses and is 8-byte aligned. Then load the GPR from that
memory location/ */
- if (s390_host_has_ldisp) {
- p = s390_emit_STDY(p, r2, R0, S390_REGNO_STACK_POINTER, DISP20(-8));
- return s390_emit_LG(p, r1, R0, S390_REGNO_STACK_POINTER, DISP20(-8));
- }
-
- /* No long displacement. Need to adjust SP explicitly as to avoid negative
- displacements. */
- p = s390_emit_AGHI(p, S390_REGNO_STACK_POINTER, -8);
- p = s390_emit_STD(p, r2, R0, S390_REGNO_STACK_POINTER, 0);
- p = s390_emit_LG(p, r1, R0, S390_REGNO_STACK_POINTER, DISP20(0));
- return s390_emit_AGHI(p, S390_REGNO_STACK_POINTER, 8);
+ p = s390_emit_STDY(p, r2, R0, S390_REGNO_STACK_POINTER, DISP20(-8));
+ return s390_emit_LG(p, r1, R0, S390_REGNO_STACK_POINTER, DISP20(-8));
}
@@ -5336,17 +5193,8 @@
/* Store the GPR at memory[sp - 8]. This is safe because SP grows towards
smaller addresses and is 8-byte aligned. Then load the FPR from that
memory location/ */
- if (s390_host_has_ldisp) {
- p = s390_emit_STG(p, r2, R0, S390_REGNO_STACK_POINTER, DISP20(-8));
- return s390_emit_LDY(p, r1, R0, S390_REGNO_STACK_POINTER, DISP20(-8));
- }
-
- /* No long displacement. Need to adjust SP explicitly as to avoid negative
- displacements. */
- p = s390_emit_AGHI(p, S390_REGNO_STACK_POINTER, -8);
- p = s390_emit_STG(p, r2, R0, S390_REGNO_STACK_POINTER, DISP20(0));
- p = s390_emit_LD(p, r1, R0, S390_REGNO_STACK_POINTER, 0);
- return s390_emit_AGHI(p, S390_REGNO_STACK_POINTER, 8);
+ p = s390_emit_STG(p, r2, R0, S390_REGNO_STACK_POINTER, DISP20(-8));
+ return s390_emit_LDY(p, r1, R0, S390_REGNO_STACK_POINTER, DISP20(-8));
}
@@ -7895,13 +7743,13 @@
case 1:
if (insn->size == 4 || insn->size == 2) {
if (sign_extend)
- return s390_emit_LBw(buf, r1, x, b, DISP20(d));
+ return s390_emit_LB(buf, r1, x, b, DISP20(d));
else
return s390_emit_LLCw(buf, r1, x, b, DISP20(d));
}
if (insn->size == 8) {
if (sign_extend)
- return s390_emit_LGBw(buf, r1, x, b, DISP20(d));
+ return s390_emit_LGB(buf, r1, x, b, DISP20(d));
else
return s390_emit_LLGC(buf, r1, x, b, DISP20(d));
}
Modified: trunk/priv/host_s390_isel.c
==============================================================================
--- trunk/priv/host_s390_isel.c (original)
+++ trunk/priv/host_s390_isel.c Mon Dec 8 14:01:33 2014
@@ -312,9 +312,7 @@
if (ulong_fits_unsigned_12bit(value)) {
return s390_amode_b12((Int)value, s390_isel_int_expr(env, arg1));
}
- /* If long-displacement is not available, do not construct B20 or
- BX20 amodes because code generation cannot handle them. */
- if (s390_host_has_ldisp && ulong_fits_signed_20bit(value)) {
+ if (ulong_fits_signed_20bit(value)) {
return s390_amode_b20((Int)value, s390_isel_int_expr(env, arg1));
}
}
Modified: trunk/priv/main_main.c
==============================================================================
--- trunk/priv/main_main.c (original)
+++ trunk/priv/main_main.c Mon Dec 8 14:01:33 2014
@@ -1578,6 +1578,13 @@
static Bool are_valid_hwcaps ( VexArch arch, UInt hwcaps )
{
+ if (arch == VexArchS390X) {
+ if (! s390_host_has_ldisp) {
+ vpanic("Host does not have long displacement facility.\n"
+ " Cannot continue. Good-bye.\n");
+ }
+ return True;
+ }
return show_hwcaps(arch,hwcaps) != NULL;
}
|