static UChar *
s390_emit_LDGR(UChar *p, UChar r1, UChar r2)
{
- vassert(s390_host_has_fgx);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
S390_DISASM(MNM("ldgr"), FPR(r1), GPR(r2));
static UChar *
s390_emit_LGDR(UChar *p, UChar r1, UChar r2)
{
- vassert(s390_host_has_fgx);
-
if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM))
S390_DISASM(MNM("lgdr"), GPR(r1), FPR(r2));
}
/*------------------------------------------------------------*/
-/*--- Wrapper functions ---*/
+/*--- Emit functions for vector insns ---*/
/*------------------------------------------------------------*/
-static UChar *
-s390_emit_LGDRw(UChar *p, UChar r1, UChar r2)
-{
- if (s390_host_has_fgx) {
- return s390_emit_LGDR(p, r1, r2);
- }
-
- /* 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/ */
- 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));
-}
-
-
-static UChar *
-s390_emit_LDGRw(UChar *p, UChar r1, UChar r2)
-{
- if (s390_host_has_fgx) {
- return s390_emit_LDGR(p, r1, r2);
- }
-
- /* 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/ */
- 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));
-}
-
-
static UChar *
s390_emit_VL(UChar *p, UChar v1, UChar x2, UChar b2, UShort d2)
{
if (dst_class == HRcFlt64 && src_class == HRcInt64) {
if (insn->size == 4) {
buf = s390_emit_SLLG(buf, R0, src, 0, DISP20(32)); /* r0 = src << 32 */
- return s390_emit_LDGRw(buf, dst, R0);
+ return s390_emit_LDGR(buf, dst, R0);
} else {
- return s390_emit_LDGRw(buf, dst, src);
+ return s390_emit_LDGR(buf, dst, src);
}
}
if (dst_class == HRcInt64 && src_class == HRcFlt64) {
if (insn->size == 4) {
- buf = s390_emit_LGDRw(buf, dst, src);
+ buf = s390_emit_LGDR(buf, dst, src);
return s390_emit_SRLG(buf, dst, dst, 0, DISP20(32)); /* dst >>= 32 */
} else {
- return s390_emit_LGDRw(buf, dst, src);
+ return s390_emit_LGDR(buf, dst, src);
}
}
if (dst_class == HRcFlt64 && src_class == HRcVec128) {
#define VEX_S390X_MODEL_UNKNOWN 19 /* always last in list */
#define VEX_S390X_MODEL_MASK 0x3F
-#define VEX_HWCAPS_S390X_FGX (1<<10) /* FPR-GR transfer facility */
#define VEX_HWCAPS_S390X_LSC (1<<16) /* Conditional load/store facility */
#define VEX_HWCAPS_S390X_PFPO (1<<17) /* Perform floating point ops facility */
#define VEX_HWCAPS_S390X_VX (1<<18) /* Vector facility */
#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_FGX | \
- VEX_HWCAPS_S390X_LSC | \
+#define VEX_HWCAPS_S390X_ALL (VEX_HWCAPS_S390X_LSC | \
VEX_HWCAPS_S390X_PFPO | \
VEX_HWCAPS_S390X_VX | \
VEX_HWCAPS_S390X_MSA5 | \