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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
}
-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));
}
-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)
{
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
}
-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)
{
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));
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));
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));
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. */
/* 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);
}
/*------------------------------------------------------------*/
}
-/* 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)
{
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);
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);
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 */
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);
/* 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
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;
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)
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:
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;
}
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;
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)
}
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);
}
{
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());
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
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();
}
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();
}