|
|
|
@ -25,15 +25,9 @@ |
|
|
|
/* Used for function call generation. */ |
|
|
|
#define TCG_TARGET_CALL_STACK_OFFSET 0 |
|
|
|
#define TCG_TARGET_STACK_ALIGN 8 |
|
|
|
#if TCG_TARGET_REG_BITS == 32 |
|
|
|
# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EVEN |
|
|
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN |
|
|
|
# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN |
|
|
|
#else |
|
|
|
# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL |
|
|
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL |
|
|
|
# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL |
|
|
|
#endif |
|
|
|
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL |
|
|
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL |
|
|
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL |
|
|
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL |
|
|
|
|
|
|
|
static TCGConstraintSetIndex |
|
|
|
@ -320,7 +314,7 @@ static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg val, TCGReg base, |
|
|
|
{ |
|
|
|
TCGOpcode op = INDEX_op_ld; |
|
|
|
|
|
|
|
if (TCG_TARGET_REG_BITS == 64 && type == TCG_TYPE_I32) { |
|
|
|
if (type == TCG_TYPE_I32) { |
|
|
|
op = INDEX_op_ld32u; |
|
|
|
} |
|
|
|
tcg_out_ldst(s, op, val, base, offset); |
|
|
|
@ -337,11 +331,9 @@ static void tcg_out_movi(TCGContext *s, TCGType type, |
|
|
|
{ |
|
|
|
switch (type) { |
|
|
|
case TCG_TYPE_I32: |
|
|
|
#if TCG_TARGET_REG_BITS == 64 |
|
|
|
arg = (int32_t)arg; |
|
|
|
/* fall through */ |
|
|
|
case TCG_TYPE_I64: |
|
|
|
#endif |
|
|
|
break; |
|
|
|
default: |
|
|
|
g_assert_not_reached(); |
|
|
|
@ -407,13 +399,11 @@ static void tcg_out_ext16u(TCGContext *s, TCGReg rd, TCGReg rs) |
|
|
|
|
|
|
|
static void tcg_out_ext32s(TCGContext *s, TCGReg rd, TCGReg rs) |
|
|
|
{ |
|
|
|
tcg_debug_assert(TCG_TARGET_REG_BITS == 64); |
|
|
|
tcg_out_sextract(s, TCG_TYPE_I64, rd, rs, 0, 32); |
|
|
|
} |
|
|
|
|
|
|
|
static void tcg_out_ext32u(TCGContext *s, TCGReg rd, TCGReg rs) |
|
|
|
{ |
|
|
|
tcg_debug_assert(TCG_TARGET_REG_BITS == 64); |
|
|
|
tcg_out_extract(s, TCG_TYPE_I64, rd, rs, 0, 32); |
|
|
|
} |
|
|
|
|
|
|
|
@ -429,7 +419,6 @@ static void tcg_out_extu_i32_i64(TCGContext *s, TCGReg rd, TCGReg rs) |
|
|
|
|
|
|
|
static void tcg_out_extrl_i64_i32(TCGContext *s, TCGReg rd, TCGReg rs) |
|
|
|
{ |
|
|
|
tcg_debug_assert(TCG_TARGET_REG_BITS == 64); |
|
|
|
tcg_out_mov(s, TCG_TYPE_I32, rd, rs); |
|
|
|
} |
|
|
|
|
|
|
|
@ -654,7 +643,6 @@ static const TCGOutOpBinary outop_eqv = { |
|
|
|
.out_rrr = tgen_eqv, |
|
|
|
}; |
|
|
|
|
|
|
|
#if TCG_TARGET_REG_BITS == 64 |
|
|
|
static void tgen_extrh_i64_i32(TCGContext *s, TCGType t, TCGReg a0, TCGReg a1) |
|
|
|
{ |
|
|
|
tcg_out_extract(s, TCG_TYPE_I64, a0, a1, 32, 32); |
|
|
|
@ -664,7 +652,6 @@ static const TCGOutOpUnary outop_extrh_i64_i32 = { |
|
|
|
.base.static_constraint = C_O1_I1(r, r), |
|
|
|
.out_rr = tgen_extrh_i64_i32, |
|
|
|
}; |
|
|
|
#endif |
|
|
|
|
|
|
|
static void tgen_mul(TCGContext *s, TCGType type, |
|
|
|
TCGReg a0, TCGReg a1, TCGReg a2) |
|
|
|
@ -962,7 +949,6 @@ static const TCGOutOpBswap outop_bswap32 = { |
|
|
|
.out_rr = tgen_bswap32, |
|
|
|
}; |
|
|
|
|
|
|
|
#if TCG_TARGET_REG_BITS == 64 |
|
|
|
static void tgen_bswap64(TCGContext *s, TCGType type, TCGReg a0, TCGReg a1) |
|
|
|
{ |
|
|
|
tcg_out_op_rr(s, INDEX_op_bswap64, a0, a1); |
|
|
|
@ -972,7 +958,6 @@ static const TCGOutOpUnary outop_bswap64 = { |
|
|
|
.base.static_constraint = C_O1_I1(r, r), |
|
|
|
.out_rr = tgen_bswap64, |
|
|
|
}; |
|
|
|
#endif |
|
|
|
|
|
|
|
static void tgen_neg(TCGContext *s, TCGType type, TCGReg a0, TCGReg a1) |
|
|
|
{ |
|
|
|
@ -1101,7 +1086,6 @@ static const TCGOutOpLoad outop_ld16s = { |
|
|
|
.out = tgen_ld16s, |
|
|
|
}; |
|
|
|
|
|
|
|
#if TCG_TARGET_REG_BITS == 64 |
|
|
|
static void tgen_ld32u(TCGContext *s, TCGType type, TCGReg dest, |
|
|
|
TCGReg base, ptrdiff_t offset) |
|
|
|
{ |
|
|
|
@ -1123,7 +1107,6 @@ static const TCGOutOpLoad outop_ld32s = { |
|
|
|
.base.static_constraint = C_O1_I1(r, r), |
|
|
|
.out = tgen_ld32s, |
|
|
|
}; |
|
|
|
#endif |
|
|
|
|
|
|
|
static void tgen_st8(TCGContext *s, TCGType type, TCGReg data, |
|
|
|
TCGReg base, ptrdiff_t offset) |
|
|
|
@ -1168,18 +1151,8 @@ static const TCGOutOpQemuLdSt outop_qemu_ld = { |
|
|
|
.out = tgen_qemu_ld, |
|
|
|
}; |
|
|
|
|
|
|
|
static void tgen_qemu_ld2(TCGContext *s, TCGType type, TCGReg datalo, |
|
|
|
TCGReg datahi, TCGReg addr, MemOpIdx oi) |
|
|
|
{ |
|
|
|
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_TMP, oi); |
|
|
|
tcg_out_op_rrrr(s, INDEX_op_qemu_ld2, datalo, datahi, addr, TCG_REG_TMP); |
|
|
|
} |
|
|
|
|
|
|
|
static const TCGOutOpQemuLdSt2 outop_qemu_ld2 = { |
|
|
|
.base.static_constraint = |
|
|
|
TCG_TARGET_REG_BITS == 64 ? C_NotImplemented : C_O2_I1(r, r, r), |
|
|
|
.out = |
|
|
|
TCG_TARGET_REG_BITS == 64 ? NULL : tgen_qemu_ld2, |
|
|
|
.base.static_constraint = C_NotImplemented, |
|
|
|
}; |
|
|
|
|
|
|
|
static void tgen_qemu_st(TCGContext *s, TCGType type, TCGReg data, |
|
|
|
@ -1198,18 +1171,8 @@ static const TCGOutOpQemuLdSt outop_qemu_st = { |
|
|
|
.out = tgen_qemu_st, |
|
|
|
}; |
|
|
|
|
|
|
|
static void tgen_qemu_st2(TCGContext *s, TCGType type, TCGReg datalo, |
|
|
|
TCGReg datahi, TCGReg addr, MemOpIdx oi) |
|
|
|
{ |
|
|
|
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_TMP, oi); |
|
|
|
tcg_out_op_rrrr(s, INDEX_op_qemu_st2, datalo, datahi, addr, TCG_REG_TMP); |
|
|
|
} |
|
|
|
|
|
|
|
static const TCGOutOpQemuLdSt2 outop_qemu_st2 = { |
|
|
|
.base.static_constraint = |
|
|
|
TCG_TARGET_REG_BITS == 64 ? C_NotImplemented : C_O0_I3(r, r, r), |
|
|
|
.out = |
|
|
|
TCG_TARGET_REG_BITS == 64 ? NULL : tgen_qemu_st2, |
|
|
|
.base.static_constraint = C_NotImplemented, |
|
|
|
}; |
|
|
|
|
|
|
|
static void tcg_out_st(TCGContext *s, TCGType type, TCGReg val, TCGReg base, |
|
|
|
@ -1217,7 +1180,7 @@ static void tcg_out_st(TCGContext *s, TCGType type, TCGReg val, TCGReg base, |
|
|
|
{ |
|
|
|
TCGOpcode op = INDEX_op_st; |
|
|
|
|
|
|
|
if (TCG_TARGET_REG_BITS == 64 && type == TCG_TYPE_I32) { |
|
|
|
if (type == TCG_TYPE_I32) { |
|
|
|
op = INDEX_op_st32; |
|
|
|
} |
|
|
|
tcg_out_ldst(s, op, val, base, offset); |
|
|
|
|