tcg/s390x: Distinguish RRF-a and RRF-c formats
One has 3 register arguments; the other has 2 plus an m3 field. Reviewed-by: Ilya Leoshkevich <iii@linux.ibm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
1b74cf6ea2
commit
1dd06b1aab
@ -172,18 +172,19 @@ typedef enum S390Opcode {
|
||||
RRE_SLBGR = 0xb989,
|
||||
RRE_XGR = 0xb982,
|
||||
|
||||
RRF_LOCR = 0xb9f2,
|
||||
RRF_LOCGR = 0xb9e2,
|
||||
RRF_NRK = 0xb9f4,
|
||||
RRF_NGRK = 0xb9e4,
|
||||
RRF_ORK = 0xb9f6,
|
||||
RRF_OGRK = 0xb9e6,
|
||||
RRF_SRK = 0xb9f9,
|
||||
RRF_SGRK = 0xb9e9,
|
||||
RRF_SLRK = 0xb9fb,
|
||||
RRF_SLGRK = 0xb9eb,
|
||||
RRF_XRK = 0xb9f7,
|
||||
RRF_XGRK = 0xb9e7,
|
||||
RRFa_NRK = 0xb9f4,
|
||||
RRFa_NGRK = 0xb9e4,
|
||||
RRFa_ORK = 0xb9f6,
|
||||
RRFa_OGRK = 0xb9e6,
|
||||
RRFa_SRK = 0xb9f9,
|
||||
RRFa_SGRK = 0xb9e9,
|
||||
RRFa_SLRK = 0xb9fb,
|
||||
RRFa_SLGRK = 0xb9eb,
|
||||
RRFa_XRK = 0xb9f7,
|
||||
RRFa_XGRK = 0xb9e7,
|
||||
|
||||
RRFc_LOCR = 0xb9f2,
|
||||
RRFc_LOCGR = 0xb9e2,
|
||||
|
||||
RR_AR = 0x1a,
|
||||
RR_ALR = 0x1e,
|
||||
@ -538,8 +539,14 @@ static void tcg_out_insn_RRE(TCGContext *s, S390Opcode op,
|
||||
tcg_out32(s, (op << 16) | (r1 << 4) | r2);
|
||||
}
|
||||
|
||||
static void tcg_out_insn_RRF(TCGContext *s, S390Opcode op,
|
||||
TCGReg r1, TCGReg r2, int m3)
|
||||
static void tcg_out_insn_RRFa(TCGContext *s, S390Opcode op,
|
||||
TCGReg r1, TCGReg r2, TCGReg r3)
|
||||
{
|
||||
tcg_out32(s, (op << 16) | (r3 << 12) | (r1 << 4) | r2);
|
||||
}
|
||||
|
||||
static void tcg_out_insn_RRFc(TCGContext *s, S390Opcode op,
|
||||
TCGReg r1, TCGReg r2, int m3)
|
||||
{
|
||||
tcg_out32(s, (op << 16) | (m3 << 12) | (r1 << 4) | r2);
|
||||
}
|
||||
@ -1324,7 +1331,7 @@ static void tgen_setcond(TCGContext *s, TCGType type, TCGCond cond,
|
||||
/* Emit: d = 0, t = 1, d = (cc ? t : d). */
|
||||
tcg_out_movi(s, TCG_TYPE_I64, dest, 0);
|
||||
tcg_out_movi(s, TCG_TYPE_I64, TCG_TMP0, 1);
|
||||
tcg_out_insn(s, RRF, LOCGR, dest, TCG_TMP0, cc);
|
||||
tcg_out_insn(s, RRFc, LOCGR, dest, TCG_TMP0, cc);
|
||||
}
|
||||
|
||||
static void tgen_movcond(TCGContext *s, TCGType type, TCGCond c, TCGReg dest,
|
||||
@ -1335,7 +1342,7 @@ static void tgen_movcond(TCGContext *s, TCGType type, TCGCond c, TCGReg dest,
|
||||
if (v3const) {
|
||||
tcg_out_insn(s, RIE, LOCGHI, dest, v3, cc);
|
||||
} else {
|
||||
tcg_out_insn(s, RRF, LOCGR, dest, v3, cc);
|
||||
tcg_out_insn(s, RRFc, LOCGR, dest, v3, cc);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1356,7 +1363,7 @@ static void tgen_clz(TCGContext *s, TCGReg dest, TCGReg a1,
|
||||
tcg_out_mov(s, TCG_TYPE_I64, dest, a2);
|
||||
}
|
||||
/* Emit: if (one bit found) dest = r0. */
|
||||
tcg_out_insn(s, RRF, LOCGR, dest, TCG_REG_R0, 2);
|
||||
tcg_out_insn(s, RRFc, LOCGR, dest, TCG_REG_R0, 2);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1960,7 +1967,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
} else if (a0 == a1) {
|
||||
tcg_out_insn(s, RR, SR, a0, a2);
|
||||
} else {
|
||||
tcg_out_insn(s, RRF, SRK, a0, a1, a2);
|
||||
tcg_out_insn(s, RRFa, SRK, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1972,7 +1979,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
} else if (a0 == a1) {
|
||||
tcg_out_insn(s, RR, NR, a0, a2);
|
||||
} else {
|
||||
tcg_out_insn(s, RRF, NRK, a0, a1, a2);
|
||||
tcg_out_insn(s, RRFa, NRK, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
case INDEX_op_or_i32:
|
||||
@ -1983,7 +1990,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
} else if (a0 == a1) {
|
||||
tcg_out_insn(s, RR, OR, a0, a2);
|
||||
} else {
|
||||
tcg_out_insn(s, RRF, ORK, a0, a1, a2);
|
||||
tcg_out_insn(s, RRFa, ORK, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
case INDEX_op_xor_i32:
|
||||
@ -1994,7 +2001,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
} else if (a0 == a1) {
|
||||
tcg_out_insn(s, RR, XR, args[0], args[2]);
|
||||
} else {
|
||||
tcg_out_insn(s, RRF, XRK, a0, a1, a2);
|
||||
tcg_out_insn(s, RRFa, XRK, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -2220,7 +2227,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
a2 = -a2;
|
||||
goto do_addi_64;
|
||||
} else {
|
||||
tcg_out_insn(s, RRF, SGRK, a0, a1, a2);
|
||||
tcg_out_insn(s, RRFa, SGRK, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -2230,7 +2237,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
tcg_out_mov(s, TCG_TYPE_I64, a0, a1);
|
||||
tgen_andi(s, TCG_TYPE_I64, args[0], args[2]);
|
||||
} else {
|
||||
tcg_out_insn(s, RRF, NGRK, a0, a1, a2);
|
||||
tcg_out_insn(s, RRFa, NGRK, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
case INDEX_op_or_i64:
|
||||
@ -2239,7 +2246,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
tcg_out_mov(s, TCG_TYPE_I64, a0, a1);
|
||||
tgen_ori(s, TCG_TYPE_I64, a0, a2);
|
||||
} else {
|
||||
tcg_out_insn(s, RRF, OGRK, a0, a1, a2);
|
||||
tcg_out_insn(s, RRFa, OGRK, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
case INDEX_op_xor_i64:
|
||||
@ -2248,7 +2255,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
tcg_out_mov(s, TCG_TYPE_I64, a0, a1);
|
||||
tgen_xori(s, TCG_TYPE_I64, a0, a2);
|
||||
} else {
|
||||
tcg_out_insn(s, RRF, XGRK, a0, a1, a2);
|
||||
tcg_out_insn(s, RRFa, XGRK, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user