On 11/27/2016 11:42 PM, Jin Guojie wrote:
By reading Richard and Aurelien's comment, I realized now the best way to solve
this problem
is not to add ext32s in brcond_32i, but to fix the helper function. In another
word,
the register value should be 32-bit sign-extened at where it's being *created*,
not where
it's being *utilized*. Maybe I can do this ext32s after helper_le_ld_name() is
call back to ensure
V0 to be sign-extended.
It's not necessarily V0 that needs to be extended, but the destination register
(S1 in this case). So perhaps
tcg_out_opc_br(s, OPC_BEQ, TCG_REG_ZERO, TCG_REG_ZERO);
/* delay slot */
- tcg_out_mov(s, TCG_TYPE_REG, v0, TCG_REG_V0);
+ if (TCG_TARGET_REG_BITS == 64 && l->type == TCG_TYPE_I32) {
+ tcg_out_opc_sa(s, OPC_SLL, v0, TCG_REG_V0, 0);
+ } else {
+ tcg_out_opc_reg(s, OPC_OR, v0, TCG_REG_V0, TCG_REG_ZERO);
+ }
so that we always sign-extend 32-bit loads.
r~