tcg/s390x: Avoid the constant pool in tcg_out_movi
Load constants in no more than two insns, which turns out to be faster than using the constant pool. Suggested-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Ilya Leoshkevich <iii@linux.ibm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
1818c71ba1
commit
90497e03ca
@ -877,6 +877,9 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg dst, TCGReg src)
|
|||||||
static const S390Opcode li_insns[4] = {
|
static const S390Opcode li_insns[4] = {
|
||||||
RI_LLILL, RI_LLILH, RI_LLIHL, RI_LLIHH
|
RI_LLILL, RI_LLILH, RI_LLIHL, RI_LLIHH
|
||||||
};
|
};
|
||||||
|
static const S390Opcode oi_insns[4] = {
|
||||||
|
RI_OILL, RI_OILH, RI_OIHL, RI_OIHH
|
||||||
|
};
|
||||||
static const S390Opcode lif_insns[2] = {
|
static const S390Opcode lif_insns[2] = {
|
||||||
RIL_LLILF, RIL_LLIHF,
|
RIL_LLILF, RIL_LLIHF,
|
||||||
};
|
};
|
||||||
@ -928,9 +931,20 @@ static void tcg_out_movi(TCGContext *s, TCGType type,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Otherwise, stuff it in the constant pool. */
|
/* Otherwise, load it by parts. */
|
||||||
tcg_out_insn(s, RIL, LGRL, ret, 0);
|
i = is_const_p16((uint32_t)uval);
|
||||||
new_pool_label(s, sval, R_390_PC32DBL, s->code_ptr - 2, 2);
|
if (i >= 0) {
|
||||||
|
tcg_out_insn_RI(s, li_insns[i], ret, uval >> (i * 16));
|
||||||
|
} else {
|
||||||
|
tcg_out_insn(s, RIL, LLILF, ret, uval);
|
||||||
|
}
|
||||||
|
uval >>= 32;
|
||||||
|
i = is_const_p16(uval);
|
||||||
|
if (i >= 0) {
|
||||||
|
tcg_out_insn_RI(s, oi_insns[i + 2], ret, uval >> (i * 16));
|
||||||
|
} else {
|
||||||
|
tcg_out_insn(s, RIL, OIHF, ret, uval);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emit a load/store type instruction. Inputs are:
|
/* Emit a load/store type instruction. Inputs are:
|
||||||
@ -1160,9 +1174,6 @@ static void tgen_andi(TCGContext *s, TCGType type, TCGReg dest, uint64_t val)
|
|||||||
|
|
||||||
static void tgen_ori(TCGContext *s, TCGReg dest, uint64_t val)
|
static void tgen_ori(TCGContext *s, TCGReg dest, uint64_t val)
|
||||||
{
|
{
|
||||||
static const S390Opcode oi_insns[4] = {
|
|
||||||
RI_OILL, RI_OILH, RI_OIHL, RI_OIHH
|
|
||||||
};
|
|
||||||
static const S390Opcode oif_insns[2] = {
|
static const S390Opcode oif_insns[2] = {
|
||||||
RIL_OILF, RIL_OIHF
|
RIL_OILF, RIL_OIHF
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user