On 12/19/2009 02:31 AM, Blue Swirl wrote:
static inline void tcg_out_movi_imm32(TCGContext *s, int ret, uint32_t arg)
{
- if (check_fit_tl(arg, 12))
+ if (check_fit_tl(arg, 13))
tcg_out_movi_imm13(s, ret, arg);
IIRC sign extension prevents this.
Pardon? check_fit_tl checks a signed value, the OR opcode provides one.
Where's the conflict?
- if (const_arg2&& arg2 == 0)
- /* orcc %g0, r, %g0 */
- tcg_out_arith(s, TCG_REG_G0, TCG_REG_G0, arg1, ARITH_ORCC);
- else
- /* subcc r1, r2, %g0 */
- tcg_out_arith(s, TCG_REG_G0, arg1, arg2, ARITH_SUBCC);
- tcg_out_branch_i32(s, tcg_cond_to_bcond[cond], label_index);
+ tcg_out_cmp(s, arg1, arg2, const_arg2);
What's wrong with 'orcc' (produces the synthetic instruction 'tst')?
What result does "orcc" give that isn't produced by "subcc"? Unlike
i386 where "test x,x" is one byte smaller than "cmp $0,x", it seems to
me there's no reason to distingish the arg2 == constant zero case on sparc.
r~