In another thread we talked about doing the brcond2 -> brcond optimization generically for LT/GTE comparisons vs zero. That's patch 4 of this series. In addition, it seemed trivial to go ahead and apply the existing code we have for fully optimizing constant comparisons.
Tested host i686, guest alpha. Where even the final patch activates during the boot rom. (FYI, implver is sorta like cpuid, querying cpu revision.) 0xfffffc0000003748: implver t0 0xfffffc000000374c: cmpeq t0,0x1,t1 0xfffffc0000003750: bne t1,0x40000003784 OP: ---- 0xfffffc0000003748 movi_i32 ir1_0,$0x2 movi_i32 ir1_1,$0x0 ---- 0xfffffc000000374c movi_i32 tmp0,$0x1 movi_i32 tmp1,$0x0 setcond2_i32 ir2_0,ir1_0,ir1_1,tmp0,tmp1,eq movi_i32 ir2_1,$0x0 ---- 0xfffffc0000003750 mov_i32 tmp0,ir2_0 mov_i32 tmp1,ir2_1 movi_i32 tmp2,$0x0 movi_i32 tmp3,$0x0 brcond2_i32 tmp0,tmp1,tmp2,tmp3,ne,$0x0 ... OP after optimization and liveness analysis: ---- 0xfffffc0000003748 movi_i32 ir1_0,$0x2 movi_i32 ir1_1,$0x0 ---- 0xfffffc000000374c nopn $0x2,$0x2 nopn $0x2,$0x2 movi_i32 ir2_0,$0x0 movi_i32 ir2_1,$0x0 ---- 0xfffffc0000003750 nopn $0x2,$0x2 nopn $0x2,$0x2 nopn $0x2,$0x2 nopn $0x2,$0x2 nop ... r~ Richard Henderson (7): tcg: Split out swap_commutative as a subroutine tcg: Optimize add2 + sub2 tcg: Swap commutative double-word comparisons tcg: Optimize double-word comparisons against zero tcg: Split out subroutines from do_constant_folding_cond tcg: Tidy brcond optimization tcg: Do constant folding on double-word comparisons tcg/optimize.c | 366 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 267 insertions(+), 99 deletions(-) -- 1.7.11.4