Signed-off-by: Richard Henderson <r...@twiddle.net> --- tcg/aarch64/tcg-target.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c index 9effee7..e50abcb 100644 --- a/tcg/aarch64/tcg-target.c +++ b/tcg/aarch64/tcg-target.c @@ -573,6 +573,17 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, type = TCG_TYPE_I32; } + /* Speed things up by handling the common case of small positive + and negative values specially. */ + if ((value & ~0xffffull) == 0) { + tcg_fmt_Rd_uimm(s, INSN_MOVZ, type, rd, value, 0); + return; + } + if ((~svalue & ~0xffffull) == 0) { + tcg_fmt_Rd_uimm(s, INSN_MOVN, type, rd, ~svalue, 0); + return; + } + /* Check for bitfield immediates. For the benefit of 32-bit quantities, use the sign-extended value. That lets us match rotated values such as 0xff0000ff with the same 64-bit logic matching 0xffffffffff0000ff. -- 1.8.3.1