diff options
author | Aurelien Jarno <aurelien@aurel32.net> | 2012-09-06 16:47:14 +0200 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2012-09-11 18:05:58 +0200 |
commit | 01ee5282ea955dee4e189b34ef888be6f36d9861 (patch) | |
tree | 10f6059b90f5a264fba1cf04ef0e81c929588b63 /tcg | |
parent | 61251c0c790d0a63468c8e3eb2767c1f4bf3654a (diff) |
tcg/optimize: simplify shift/rot r, 0, a => movi r, 0 cases
shift/rot r, 0, a is equivalent to movi r, 0.
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Diffstat (limited to 'tcg')
-rw-r--r-- | tcg/optimize.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/tcg/optimize.c b/tcg/optimize.c index c12cb2bc4b..1698ba39b3 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -322,6 +322,26 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, break; } + /* Simplify expressions for "shift/rot r, 0, a => movi r, 0" */ + switch (op) { + CASE_OP_32_64(shl): + CASE_OP_32_64(shr): + CASE_OP_32_64(sar): + CASE_OP_32_64(rotl): + CASE_OP_32_64(rotr): + if (temps[args[1]].state == TCG_TEMP_CONST + && temps[args[1]].val == 0) { + gen_opc_buf[op_index] = op_to_movi(op); + tcg_opt_gen_movi(gen_args, args[0], 0, nb_temps, nb_globals); + args += 3; + gen_args += 2; + continue; + } + break; + default: + break; + } + /* Simplify expression for "op r, a, 0 => mov r, a" cases */ switch (op) { CASE_OP_32_64(add): |