|
From: Florian K. <fk...@so...> - 2025-11-24 23:22:14
|
https://sourceware.org/cgit/valgrind/commit/?id=64f3a489997b7f8f574caaa3ed87ee15557390d0 commit 64f3a489997b7f8f574caaa3ed87ee15557390d0 Author: Florian Krohm <fl...@ei...> Date: Mon Nov 24 23:21:29 2025 +0000 s390: extended-immediate facility related cleanups (BZ 509562) The extended-immediate facility is always present on the supported machines. - Remove VEX_HWCAPS_S390X_EIMM and s390_host_has_eimm - Remove unused functions: s390_emit_LLILH, s390_emit_IILL, s390_emit_IILH, s390_emit_IIHL, s390_emit_IIHH - Remove wrapper functions: s390_emit_NILFw, s390_emit_OILFw, s390_emit_XILFw, s390_emit_LBRw, s390_emit_LGBRw, s390_emit_LHRw, s390_emit_LGHRw, s390_emit_LGFIw, s390_emit_LLCRw, s390_emit_LLGCRw, s390_emit_LLHRw, s390_emit_LLGHRw, s390_emit_LLCw, s390_emit_LLHw, s390_emit_LLILFw, s390_emit_AFIw, s390_emit_SLFIw, s390_emit_SLGFIw, s390_emit_LTw, s390_emit_LTGw, s390_emit_CFIw, s390_emit_CLFIw - Update tests/s390x_features.c Part of fixing https://bugs.kde.org/show_bug.cgi?id=509562 Diff: --- VEX/priv/host_s390_defs.c | 663 +++++----------------------------------------- VEX/priv/host_s390_defs.h | 2 - VEX/priv/main_main.c | 1 - VEX/pub/libvex.h | 4 +- coregrind/m_machine.c | 1 - tests/s390x_features.c | 2 - 6 files changed, 65 insertions(+), 608 deletions(-) diff --git a/VEX/priv/host_s390_defs.c b/VEX/priv/host_s390_defs.c index 4831e1d67d..7b8dbe63db 100644 --- a/VEX/priv/host_s390_defs.c +++ b/VEX/priv/host_s390_defs.c @@ -2048,8 +2048,6 @@ s390_emit_AG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_AFI(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("afi"), GPR(r1), INT(i2)); @@ -2060,8 +2058,6 @@ s390_emit_AFI(UChar *p, UChar r1, UInt i2) static UChar * s390_emit_AGFI(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("agfi"), GPR(r1), INT(i2)); @@ -2186,8 +2182,6 @@ s390_emit_NG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_NIHF(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("nihf"), GPR(r1), UINT(i2)); @@ -2198,8 +2192,6 @@ s390_emit_NIHF(UChar *p, UChar r1, UInt i2) static UChar * s390_emit_NILF(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("nilf"), GPR(r1), UINT(i2)); @@ -2340,8 +2332,6 @@ s390_emit_CG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_CFI(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("cfi"), GPR(r1), INT(i2)); @@ -2352,8 +2342,6 @@ s390_emit_CFI(UChar *p, UChar r1, UInt i2) 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(MNM("cgfi"), GPR(r1), INT(i2)); @@ -2474,8 +2462,6 @@ s390_emit_CLG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_CLFI(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("clfi"), GPR(r1), UINT(i2)); @@ -2486,8 +2472,6 @@ s390_emit_CLFI(UChar *p, UChar r1, UInt i2) 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(MNM("clgfi"), GPR(r1), UINT(i2)); @@ -2628,8 +2612,6 @@ s390_emit_XG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_XIHF(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("xihf"), GPR(r1), UINT(i2)); @@ -2640,8 +2622,6 @@ s390_emit_XIHF(UChar *p, UChar r1, UInt i2) static UChar * s390_emit_XILF(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("xilf"), GPR(r1), UINT(i2)); @@ -2662,8 +2642,6 @@ s390_emit_XC(UChar *p, UInt l, UChar b1, UShort d1, UChar b2, UShort d2) static UChar * s390_emit_FLOGR(UChar *p, UChar r1, UChar r2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("flogr"), GPR(r1), GPR(r2)); @@ -2694,8 +2672,6 @@ s390_emit_ICY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_IIHF(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("iihf"), GPR(r1), UINT(i2)); @@ -2703,31 +2679,9 @@ s390_emit_IIHF(UChar *p, UChar r1, UInt i2) } -static UChar * -s390_emit_IIHH(UChar *p, UChar r1, UShort i2) -{ - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) - S390_DISASM(MNM("iihh"), GPR(r1), UINT(i2)); - - return emit_RI(p, 0xa5000000, r1, i2); -} - - -static UChar * -s390_emit_IIHL(UChar *p, UChar r1, UShort i2) -{ - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) - S390_DISASM(MNM("iihl"), GPR(r1), UINT(i2)); - - return emit_RI(p, 0xa5010000, r1, i2); -} - - static UChar * s390_emit_IILF(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("iilf"), GPR(r1), UINT(i2)); @@ -2735,26 +2689,6 @@ s390_emit_IILF(UChar *p, UChar r1, UInt i2) } -static UChar * -s390_emit_IILH(UChar *p, UChar r1, UShort i2) -{ - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) - S390_DISASM(MNM("iilh"), GPR(r1), UINT(i2)); - - return emit_RI(p, 0xa5020000, r1, i2); -} - - -static UChar * -s390_emit_IILL(UChar *p, UChar r1, UShort i2) -{ - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) - S390_DISASM(MNM("iill"), GPR(r1), UINT(i2)); - - return emit_RI(p, 0xa5030000, r1, i2); -} - - static UChar * s390_emit_IPM(UChar *p, UChar r1, UChar r2) { @@ -2838,8 +2772,6 @@ s390_emit_LGF(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_LGFI(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("lgfi"), GPR(r1), INT(i2)); @@ -2870,8 +2802,6 @@ s390_emit_LTGR(UChar *p, UChar r1, UChar r2) static UChar * s390_emit_LT(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("lt"), GPR(r1), SDXB(dh2, dl2, x2, b2)); @@ -2882,8 +2812,6 @@ s390_emit_LT(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_LTG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("ltg"), GPR(r1), SDXB(dh2, dl2, x2, b2)); @@ -2894,8 +2822,6 @@ s390_emit_LTG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_LBR(UChar *p, UChar r1, UChar r2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("lbr"), GPR(r1), GPR(r2)); @@ -2906,8 +2832,6 @@ s390_emit_LBR(UChar *p, UChar r1, UChar r2) static UChar * s390_emit_LGBR(UChar *p, UChar r1, UChar r2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("lgbr"), GPR(r1), GPR(r2)); @@ -2958,8 +2882,6 @@ s390_emit_LCGR(UChar *p, UChar r1, UChar r2) static UChar * s390_emit_LHR(UChar *p, UChar r1, UChar r2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("lhr"), GPR(r1), GPR(r2)); @@ -2970,8 +2892,6 @@ s390_emit_LHR(UChar *p, UChar r1, UChar r2) static UChar * s390_emit_LGHR(UChar *p, UChar r1, UChar r2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("lghr"), GPR(r1), GPR(r2)); @@ -3052,8 +2972,6 @@ s390_emit_LLGF(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_LLCR(UChar *p, UChar r1, UChar r2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("llcr"), GPR(r1), GPR(r2)); @@ -3064,8 +2982,6 @@ s390_emit_LLCR(UChar *p, UChar r1, UChar r2) static UChar * s390_emit_LLGCR(UChar *p, UChar r1, UChar r2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("llgcr"), GPR(r1), GPR(r2)); @@ -3076,8 +2992,6 @@ s390_emit_LLGCR(UChar *p, UChar r1, UChar r2) static UChar * s390_emit_LLC(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("llc"), GPR(r1), SDXB(dh2, dl2, x2, b2)); @@ -3098,8 +3012,6 @@ s390_emit_LLGC(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_LLHR(UChar *p, UChar r1, UChar r2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("llhr"), GPR(r1), GPR(r2)); @@ -3110,8 +3022,6 @@ s390_emit_LLHR(UChar *p, UChar r1, UChar r2) static UChar * s390_emit_LLGHR(UChar *p, UChar r1, UChar r2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("llghr"), GPR(r1), GPR(r2)); @@ -3122,8 +3032,6 @@ s390_emit_LLGHR(UChar *p, UChar r1, UChar r2) static UChar * s390_emit_LLH(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("llh"), GPR(r1), SDXB(dh2, dl2, x2, b2)); @@ -3144,8 +3052,6 @@ s390_emit_LLGH(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_LLILF(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("llilf"), GPR(r1), UINT(i2)); @@ -3153,16 +3059,6 @@ s390_emit_LLILF(UChar *p, UChar r1, UInt i2) } -static UChar * -s390_emit_LLILH(UChar *p, UChar r1, UShort i2) -{ - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) - S390_DISASM(MNM("llilh"), GPR(r1), UINT(i2)); - - return emit_RI(p, 0xa50e0000, r1, i2); -} - - static UChar * s390_emit_LLILL(UChar *p, UChar r1, UShort i2) { @@ -3480,8 +3376,6 @@ s390_emit_OG(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_OIHF(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("oihf"), GPR(r1), UINT(i2)); @@ -3492,8 +3386,6 @@ s390_emit_OIHF(UChar *p, UChar r1, UInt i2) static UChar * s390_emit_OILF(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("oilf"), GPR(r1), UINT(i2)); @@ -3714,8 +3606,6 @@ s390_emit_SHY(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2) static UChar * s390_emit_SLFI(UChar *p, UChar r1, UInt i2) { - vassert(s390_host_has_eimm); - if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) S390_DISASM(MNM("slfi"), GPR(r1), UINT(i2)); @@ -5190,33 +5080,16 @@ s390_emit_load_64imm(UChar *p, UChar reg, ULong val) return s390_emit_LGHI(p, reg, val); } - if (s390_host_has_eimm) { - if (ulong_fits_unsigned_32bit(val)) { - return s390_emit_LLILF(p, reg, val); - } - if (ulong_fits_signed_32bit(val)) { - /* LGFI's sign extension will recreate the correct 64-bit value */ - return s390_emit_LGFI(p, reg, val); - } - /* Do it in two steps: upper half [0:31] and lower half [32:63] */ - p = s390_emit_IIHF(p, reg, val >> 32); - return s390_emit_IILF(p, reg, val & 0xFFFFFFFF); - } - - /* Fall back */ if (ulong_fits_unsigned_32bit(val)) { - p = s390_emit_LLILH(p, reg, (val >> 16) & 0xFFFF); /* sets val[32:47] - val[0:31] = 0 */ - p = s390_emit_IILL(p, reg, val & 0xFFFF); /* sets val[48:63] */ - return p; + return s390_emit_LLILF(p, reg, val); } - - p = s390_emit_IIHH(p, reg, (val >> 48) & 0xFFFF); - p = s390_emit_IIHL(p, reg, (val >> 32) & 0xFFFF); - p = s390_emit_IILH(p, reg, (val >> 16) & 0xFFFF); - p = s390_emit_IILL(p, reg, val & 0xFFFF); - - return p; + if (ulong_fits_signed_32bit(val)) { + /* LGFI's sign extension will recreate the correct 64-bit value */ + return s390_emit_LGFI(p, reg, val); + } + /* Do it in two steps: upper half [0:31] and lower half [32:63] */ + p = s390_emit_IIHF(p, reg, val >> 32); + return s390_emit_IILF(p, reg, val & 0xFFFFFFFF); } /* Load a 32-bit immediate VAL into register REG. */ @@ -5227,13 +5100,7 @@ s390_emit_load_32imm(UChar *p, UChar reg, UInt val) /* LHI's sign extension will recreate the correct 32-bit value */ return s390_emit_LHI(p, reg, val); } - if (s390_host_has_eimm) { - return s390_emit_IILF(p, reg, val); - } - /* val[0:15] --> (val >> 16) & 0xFFFF - val[16:31] --> val & 0xFFFF */ - p = s390_emit_IILH(p, reg, (val >> 16) & 0xFFFF); - return s390_emit_IILL(p, reg, val & 0xFFFF); + return s390_emit_IILF(p, reg, val); } /*------------------------------------------------------------*/ @@ -5280,311 +5147,6 @@ s390_emit_MSFIw(UChar *p, UChar r1, UInt i2) } -/* r1[32:63] = r1[32:63] & i2 */ -static UChar * -s390_emit_NILFw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_NILF(p, r1, i2); - } - - /* Load I2 into R0; then AND R0 with R1 */ - p = s390_emit_load_32imm(p, R0, i2); - return s390_emit_NR(p, r1, R0); -} - - -/* r1[32:63] = r1[32:63] | i2 */ -static UChar * -s390_emit_OILFw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_OILF(p, r1, i2); - } - - /* Load I2 into R0; then AND R0 with R1 */ - p = s390_emit_load_32imm(p, R0, i2); - return s390_emit_OR(p, r1, R0); -} - - -/* r1[32:63] = r1[32:63] ^ i2 */ -static UChar * -s390_emit_XILFw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_XILF(p, r1, i2); - } - - /* Load I2 into R0; then AND R0 with R1 */ - p = s390_emit_load_32imm(p, R0, i2); - return s390_emit_XR(p, r1, R0); -} - - -/* r1[32:63] = sign_extend(r2[56:63]) */ -static UChar * -s390_emit_LBRw(UChar *p, UChar r1, UChar r2) -{ - if (s390_host_has_eimm) { - return s390_emit_LBR(p, r1, r2); - } - - p = s390_emit_LR(p, r1, r2); /* r1 = r2 */ - p = s390_emit_SLL(p, r1, R0, 24); /* r1 = r1 << 24 */ - return s390_emit_SRA(p, r1, R0, 24); /* r1 = r1 >>a 24 */ -} - - -/* r1[0:63] = sign_extend(r2[56:63]) */ -static UChar * -s390_emit_LGBRw(UChar *p, UChar r1, UChar r2) -{ - if (s390_host_has_eimm) { - return s390_emit_LGBR(p, r1, r2); - } - - p = s390_emit_LR(p, r1, r2); /* r1 = r2 */ - 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[32:63] = sign_extend(r2[48:63]) */ -static UChar * -s390_emit_LHRw(UChar *p, UChar r1, UChar r2) -{ - if (s390_host_has_eimm) { - return s390_emit_LHR(p, r1, r2); - } - - p = s390_emit_LR(p, r1, r2); /* r1 = r2 */ - p = s390_emit_SLL(p, r1, R0, 16); /* r1 = r1 << 16 */ - return s390_emit_SRA(p, r1, R0, 16); /* r1 = r1 >>a 16 */ -} - - -/* r1[0:63] = sign_extend(r2[48:63]) */ -static UChar * -s390_emit_LGHRw(UChar *p, UChar r1, UChar r2) -{ - if (s390_host_has_eimm) { - return s390_emit_LGHR(p, r1, r2); - } - - p = s390_emit_LR(p, r1, r2); /* r1 = r2 */ - p = s390_emit_SLLG(p, r1, r1, R0, DISP20(48)); /* r1 = r1 << 48 */ - return s390_emit_SRAG(p, r1, r1, R0, DISP20(48)); /* r1 = r1 >>a 48 */ -} - - -/* r1[0:63] = sign_extend(i2) */ -static UChar * -s390_emit_LGFIw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_LGFI(p, r1, i2); - } - - p = s390_emit_load_32imm(p, R0, i2); - return s390_emit_LGFR(p, r1, R0); -} - - -/* r1[32:63] = zero_extend($r2[56:63]) */ -static UChar * -s390_emit_LLCRw(UChar *p, UChar r1, UChar r2) -{ - if (s390_host_has_eimm) { - return s390_emit_LLCR(p, r1, r2); - } - - p = s390_emit_LR(p, r1, r2); - p = s390_emit_LHI(p, R0, 0xFF); - return s390_emit_NR(p, r1, R0); -} - - -/* r1[0:63] = zero_extend($r2[56:63]) */ -static UChar * -s390_emit_LLGCRw(UChar *p, UChar r1, UChar r2) -{ - if (s390_host_has_eimm) { - return s390_emit_LLGCR(p, r1, r2); - } - - p = s390_emit_LR(p, r1, r2); - p = s390_emit_LLILL(p, R0, 0xFF); - return s390_emit_NGR(p, r1, R0); -} - - -/* r1[32:63] = zero_extend(r2[48:63]) */ -static UChar * -s390_emit_LLHRw(UChar *p, UChar r1, UChar r2) -{ - if (s390_host_has_eimm) { - return s390_emit_LLHR(p, r1, r2); - } - - p = s390_emit_LR(p, r1, r2); - p = s390_emit_LLILL(p, R0, 0xFFFF); - return s390_emit_NR(p, r1, R0); -} - - -/* r1[0:63] = zero_extend(r2[48:63]) */ -static UChar * -s390_emit_LLGHRw(UChar *p, UChar r1, UChar r2) -{ - if (s390_host_has_eimm) { - return s390_emit_LLGHR(p, r1, r2); - } - - p = s390_emit_LR(p, r1, r2); - p = s390_emit_LLILL(p, R0, 0xFFFF); - return s390_emit_NGR(p, r1, R0); -} - - -/* r1[32:63] = zero_extend(mem[op2addr][0:7]) */ -static UChar * -s390_emit_LLCw(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl, UChar dh) -{ - if (s390_host_has_eimm) { - return s390_emit_LLC(p, r1, x2, b2, dl, dh); - } - - if (dh == 0) { - p = s390_emit_IC(p, r1, x2, b2, dl); - } else { - p = s390_emit_ICY(p, r1, x2, b2, dl, dh); - } - p = s390_emit_LLILL(p, R0, 0xFF); - return s390_emit_NR(p, r1, R0); -} - - -/* r1[32:63] = zero_extend(mem[op2addr][0:15]) */ -static UChar * -s390_emit_LLHw(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl, UChar dh) -{ - if (s390_host_has_eimm) { - return s390_emit_LLH(p, r1, x2, b2, dl, dh); - } - - p = s390_emit_LLGH(p, r1, x2, b2, dl, dh); - p = s390_emit_LLILL(p, R0, 0xFFFF); - return s390_emit_NR(p, r1, R0); -} - - -/* r1[0:63] = zero_extend(i2) */ -static UChar * -s390_emit_LLILFw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_LLILF(p, r1, i2); - } - - p = s390_emit_LLILH(p, r1, (i2 >> 16) & 0xFFFF); /* i2[0:15] */ - return s390_emit_OILL(p, r1, i2 & 0xFFFF); -} - - -/* r1[32:63] = r1[32:63] + i2 */ -static UChar * -s390_emit_AFIw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_AFI(p, r1, i2); - } - /* Load 32 bit immediate to R0 then add */ - p = s390_emit_load_32imm(p, R0, i2); - return s390_emit_AR(p, r1, R0); -} - - -/* r1[32:63] = r1[32:63] - i2 */ -static UChar * -s390_emit_SLFIw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_SLFI(p, r1, i2); - } - - /* Load 32 bit immediate to R0 then subtract */ - p = s390_emit_load_32imm(p, R0, i2); - return s390_emit_SR(p, r1, R0); -} - - -/* r1[0:63] = r1[0:63] - zero_extend(i2) */ -static UChar * -s390_emit_SLGFIw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_SLGFI(p, r1, i2); - } - - /* Load zero-extended 32 bit immediate to R0 then subtract */ - p = s390_emit_load_64imm(p, R0, i2); - return s390_emit_SGR(p, r1, R0); -} - - -static UChar * -s390_emit_LTw(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl, UChar dh) -{ - if (s390_host_has_eimm) { - return s390_emit_LT(p, r1, x2, b2, dl, dh); - } - /* Load 32 bit from memory to R0 then compare */ - if (dh == 0) { - p = s390_emit_L(p, R0, x2, b2, dl); - } else { - p = s390_emit_LY(p, R0, x2, b2, dl, dh); - } - return s390_emit_LTR(p, r1, R0); -} - - -static UChar * -s390_emit_LTGw(UChar *p, UChar r1, UChar x2, UChar b2, UShort dl, UChar dh) -{ - if (s390_host_has_eimm) { - return s390_emit_LTG(p, r1, x2, b2, dl, dh); - } - /* Load 64 bit from memory to R0 then compare */ - p = s390_emit_LG(p, R0, x2, b2, dl, dh); - return s390_emit_LTGR(p, r1, R0); -} - - -static UChar * -s390_emit_CFIw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_CFI(p, r1, i2); - } - /* Load 32 bit immediate to R0 then compare */ - p = s390_emit_load_32imm(p, R0, i2); - return s390_emit_CR(p, r1, R0); -} - - -static UChar * -s390_emit_CLFIw(UChar *p, UChar r1, UInt i2) -{ - if (s390_host_has_eimm) { - return s390_emit_CLFI(p, r1, i2); - } - /* Load 32 bit immediate to R0 then compare */ - p = s390_emit_load_32imm(p, R0, i2); - return s390_emit_CLR(p, r1, R0); -} - - static UChar * s390_emit_LGDRw(UChar *p, UChar r1, UChar r2) { @@ -8900,7 +8462,7 @@ s390_insn_alu_emit(UChar *buf, const s390_insn *insn) return s390_emit_AHI(buf, dst, value); case S390_ALU_SUB: - return s390_emit_SLFIw(buf, dst, value); + return s390_emit_SLFI(buf, dst, value); case S390_ALU_MUL: return s390_emit_MHI(buf, dst, value); @@ -8932,13 +8494,13 @@ s390_insn_alu_emit(UChar *buf, const s390_insn *insn) if (uint_fits_signed_16bit(value)) { return s390_emit_AHI(buf, dst, value); } - return s390_emit_AFIw(buf, dst, value); + return s390_emit_AFI(buf, dst, value); - case S390_ALU_SUB: return s390_emit_SLFIw(buf, dst, value); + case S390_ALU_SUB: return s390_emit_SLFI(buf, dst, value); case S390_ALU_MUL: return s390_emit_MSFIw(buf, dst, value); - case S390_ALU_AND: return s390_emit_NILFw(buf, dst, value); - case S390_ALU_OR: return s390_emit_OILFw(buf, dst, value); - case S390_ALU_XOR: return s390_emit_XILFw(buf, dst, value); + case S390_ALU_AND: return s390_emit_NILF(buf, dst, value); + case S390_ALU_OR: return s390_emit_OILF(buf, dst, value); + case S390_ALU_XOR: return s390_emit_XILF(buf, dst, value); case S390_ALU_LSH: return s390_emit_SLL(buf, dst, 0, value); case S390_ALU_RSH: return s390_emit_SRL(buf, dst, 0, value); case S390_ALU_RSHA: return s390_emit_SRA(buf, dst, 0, value); @@ -8952,7 +8514,7 @@ s390_insn_alu_emit(UChar *buf, const s390_insn *insn) if (ulong_fits_signed_16bit(value)) { return s390_emit_AGHI(buf, dst, value); } - if (ulong_fits_signed_32bit(value) && s390_host_has_eimm) { + if (ulong_fits_signed_32bit(value)) { return s390_emit_AGFI(buf, dst, value); } /* Load constant into R0 then add */ @@ -8961,7 +8523,7 @@ s390_insn_alu_emit(UChar *buf, const s390_insn *insn) case S390_ALU_SUB: if (ulong_fits_unsigned_32bit(value)) { - return s390_emit_SLGFIw(buf, dst, value); + return s390_emit_SLGFI(buf, dst, value); } /* Load value into R0; then subtract from destination reg */ buf = s390_emit_load_64imm(buf, R0, value); @@ -8977,31 +8539,16 @@ s390_insn_alu_emit(UChar *buf, const s390_insn *insn) /* Do it in two steps: upper half [0:31] and lower half [32:63] */ case S390_ALU_AND: - if (s390_host_has_eimm) { - buf = s390_emit_NIHF(buf, dst, value >> 32); - return s390_emit_NILF(buf, dst, value & 0xFFFFFFFF); - } - /* Load value into R0; then combine with destination reg */ - buf = s390_emit_load_64imm(buf, R0, value); - return s390_emit_NGR(buf, dst, R0); + buf = s390_emit_NIHF(buf, dst, value >> 32); + return s390_emit_NILF(buf, dst, value & 0xFFFFFFFF); case S390_ALU_OR: - if (s390_host_has_eimm) { - buf = s390_emit_OIHF(buf, dst, value >> 32); - return s390_emit_OILF(buf, dst, value & 0xFFFFFFFF); - } - /* Load value into R0; then combine with destination reg */ - buf = s390_emit_load_64imm(buf, R0, value); - return s390_emit_OGR(buf, dst, R0); + buf = s390_emit_OIHF(buf, dst, value >> 32); + return s390_emit_OILF(buf, dst, value & 0xFFFFFFFF); case S390_ALU_XOR: - if (s390_host_has_eimm) { - buf = s390_emit_XIHF(buf, dst, value >> 32); - return s390_emit_XILF(buf, dst, value & 0xFFFFFFFF); - } - /* Load value into R0; then combine with destination reg */ - buf = s390_emit_load_64imm(buf, R0, value); - return s390_emit_XGR(buf, dst, R0); + buf = s390_emit_XIHF(buf, dst, value >> 32); + return s390_emit_XILF(buf, dst, value & 0xFFFFFFFF); /* No special considerations for long displacement here. Only the six least significant bits of VALUE will be taken; all other bits are @@ -9040,30 +8587,30 @@ s390_widen_emit(UChar *buf, const s390_insn *insn, UInt from_size, because the upper half-word will not be looked at. */ if (insn->size == 4 || insn->size == 2) { /* 8 --> 32 8 --> 16 */ if (sign_extend) - return s390_emit_LBRw(buf, r1, r2); + return s390_emit_LBR(buf, r1, r2); else - return s390_emit_LLCRw(buf, r1, r2); + return s390_emit_LLCR(buf, r1, r2); } if (insn->size == 8) { /* 8 --> 64 */ if (sign_extend) - return s390_emit_LGBRw(buf, r1, r2); + return s390_emit_LGBR(buf, r1, r2); else - return s390_emit_LLGCRw(buf, r1, r2); + return s390_emit_LLGCR(buf, r1, r2); } goto fail; case 2: if (insn->size == 4) { /* 16 --> 32 */ if (sign_extend) - return s390_emit_LHRw(buf, r1, r2); + return s390_emit_LHR(buf, r1, r2); else - return s390_emit_LLHRw(buf, r1, r2); + return s390_emit_LLHR(buf, r1, r2); } if (insn->size == 8) { /* 16 --> 64 */ if (sign_extend) - return s390_emit_LGHRw(buf, r1, r2); + return s390_emit_LGHR(buf, r1, r2); else - return s390_emit_LLGHRw(buf, r1, r2); + return s390_emit_LLGHR(buf, r1, r2); } goto fail; @@ -9094,7 +8641,7 @@ s390_widen_emit(UChar *buf, const s390_insn *insn, UInt from_size, if (sign_extend) return s390_emit_LB(buf, r1, x, b, DISP20(d)); else - return s390_emit_LLCw(buf, r1, x, b, DISP20(d)); + return s390_emit_LLC(buf, r1, x, b, DISP20(d)); } if (insn->size == 8) { if (sign_extend) @@ -9107,7 +8654,7 @@ s390_widen_emit(UChar *buf, const s390_insn *insn, UInt from_size, case 2: if (insn->size == 4) { /* 16 --> 32 */ if (sign_extend == 0) - return s390_emit_LLHw(buf, r1, x, b, DISP20(d)); + return s390_emit_LLH(buf, r1, x, b, DISP20(d)); switch (src->tag) { case S390_AMODE_B12: @@ -9184,9 +8731,9 @@ s390_widen_emit(UChar *buf, const s390_insn *insn, UInt from_size, case 4: if (insn->size == 8) { /* 32 --> 64 */ if (sign_extend) - return s390_emit_LGFIw(buf, r1, value); + return s390_emit_LGFI(buf, r1, value); else - return s390_emit_LLILFw(buf, r1, value); + return s390_emit_LLILF(buf, r1, value); } goto fail; @@ -9481,10 +9028,10 @@ s390_insn_test_emit(UChar *buf, const s390_insn *insn) } case 4: - return s390_emit_LTw(buf, R0, x, b, DISP20(d)); + return s390_emit_LT(buf, R0, x, b, DISP20(d)); case 8: - return s390_emit_LTGw(buf, R0, x, b, DISP20(d)); + return s390_emit_LTG(buf, R0, x, b, DISP20(d)); default: goto fail; @@ -9723,19 +9270,17 @@ s390_insn_compare_emit(UChar *buf, const s390_insn *insn) switch (insn->size) { case 4: if (signed_comparison) - return s390_emit_CFIw(buf, r1, value); + return s390_emit_CFI(buf, r1, value); else - return s390_emit_CLFIw(buf, r1, value); + return s390_emit_CLFI(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); - } + 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) @@ -10057,35 +9602,10 @@ s390_insn_clz_emit(UChar *buf, const s390_insn *insn) } default: - goto fail; - } - - /* Use FLOGR if you can */ - if (s390_host_has_eimm) { - return s390_emit_FLOGR(p, r1, r2); + vpanic("s390_insn_clz_emit"); } - /* - r0 = r2; - r1 = 64; - while (r0 != 0) { - r1 -= 1; - r0 >>= 1; - } - */ - p = s390_emit_LTGR(p, R0, r2); - p = s390_emit_LLILL(p, r1, 64); - - p = s390_emit_BRC(p, S390_CC_E, (4 + 4 + 6 + 4 + 4)/ 2); /* 4 bytes */ - p = s390_emit_AGHI(p, r1, (UShort)-1); /* r1 -= 1; 4 bytes */ - p = s390_emit_SRLG(p, R0, R0, R0, DISP20(1)); /* r0 >>= 1; 6 bytes */ - p = s390_emit_LTGR(p, R0, R0); /* set cc 4 bytes */ - p = s390_emit_BRC(p, S390_CC_NE, /* 4 bytes */ - (UShort)(-(4 + 6 + 4) / 2)); - return p; - - fail: - vpanic("s390_insn_clz_emit"); + return s390_emit_FLOGR(p, r1, r2); } @@ -10914,19 +10434,9 @@ s390_tchain_load64(UChar *buf, UChar regno, ULong value) { UChar *begin = buf; - if (s390_host_has_eimm) { - /* Do it in two steps: upper half [0:31] and lower half [32:63] */ - buf = s390_emit_IIHF(buf, regno, value >> 32); - buf = s390_emit_IILF(buf, regno, value & 0xFFFFFFFF); - } else { - buf = s390_emit_IILL(buf, regno, value & 0xFFFF); - value >>= 16; - buf = s390_emit_IILH(buf, regno, value & 0xFFFF); - value >>= 16; - buf = s390_emit_IIHL(buf, regno, value & 0xFFFF); - value >>= 16; - buf = s390_emit_IIHH(buf, regno, value & 0xFFFF); - } + /* Do it in two steps: upper half [0:31] and lower half [32:63] */ + buf = s390_emit_IIHF(buf, regno, value >> 32); + buf = s390_emit_IILF(buf, regno, value & 0xFFFFFFFF); vassert(buf - begin == s390_tchain_load64_len()); @@ -10937,10 +10447,7 @@ s390_tchain_load64(UChar *buf, UChar regno, ULong value) static UInt s390_tchain_load64_len(void) { - if (s390_host_has_eimm) { - return 6 + 6; /* IIHF + IILF */ - } - return 4 + 4 + 4 + 4; /* IIHH + IIHL + IILH + IILL */ + return 6 + 6; /* IIHF + IILF */ } /* Verify that CODE is the code sequence generated by s390_tchain_load64 @@ -10950,46 +10457,15 @@ static const UChar * s390_tchain_verify_load64(const UChar *code, UChar regno, ULong value) { UInt regmask = regno << 4; - UInt hw; - - if (s390_host_has_eimm) { - /* Check for IIHF */ - vassert(code[0] == 0xC0); - vassert(code[1] == (0x08 | regmask)); - vassert(*(const UInt *)&code[2] == (value >> 32)); - /* Check for IILF */ - vassert(code[6] == 0xC0); - vassert(code[7] == (0x09 | regmask)); - vassert(*(const UInt *)&code[8] == (value & 0xFFFFFFFF)); - } else { - /* Check for IILL */ - hw = value & 0xFFFF; - vassert(code[0] == 0xA5); - vassert(code[1] == (0x03 | regmask)); - vassert(code[2] == (hw >> 8)); - vassert(code[3] == (hw & 0xFF)); - - /* Check for IILH */ - hw = (value >> 16) & 0xFFFF; - vassert(code[4] == 0xA5); - vassert(code[5] == (0x02 | regmask)); - vassert(code[6] == (hw >> 8)); - vassert(code[7] == (hw & 0xFF)); - - /* Check for IIHL */ - hw = (value >> 32) & 0xFFFF; - vassert(code[8] == 0xA5); - vassert(code[9] == (0x01 | regmask)); - vassert(code[10] == (hw >> 8)); - vassert(code[11] == (hw & 0xFF)); - - /* Check for IIHH */ - hw = (value >> 48) & 0xFFFF; - vassert(code[12] == 0xA5); - vassert(code[13] == (0x00 | regmask)); - vassert(code[14] == (hw >> 8)); - vassert(code[15] == (hw & 0xFF)); - } + + /* Check for IIHF */ + vassert(code[0] == 0xC0); + vassert(code[1] == (0x08 | regmask)); + vassert(*(const UInt *)&code[2] == (value >> 32)); + /* Check for IILF */ + vassert(code[6] == 0xC0); + vassert(code[7] == (0x09 | regmask)); + vassert(*(const UInt *)&code[8] == (value & 0xFFFFFFFF)); return code + s390_tchain_load64_len(); } @@ -11000,21 +10476,10 @@ s390_tchain_verify_load64(const UChar *code, UChar regno, ULong value) static UChar * s390_tchain_patch_load64(UChar *code, ULong imm64) { - if (s390_host_has_eimm) { - /* Patch IIHF */ - *(UInt *)&code[2] = imm64 >> 32; - /* Patch IILF */ - *(UInt *)&code[8] = imm64 & 0xFFFFFFFF; - } else { - code[3] = imm64 & 0xFF; imm64 >>= 8; - code[2] = imm64 & 0xFF; imm64 >>= 8; - code[7] = imm64 & 0xFF; imm64 >>= 8; - code[6] = imm64 & 0xFF; imm64 >>= 8; - code[11] = imm64 & 0xFF; imm64 >>= 8; - code[10] = imm64 & 0xFF; imm64 >>= 8; - code[15] = imm64 & 0xFF; imm64 >>= 8; - code[14] = imm64 & 0xFF; imm64 >>= 8; - } + /* Patch IIHF */ + *(UInt *)&code[2] = imm64 >> 32; + /* Patch IILF */ + *(UInt *)&code[8] = imm64 & 0xFFFFFFFF; return code + s390_tchain_load64_len(); } diff --git a/VEX/priv/host_s390_defs.h b/VEX/priv/host_s390_defs.h index 9a66b2abc9..9b5e3f00ac 100644 --- a/VEX/priv/host_s390_defs.h +++ b/VEX/priv/host_s390_defs.h @@ -918,8 +918,6 @@ VexInvalRange patchProfInc_S390(VexEndness endness_host, extern UInt s390_host_hwcaps; /* Convenience macros to test installed facilities */ -#define s390_host_has_eimm \ - (s390_host_hwcaps & (VEX_HWCAPS_S390X_EIMM)) #define s390_host_has_gie \ (s390_host_hwcaps & (VEX_HWCAPS_S390X_GIE)) #define s390_host_has_fgx \ diff --git a/VEX/priv/main_main.c b/VEX/priv/main_main.c index ae97ec182c..da3ccbd821 100644 --- a/VEX/priv/main_main.c +++ b/VEX/priv/main_main.c @@ -1902,7 +1902,6 @@ static const HChar* show_hwcaps_s390x ( UInt hwcaps ) UInt hwcaps_bit; HChar name[6]; } hwcaps_list[] = { - { VEX_HWCAPS_S390X_EIMM, "eimm" }, { VEX_HWCAPS_S390X_GIE, "gie" }, { VEX_HWCAPS_S390X_FGX, "fgx" }, { VEX_HWCAPS_S390X_LSC, "lsc" }, diff --git a/VEX/pub/libvex.h b/VEX/pub/libvex.h index 710b3bb564..cef40335ef 100644 --- a/VEX/pub/libvex.h +++ b/VEX/pub/libvex.h @@ -162,7 +162,6 @@ typedef #define VEX_S390X_MODEL_UNKNOWN 19 /* always last in list */ #define VEX_S390X_MODEL_MASK 0x3F -#define VEX_HWCAPS_S390X_EIMM (1<<7) /* Extended-immediate facility */ #define VEX_HWCAPS_S390X_GIE (1<<8) /* General-instruction-extension facility */ #define VEX_HWCAPS_S390X_FGX (1<<10) /* FPR-GR transfer facility */ #define VEX_HWCAPS_S390X_LSC (1<<16) /* Conditional load/store facility */ @@ -180,8 +179,7 @@ typedef #define VEX_HWCAPS_S390X_MSA9 (1<<30) /* Message-security-assist extension 9 */ /* Special value representing all available s390x hwcaps */ -#define VEX_HWCAPS_S390X_ALL (VEX_HWCAPS_S390X_EIMM | \ - VEX_HWCAPS_S390X_GIE | \ +#define VEX_HWCAPS_S390X_ALL (VEX_HWCAPS_S390X_GIE | \ VEX_HWCAPS_S390X_FGX | \ VEX_HWCAPS_S390X_LSC | \ VEX_HWCAPS_S390X_PFPO | \ diff --git a/coregrind/m_machine.c b/coregrind/m_machine.c index 2c613708aa..e7aca5cb32 100644 --- a/coregrind/m_machine.c +++ b/coregrind/m_machine.c @@ -1565,7 +1565,6 @@ Bool VG_(machine_get_hwcaps)( void ) UInt hwcaps_bit; const HChar name[6]; // may need adjustment for new facility names } fac_hwcaps[] = { - { False, 21, VEX_HWCAPS_S390X_EIMM, "EIMM" }, { False, 34, VEX_HWCAPS_S390X_GIE, "GIE" }, { False, 41, VEX_HWCAPS_S390X_FGX, "FGX" }, { False, 45, VEX_HWCAPS_S390X_LSC, "LSC" }, diff --git a/tests/s390x_features.c b/tests/s390x_features.c index 592b5487c8..593c8c556b 100644 --- a/tests/s390x_features.c +++ b/tests/s390x_features.c @@ -229,8 +229,6 @@ static int go(char *feature, char *cpu) match = (facilities[0] & FAC_BIT(1)) && (facilities[0] & FAC_BIT(2)); } else if (strcmp(feature, "s390x-n3") == 0 ) { match = facilities[0] & FAC_BIT(0); - } else if (strcmp(feature, "s390x-eimm") == 0 ) { - match = facilities[0] & FAC_BIT(21); } else if (strcmp(feature, "s390x-genins") == 0 ) { match = facilities[0] & FAC_BIT(34); } else if (strcmp(feature, "s390x-exrl") == 0 ) { |