S390_CC_OP_LOAD_AND_TEST = 15,
S390_CC_OP_LOAD_POSITIVE_32 = 16,
S390_CC_OP_LOAD_POSITIVE_64 = 17,
- S390_CC_OP_TEST_AND_SET = 18,
- S390_CC_OP_TEST_UNDER_MASK_8 = 19,
- S390_CC_OP_TEST_UNDER_MASK_16 = 20,
- S390_CC_OP_SHIFT_LEFT_32 = 21,
- S390_CC_OP_SHIFT_LEFT_64 = 22,
- S390_CC_OP_INSERT_CHAR_MASK_32 = 23,
- S390_CC_OP_BFP_RESULT_32 = 24,
- S390_CC_OP_BFP_RESULT_64 = 25,
- S390_CC_OP_BFP_RESULT_128 = 26,
- S390_CC_OP_BFP_32_TO_INT_32 = 27,
- S390_CC_OP_BFP_64_TO_INT_32 = 28,
- S390_CC_OP_BFP_128_TO_INT_32 = 29,
- S390_CC_OP_BFP_32_TO_INT_64 = 30,
- S390_CC_OP_BFP_64_TO_INT_64 = 31,
- S390_CC_OP_BFP_128_TO_INT_64 = 32,
- S390_CC_OP_BFP_TDC_32 = 33,
- S390_CC_OP_BFP_TDC_64 = 34,
- S390_CC_OP_BFP_TDC_128 = 35,
- S390_CC_OP_SET = 36
+ S390_CC_OP_TEST_UNDER_MASK_8 = 18,
+ S390_CC_OP_TEST_UNDER_MASK_16 = 19,
+ S390_CC_OP_SHIFT_LEFT_32 = 20,
+ S390_CC_OP_SHIFT_LEFT_64 = 21,
+ S390_CC_OP_INSERT_CHAR_MASK_32 = 22,
+ S390_CC_OP_BFP_RESULT_32 = 23,
+ S390_CC_OP_BFP_RESULT_64 = 24,
+ S390_CC_OP_BFP_RESULT_128 = 25,
+ S390_CC_OP_BFP_32_TO_INT_32 = 26,
+ S390_CC_OP_BFP_64_TO_INT_32 = 27,
+ S390_CC_OP_BFP_128_TO_INT_32 = 28,
+ S390_CC_OP_BFP_32_TO_INT_64 = 29,
+ S390_CC_OP_BFP_64_TO_INT_64 = 30,
+ S390_CC_OP_BFP_128_TO_INT_64 = 31,
+ S390_CC_OP_BFP_TDC_32 = 32,
+ S390_CC_OP_BFP_TDC_64 = 33,
+ S390_CC_OP_BFP_TDC_128 = 34,
+ S390_CC_OP_SET = 35
};
/*------------------------------------------------------------*/
| S390_CC_OP_LOAD_AND_TEST | S loaded value | | |
| S390_CC_OP_LOAD_POSITIVE_32 | S loaded value | | |
| S390_CC_OP_LOAD_POSITIVE_64 | S loaded value | | |
- | S390_CC_OP_TEST_AND_SET | Z tested value | | |
| S390_CC_OP_TEST_UNDER_MASK_8 | Z tested value | Z mask | |
| S390_CC_OP_TEST_UNDER_MASK_16 | Z tested value | Z mask | |
| S390_CC_OP_SHIFT_LEFT_32 | Z value to be shifted | Z shift amount | |
/* Like signed comparison with 0 */
return S390_CC_FOR_BINARY("cgr", cc_dep1, (Long)0);
- case S390_CC_OP_TEST_AND_SET:
- /* Shift the sign bit into the LSB. Note, that the tested value is an
- 8-bit value which has been zero-extended to 32/64 bit. */
- return cc_dep1 >> 7;
-
case S390_CC_OP_LOAD_POSITIVE_32:
__asm__ volatile (
"lpr %[result],%[op]\n\t"
mkU64(0)));
}
- /* S390_CC_OP_TEST_AND_SET */
- if (cc_op == S390_CC_OP_TEST_AND_SET) {
- /* cc_dep1 is the zero-extended loaded value
-
- cc == 0 --> leftmost bit is zero (cond == 8)
- cc == 1 --> leftmost bit is one (cond == 4)
-
- As cc is either 0 or 1, only the two leftmost bits of the mask
- are relevant. */
- IRExpr *bit = binop(Iop_Shr64, cc_dep1, mkU8(7));
-
- switch (cond & (8 + 4)) {
- case 0: return mkU32(0);
- case 4: return unop(Iop_1Uto32, binop(Iop_CmpNE64, bit, mkU64(0)));
- case 8: return unop(Iop_1Uto32, binop(Iop_CmpEQ64, bit, mkU64(0)));
- case 8 + 4: return mkU32(1);
- }
- /* not reached */
- }
-
missed:
;
}
return "svc";
}
-static HChar *
-s390_irgen_TS(IRTemp op2addr)
-{
- IRTemp value = newTemp(Ity_I8);
-
- assign(value, load(Ity_I8, mkexpr(op2addr)));
- s390_cc_thunk_putZ(S390_CC_OP_TEST_AND_SET, value);
- store(mkexpr(op2addr), mkU8(255));
-
- return "ts";
-}
-
static HChar *
s390_irgen_TM(UChar i2, IRTemp op1addr)
{
switch ((ovl.value & 0xffff0000) >> 16) {
case 0x8000: /* SSM */ goto unimplemented;
case 0x8200: /* LPSW */ goto unimplemented;
- case 0x9300: s390_format_S_RD(s390_irgen_TS, ovl.fmt.S.b2, ovl.fmt.S.d2);
- goto ok;
+ case 0x9300: /* TS */ goto unimplemented;
case 0xb202: /* STIDP */ goto unimplemented;
case 0xb204: /* SCK */ goto unimplemented;
- case 0xb205: s390_format_S_RD(s390_irgen_STCK, ovl.fmt.S.b2, ovl.fmt.S.d2);goto ok;
+ case 0xb205: s390_format_S_RD(s390_irgen_STCK, ovl.fmt.S.b2, ovl.fmt.S.d2);
+ goto ok;
case 0xb206: /* SCKC */ goto unimplemented;
case 0xb207: /* STCKC */ goto unimplemented;
case 0xb208: /* SPT */ goto unimplemented;