Message ID | 20161207180727.6286-2-rth@twiddle.net |
---|---|
State | New |
Headers | show |
On 7 December 2016 at 18:07, Richard Henderson <rth@twiddle.net> wrote: > When al == xzr, we cannot use addi/subi because that encodes xsp. > Force a zero into the temp register for that (rare) case. Incidentally I was slightly surprised that the optimisation pass didn't turn "add2 rlo, rhi, 0, 0, 0, 0" into moves of 0 into rlo and rhi. Constant shifts of xzr in the guest don't seem worth spending much effort on optimising though :-) thanks -- PMM
On 12/07/2016 10:10 AM, Peter Maydell wrote: > On 7 December 2016 at 18:07, Richard Henderson <rth@twiddle.net> wrote: >> When al == xzr, we cannot use addi/subi because that encodes xsp. >> Force a zero into the temp register for that (rare) case. > > Incidentally I was slightly surprised that the optimisation > pass didn't turn "add2 rlo, rhi, 0, 0, 0, 0" into moves of 0 > into rlo and rhi. Constant shifts of xzr in the guest don't > seem worth spending much effort on optimising though :-) Until this last release cycle, we couldn't insert opcodes into the instruction stream during optimization. Thus we were very restricted in what we could do when wanting to assign simpler values to two different outputs. I'll bet addition of 0 + non-constant come up semi-regularly for 32-bit hosts and 64-bit guests. I'll see about better simplification of double-word arithmetic for the next cycle. r~
diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c index 1939d35..6c68681 100644 --- a/tcg/aarch64/tcg-target.inc.c +++ b/tcg/aarch64/tcg-target.inc.c @@ -965,6 +965,15 @@ static inline void tcg_out_addsub2(TCGContext *s, int ext, TCGReg rl, insn = I3401_SUBSI; bl = -bl; } + if (unlikely(al == TCG_REG_XZR)) { + /* ??? We want to allow al to be zero for the benefit of + negation via subtraction. However, that leaves open the + possibility of adding 0+const in the low part, and the + immediate add instructions encode XSP not XZR. Don't try + anything more elaborate here than loading another zero. */ + al = TCG_REG_TMP; + tcg_out_movi(s, ext, al, 0); + } tcg_out_insn_3401(s, insn, ext, rl, al, bl); } else { tcg_out_insn_3502(s, sub ? I3502_SUBS : I3502_ADDS, ext, rl, al, bl);
When al == xzr, we cannot use addi/subi because that encodes xsp. Force a zero into the temp register for that (rare) case. Signed-off-by: Richard Henderson <rth@twiddle.net> --- tcg/aarch64/tcg-target.inc.c | 9 +++++++++ 1 file changed, 9 insertions(+)