tcg-sparc: Add tcg_out_arithc.
Add a function to handle the register-vs-immediate test for arithmetic. Also, adjust the OP_32_64 macro so that it auto-indents properly. Rename the gen_arith32 label to gen_arith, since it handles 64-bit arithmetic as well. Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
83755c173f
commit
ba225198d0
|
@ -285,6 +285,13 @@ static inline void tcg_out_arithi(TCGContext *s, int rd, int rs1,
|
||||||
INSN_IMM13(offset));
|
INSN_IMM13(offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tcg_out_arithc(TCGContext *s, int rd, int rs1,
|
||||||
|
int val2, int val2const, int op)
|
||||||
|
{
|
||||||
|
tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1)
|
||||||
|
| (val2const ? INSN_IMM13(val2) : INSN_RS2(val2)));
|
||||||
|
}
|
||||||
|
|
||||||
static inline void tcg_out_mov(TCGContext *s, int ret, int arg)
|
static inline void tcg_out_mov(TCGContext *s, int ret, int arg)
|
||||||
{
|
{
|
||||||
tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR);
|
tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR);
|
||||||
|
@ -481,10 +488,7 @@ static const uint8_t tcg_cond_to_bcond[10] = {
|
||||||
|
|
||||||
static void tcg_out_cmp(TCGContext *s, TCGArg c1, TCGArg c2, int c2const)
|
static void tcg_out_cmp(TCGContext *s, TCGArg c1, TCGArg c2, int c2const)
|
||||||
{
|
{
|
||||||
if (c2const)
|
tcg_out_arithc(s, TCG_REG_G0, c1, c2, c2const, ARITH_SUBCC);
|
||||||
tcg_out_arithi(s, TCG_REG_G0, c1, c2, ARITH_SUBCC);
|
|
||||||
else
|
|
||||||
tcg_out_arith(s, TCG_REG_G0, c1, c2, ARITH_SUBCC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tcg_out_brcond_i32(TCGContext *s, int cond,
|
static void tcg_out_brcond_i32(TCGContext *s, int cond,
|
||||||
|
@ -1036,22 +1040,22 @@ static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args,
|
||||||
|
|
||||||
#if TCG_TARGET_REG_BITS == 64
|
#if TCG_TARGET_REG_BITS == 64
|
||||||
#define OP_32_64(x) \
|
#define OP_32_64(x) \
|
||||||
glue(glue(case INDEX_op_, x), _i32:) \
|
glue(glue(case INDEX_op_, x), _i32): \
|
||||||
glue(glue(case INDEX_op_, x), _i64:)
|
glue(glue(case INDEX_op_, x), _i64)
|
||||||
#else
|
#else
|
||||||
#define OP_32_64(x) \
|
#define OP_32_64(x) \
|
||||||
glue(glue(case INDEX_op_, x), _i32:)
|
glue(glue(case INDEX_op_, x), _i32)
|
||||||
#endif
|
#endif
|
||||||
OP_32_64(ld8u);
|
OP_32_64(ld8u):
|
||||||
tcg_out_ldst(s, args[0], args[1], args[2], LDUB);
|
tcg_out_ldst(s, args[0], args[1], args[2], LDUB);
|
||||||
break;
|
break;
|
||||||
OP_32_64(ld8s);
|
OP_32_64(ld8s):
|
||||||
tcg_out_ldst(s, args[0], args[1], args[2], LDSB);
|
tcg_out_ldst(s, args[0], args[1], args[2], LDSB);
|
||||||
break;
|
break;
|
||||||
OP_32_64(ld16u);
|
OP_32_64(ld16u):
|
||||||
tcg_out_ldst(s, args[0], args[1], args[2], LDUH);
|
tcg_out_ldst(s, args[0], args[1], args[2], LDUH);
|
||||||
break;
|
break;
|
||||||
OP_32_64(ld16s);
|
OP_32_64(ld16s):
|
||||||
tcg_out_ldst(s, args[0], args[1], args[2], LDSH);
|
tcg_out_ldst(s, args[0], args[1], args[2], LDSH);
|
||||||
break;
|
break;
|
||||||
case INDEX_op_ld_i32:
|
case INDEX_op_ld_i32:
|
||||||
|
@ -1060,10 +1064,10 @@ static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args,
|
||||||
#endif
|
#endif
|
||||||
tcg_out_ldst(s, args[0], args[1], args[2], LDUW);
|
tcg_out_ldst(s, args[0], args[1], args[2], LDUW);
|
||||||
break;
|
break;
|
||||||
OP_32_64(st8);
|
OP_32_64(st8):
|
||||||
tcg_out_ldst(s, args[0], args[1], args[2], STB);
|
tcg_out_ldst(s, args[0], args[1], args[2], STB);
|
||||||
break;
|
break;
|
||||||
OP_32_64(st16);
|
OP_32_64(st16):
|
||||||
tcg_out_ldst(s, args[0], args[1], args[2], STH);
|
tcg_out_ldst(s, args[0], args[1], args[2], STH);
|
||||||
break;
|
break;
|
||||||
case INDEX_op_st_i32:
|
case INDEX_op_st_i32:
|
||||||
|
@ -1072,50 +1076,50 @@ static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args,
|
||||||
#endif
|
#endif
|
||||||
tcg_out_ldst(s, args[0], args[1], args[2], STW);
|
tcg_out_ldst(s, args[0], args[1], args[2], STW);
|
||||||
break;
|
break;
|
||||||
OP_32_64(add);
|
OP_32_64(add):
|
||||||
c = ARITH_ADD;
|
c = ARITH_ADD;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
OP_32_64(sub);
|
OP_32_64(sub):
|
||||||
c = ARITH_SUB;
|
c = ARITH_SUB;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
OP_32_64(and);
|
OP_32_64(and):
|
||||||
c = ARITH_AND;
|
c = ARITH_AND;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
OP_32_64(or);
|
OP_32_64(or):
|
||||||
c = ARITH_OR;
|
c = ARITH_OR;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
OP_32_64(xor);
|
OP_32_64(xor):
|
||||||
c = ARITH_XOR;
|
c = ARITH_XOR;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_shl_i32:
|
case INDEX_op_shl_i32:
|
||||||
c = SHIFT_SLL;
|
c = SHIFT_SLL;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_shr_i32:
|
case INDEX_op_shr_i32:
|
||||||
c = SHIFT_SRL;
|
c = SHIFT_SRL;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_sar_i32:
|
case INDEX_op_sar_i32:
|
||||||
c = SHIFT_SRA;
|
c = SHIFT_SRA;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_mul_i32:
|
case INDEX_op_mul_i32:
|
||||||
c = ARITH_UMUL;
|
c = ARITH_UMUL;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_div2_i32:
|
case INDEX_op_div2_i32:
|
||||||
#if defined(__sparc_v9__) || defined(__sparc_v8plus__)
|
#if defined(__sparc_v9__) || defined(__sparc_v8plus__)
|
||||||
c = ARITH_SDIVX;
|
c = ARITH_SDIVX;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
#else
|
#else
|
||||||
tcg_out_sety(s, 0);
|
tcg_out_sety(s, 0);
|
||||||
c = ARITH_SDIV;
|
c = ARITH_SDIV;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
#endif
|
#endif
|
||||||
case INDEX_op_divu2_i32:
|
case INDEX_op_divu2_i32:
|
||||||
#if defined(__sparc_v9__) || defined(__sparc_v8plus__)
|
#if defined(__sparc_v9__) || defined(__sparc_v8plus__)
|
||||||
c = ARITH_UDIVX;
|
c = ARITH_UDIVX;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
#else
|
#else
|
||||||
tcg_out_sety(s, 0);
|
tcg_out_sety(s, 0);
|
||||||
c = ARITH_UDIV;
|
c = ARITH_UDIV;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case INDEX_op_brcond_i32:
|
case INDEX_op_brcond_i32:
|
||||||
|
@ -1173,22 +1177,22 @@ static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args,
|
||||||
break;
|
break;
|
||||||
case INDEX_op_shl_i64:
|
case INDEX_op_shl_i64:
|
||||||
c = SHIFT_SLLX;
|
c = SHIFT_SLLX;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_shr_i64:
|
case INDEX_op_shr_i64:
|
||||||
c = SHIFT_SRLX;
|
c = SHIFT_SRLX;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_sar_i64:
|
case INDEX_op_sar_i64:
|
||||||
c = SHIFT_SRAX;
|
c = SHIFT_SRAX;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_mul_i64:
|
case INDEX_op_mul_i64:
|
||||||
c = ARITH_MULX;
|
c = ARITH_MULX;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_div2_i64:
|
case INDEX_op_div2_i64:
|
||||||
c = ARITH_SDIVX;
|
c = ARITH_SDIVX;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
case INDEX_op_divu2_i64:
|
case INDEX_op_divu2_i64:
|
||||||
c = ARITH_UDIVX;
|
c = ARITH_UDIVX;
|
||||||
goto gen_arith32;
|
goto gen_arith;
|
||||||
|
|
||||||
case INDEX_op_brcond_i64:
|
case INDEX_op_brcond_i64:
|
||||||
tcg_out_brcond_i64(s, args[2], args[0], args[1], const_args[1],
|
tcg_out_brcond_i64(s, args[2], args[0], args[1], const_args[1],
|
||||||
|
@ -1202,12 +1206,8 @@ static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
gen_arith32:
|
gen_arith:
|
||||||
if (const_args[2]) {
|
tcg_out_arithc(s, args[0], args[1], args[2], const_args[2], c);
|
||||||
tcg_out_arithi(s, args[0], args[1], args[2], c);
|
|
||||||
} else {
|
|
||||||
tcg_out_arith(s, args[0], args[1], args[2], c);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in a new issue