}
+static UChar *
+emit_RIE(UChar *p, ULong op, UChar r1, UShort i2, UChar m3)
+{
+ ULong the_insn = op;
+
+ the_insn |= ((ULong)r1) << 36;
+ the_insn |= ((ULong)m3) << 32;
+ the_insn |= ((ULong)i2) << 16;
+
+ return emit_6bytes(p, the_insn);
+}
+
+
static UChar *
emit_RR(UChar *p, UInt op, UChar r1, UChar r2)
{
return emit_RSY(p, 0xeb00000000e2ULL, r1, m3, b2, dl2, dh2);
}
+static UChar *
+s390_emit_LOCGHI(UChar *p, UChar r1, UShort i2, UChar m3)
+{
+ if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
+ s390_disasm(ENC4(MNM, GPR, INT, UINT), "locghi", r1, (Int)(Short)i2, m3);
+
+ return emit_RIE(p, 0xec0000000046ULL, r1, i2, m3);
+}
+
/* Provide a symbolic name for register "R0" */
#define R0 0
if (cond == S390_CC_ALWAYS)
return s390_emit_LGHI(buf, r1, 1); /* r1 = 1 */
+ /* If LOCGHI is available, use it. */
+ if (s390_host_has_lsc2) {
+ /* Clear r1, then load immediate 1 on condition. */
+ buf = s390_emit_LGHI(buf, r1, 0);
+ if (cond != S390_CC_NEVER)
+ buf = s390_emit_LOCGHI(buf, r1, 1, cond);
+ return buf;
+ }
+
buf = s390_emit_load_cc(buf, r1); /* r1 = cc */
buf = s390_emit_LGHI(buf, R0, cond); /* r0 = mask */
buf = s390_emit_SLLG(buf, r1, R0, r1, DISP20(0)); /* r1 = mask << cc */
case S390_OPND_IMMEDIATE: {
ULong value = src.variant.imm;
+ /* If LOCGHI is available, use it. */
+ if (s390_host_has_lsc2 && ulong_fits_signed_16bit(value)) {
+ return s390_emit_LOCGHI(p, hregNumber(dst), value, cond);
+ }
+
/* Load value into R0, then use LOCGR */
if (insn->size <= 4) {
p = s390_emit_load_32imm(p, R0, value);
#define VEX_HWCAPS_S390X_VX (1<<18) /* Vector facility */
#define VEX_HWCAPS_S390X_MSA5 (1<<19) /* message security assistance facility */
#define VEX_HWCAPS_S390X_MI2 (1<<20) /* miscellaneous-instruction-extensions facility 2 */
+#define VEX_HWCAPS_S390X_LSC2 (1<<21) /* Conditional load/store facility2 */
/* Special value representing all available s390x hwcaps */
VEX_HWCAPS_S390X_PFPO | \
VEX_HWCAPS_S390X_VX | \
VEX_HWCAPS_S390X_MSA5 | \
- VEX_HWCAPS_S390X_MI2)
+ VEX_HWCAPS_S390X_MI2 | \
+ VEX_HWCAPS_S390X_LSC2)
#define VEX_HWCAPS_S390X(x) ((x) & ~VEX_S390X_MODEL_MASK)
#define VEX_S390X_MODEL(x) ((x) & VEX_S390X_MODEL_MASK)
{ False, S390_FAC_VX, VEX_HWCAPS_S390X_VX, "VX" },
{ False, S390_FAC_MSA5, VEX_HWCAPS_S390X_MSA5, "MSA5" },
{ False, S390_FAC_MI2, VEX_HWCAPS_S390X_MI2, "MI2" },
+ { False, S390_FAC_LSC2, VEX_HWCAPS_S390X_LSC2, "LSC2" },
};
/* Set hwcaps according to the detected facilities */