ARM back-end: Use sxt[bh] instructions for ext{8, 6}s

This patch uses sxtb for ext8s_i32 and sxth for ext16s_i32 in ARM back-end.

Signed-off-by: Laurent Desnogues <laurent.desnogues@gmail.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
Laurent Desnogues 2009-09-13 14:27:31 +02:00 committed by Aurelien Jarno
parent 02c068c3ae
commit 7990496dcb

View File

@ -1547,16 +1547,26 @@ static inline void tcg_out_op(TCGContext *s, int opc,
break; break;
case INDEX_op_ext8s_i32: case INDEX_op_ext8s_i32:
#ifdef __ARM_ARCH_7A__
/* sxtb */
tcg_out32(s, 0xe6af0070 | (args[0] << 12) | args[1]);
#else
tcg_out_dat_reg(s, COND_AL, ARITH_MOV, tcg_out_dat_reg(s, COND_AL, ARITH_MOV,
args[0], 0, args[1], SHIFT_IMM_LSL(24)); args[0], 0, args[1], SHIFT_IMM_LSL(24));
tcg_out_dat_reg(s, COND_AL, ARITH_MOV, tcg_out_dat_reg(s, COND_AL, ARITH_MOV,
args[0], 0, args[0], SHIFT_IMM_ASR(24)); args[0], 0, args[0], SHIFT_IMM_ASR(24));
#endif
break; break;
case INDEX_op_ext16s_i32: case INDEX_op_ext16s_i32:
#ifdef __ARM_ARCH_7A__
/* sxth */
tcg_out32(s, 0xe6bf0070 | (args[0] << 12) | args[1]);
#else
tcg_out_dat_reg(s, COND_AL, ARITH_MOV, tcg_out_dat_reg(s, COND_AL, ARITH_MOV,
args[0], 0, args[1], SHIFT_IMM_LSL(16)); args[0], 0, args[1], SHIFT_IMM_LSL(16));
tcg_out_dat_reg(s, COND_AL, ARITH_MOV, tcg_out_dat_reg(s, COND_AL, ARITH_MOV,
args[0], 0, args[0], SHIFT_IMM_ASR(16)); args[0], 0, args[0], SHIFT_IMM_ASR(16));
#endif
break; break;
default: default: