提交 e8996ee0 编写于 作者: B bellard

added tcg_temp_free() and improved the handling of constants

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4544 c046a42c-6fe2-441c-8c8c-71466251a162
上级 d7e4036e
...@@ -178,88 +178,115 @@ static inline void tcg_gen_movi_i32(TCGv ret, int32_t arg) ...@@ -178,88 +178,115 @@ static inline void tcg_gen_movi_i32(TCGv ret, int32_t arg)
static inline void tcg_gen_helper_0_0(void *func) static inline void tcg_gen_helper_0_0(void *func)
{ {
TCGv t0;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
0, NULL, 0, NULL); 0, NULL, 0, NULL);
tcg_temp_free(t0);
} }
static inline void tcg_gen_helper_0_1(void *func, TCGv arg) static inline void tcg_gen_helper_0_1(void *func, TCGv arg)
{ {
TCGv t0;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
0, NULL, 1, &arg); 0, NULL, 1, &arg);
tcg_temp_free(t0);
} }
static inline void tcg_gen_helper_0_2(void *func, TCGv arg1, TCGv arg2) static inline void tcg_gen_helper_0_2(void *func, TCGv arg1, TCGv arg2)
{ {
TCGv args[2]; TCGv args[2];
TCGv t0;
args[0] = arg1; args[0] = arg1;
args[1] = arg2; args[1] = arg2;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
0, NULL, 2, args); 0, NULL, 2, args);
tcg_temp_free(t0);
} }
static inline void tcg_gen_helper_0_3(void *func, static inline void tcg_gen_helper_0_3(void *func,
TCGv arg1, TCGv arg2, TCGv arg3) TCGv arg1, TCGv arg2, TCGv arg3)
{ {
TCGv args[3]; TCGv args[3];
TCGv t0;
args[0] = arg1; args[0] = arg1;
args[1] = arg2; args[1] = arg2;
args[2] = arg3; args[2] = arg3;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
0, NULL, 3, args); 0, NULL, 3, args);
tcg_temp_free(t0);
} }
static inline void tcg_gen_helper_0_4(void *func, TCGv arg1, TCGv arg2, static inline void tcg_gen_helper_0_4(void *func, TCGv arg1, TCGv arg2,
TCGv arg3, TCGv arg4) TCGv arg3, TCGv arg4)
{ {
TCGv args[4]; TCGv args[4];
TCGv t0;
args[0] = arg1; args[0] = arg1;
args[1] = arg2; args[1] = arg2;
args[2] = arg3; args[2] = arg3;
args[3] = arg4; args[3] = arg4;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
0, NULL, 4, args); 0, NULL, 4, args);
tcg_temp_free(t0);
} }
static inline void tcg_gen_helper_1_0(void *func, TCGv ret) static inline void tcg_gen_helper_1_0(void *func, TCGv ret)
{ {
TCGv t0;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
1, &ret, 0, NULL); 1, &ret, 0, NULL);
tcg_temp_free(t0);
} }
static inline void tcg_gen_helper_1_1(void *func, TCGv ret, TCGv arg1) static inline void tcg_gen_helper_1_1(void *func, TCGv ret, TCGv arg1)
{ {
TCGv t0;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
1, &ret, 1, &arg1); 1, &ret, 1, &arg1);
tcg_temp_free(t0);
} }
static inline void tcg_gen_helper_1_2(void *func, TCGv ret, static inline void tcg_gen_helper_1_2(void *func, TCGv ret,
TCGv arg1, TCGv arg2) TCGv arg1, TCGv arg2)
{ {
TCGv args[2]; TCGv args[2];
TCGv t0;
args[0] = arg1; args[0] = arg1;
args[1] = arg2; args[1] = arg2;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
1, &ret, 2, args); 1, &ret, 2, args);
tcg_temp_free(t0);
} }
static inline void tcg_gen_helper_1_3(void *func, TCGv ret, static inline void tcg_gen_helper_1_3(void *func, TCGv ret,
TCGv arg1, TCGv arg2, TCGv arg3) TCGv arg1, TCGv arg2, TCGv arg3)
{ {
TCGv args[3]; TCGv args[3];
TCGv t0;
args[0] = arg1; args[0] = arg1;
args[1] = arg2; args[1] = arg2;
args[2] = arg3; args[2] = arg3;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
1, &ret, 3, args); 1, &ret, 3, args);
tcg_temp_free(t0);
} }
static inline void tcg_gen_helper_1_4(void *func, TCGv ret, static inline void tcg_gen_helper_1_4(void *func, TCGv ret,
...@@ -267,13 +294,16 @@ static inline void tcg_gen_helper_1_4(void *func, TCGv ret, ...@@ -267,13 +294,16 @@ static inline void tcg_gen_helper_1_4(void *func, TCGv ret,
TCGv arg4) TCGv arg4)
{ {
TCGv args[4]; TCGv args[4];
TCGv t0;
args[0] = arg1; args[0] = arg1;
args[1] = arg2; args[1] = arg2;
args[2] = arg3; args[2] = arg3;
args[3] = arg4; args[3] = arg4;
t0 = tcg_const_ptr((tcg_target_long)func);
tcg_gen_call(&tcg_ctx, tcg_gen_call(&tcg_ctx,
tcg_const_ptr((tcg_target_long)func), TCG_HELPER_CALL_FLAGS, t0, TCG_HELPER_CALL_FLAGS,
1, &ret, 4, args); 1, &ret, 4, args);
tcg_temp_free(t0);
} }
/* 32 bit ops */ /* 32 bit ops */
...@@ -329,7 +359,9 @@ static inline void tcg_gen_addi_i32(TCGv ret, TCGv arg1, int32_t arg2) ...@@ -329,7 +359,9 @@ static inline void tcg_gen_addi_i32(TCGv ret, TCGv arg1, int32_t arg2)
if (arg2 == 0) { if (arg2 == 0) {
tcg_gen_mov_i32(ret, arg1); tcg_gen_mov_i32(ret, arg1);
} else { } else {
tcg_gen_add_i32(ret, arg1, tcg_const_i32(arg2)); TCGv t0 = tcg_const_i32(arg2);
tcg_gen_add_i32(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -344,7 +376,9 @@ static inline void tcg_gen_subi_i32(TCGv ret, TCGv arg1, int32_t arg2) ...@@ -344,7 +376,9 @@ static inline void tcg_gen_subi_i32(TCGv ret, TCGv arg1, int32_t arg2)
if (arg2 == 0) { if (arg2 == 0) {
tcg_gen_mov_i32(ret, arg1); tcg_gen_mov_i32(ret, arg1);
} else { } else {
tcg_gen_sub_i32(ret, arg1, tcg_const_i32(arg2)); TCGv t0 = tcg_const_i32(arg2);
tcg_gen_sub_i32(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -361,7 +395,9 @@ static inline void tcg_gen_andi_i32(TCGv ret, TCGv arg1, int32_t arg2) ...@@ -361,7 +395,9 @@ static inline void tcg_gen_andi_i32(TCGv ret, TCGv arg1, int32_t arg2)
} else if (arg2 == 0xffffffff) { } else if (arg2 == 0xffffffff) {
tcg_gen_mov_i32(ret, arg1); tcg_gen_mov_i32(ret, arg1);
} else { } else {
tcg_gen_and_i32(ret, arg1, tcg_const_i32(arg2)); TCGv t0 = tcg_const_i32(arg2);
tcg_gen_and_i32(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -378,7 +414,9 @@ static inline void tcg_gen_ori_i32(TCGv ret, TCGv arg1, int32_t arg2) ...@@ -378,7 +414,9 @@ static inline void tcg_gen_ori_i32(TCGv ret, TCGv arg1, int32_t arg2)
} else if (arg2 == 0) { } else if (arg2 == 0) {
tcg_gen_mov_i32(ret, arg1); tcg_gen_mov_i32(ret, arg1);
} else { } else {
tcg_gen_or_i32(ret, arg1, tcg_const_i32(arg2)); TCGv t0 = tcg_const_i32(arg2);
tcg_gen_or_i32(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -393,7 +431,9 @@ static inline void tcg_gen_xori_i32(TCGv ret, TCGv arg1, int32_t arg2) ...@@ -393,7 +431,9 @@ static inline void tcg_gen_xori_i32(TCGv ret, TCGv arg1, int32_t arg2)
if (arg2 == 0) { if (arg2 == 0) {
tcg_gen_mov_i32(ret, arg1); tcg_gen_mov_i32(ret, arg1);
} else { } else {
tcg_gen_xor_i32(ret, arg1, tcg_const_i32(arg2)); TCGv t0 = tcg_const_i32(arg2);
tcg_gen_xor_i32(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -407,7 +447,9 @@ static inline void tcg_gen_shli_i32(TCGv ret, TCGv arg1, int32_t arg2) ...@@ -407,7 +447,9 @@ static inline void tcg_gen_shli_i32(TCGv ret, TCGv arg1, int32_t arg2)
if (arg2 == 0) { if (arg2 == 0) {
tcg_gen_mov_i32(ret, arg1); tcg_gen_mov_i32(ret, arg1);
} else { } else {
tcg_gen_shl_i32(ret, arg1, tcg_const_i32(arg2)); TCGv t0 = tcg_const_i32(arg2);
tcg_gen_shl_i32(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -421,7 +463,9 @@ static inline void tcg_gen_shri_i32(TCGv ret, TCGv arg1, int32_t arg2) ...@@ -421,7 +463,9 @@ static inline void tcg_gen_shri_i32(TCGv ret, TCGv arg1, int32_t arg2)
if (arg2 == 0) { if (arg2 == 0) {
tcg_gen_mov_i32(ret, arg1); tcg_gen_mov_i32(ret, arg1);
} else { } else {
tcg_gen_shr_i32(ret, arg1, tcg_const_i32(arg2)); TCGv t0 = tcg_const_i32(arg2);
tcg_gen_shr_i32(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -435,7 +479,9 @@ static inline void tcg_gen_sari_i32(TCGv ret, TCGv arg1, int32_t arg2) ...@@ -435,7 +479,9 @@ static inline void tcg_gen_sari_i32(TCGv ret, TCGv arg1, int32_t arg2)
if (arg2 == 0) { if (arg2 == 0) {
tcg_gen_mov_i32(ret, arg1); tcg_gen_mov_i32(ret, arg1);
} else { } else {
tcg_gen_sar_i32(ret, arg1, tcg_const_i32(arg2)); TCGv t0 = tcg_const_i32(arg2);
tcg_gen_sar_i32(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -452,7 +498,9 @@ static inline void tcg_gen_mul_i32(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -452,7 +498,9 @@ static inline void tcg_gen_mul_i32(TCGv ret, TCGv arg1, TCGv arg2)
static inline void tcg_gen_muli_i32(TCGv ret, TCGv arg1, int32_t arg2) static inline void tcg_gen_muli_i32(TCGv ret, TCGv arg1, int32_t arg2)
{ {
tcg_gen_mul_i32(ret, arg1, tcg_const_i32(arg2)); TCGv t0 = tcg_const_i32(arg2);
tcg_gen_mul_i32(ret, arg1, t0);
tcg_temp_free(t0);
} }
#ifdef TCG_TARGET_HAS_div_i32 #ifdef TCG_TARGET_HAS_div_i32
...@@ -482,6 +530,7 @@ static inline void tcg_gen_div_i32(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -482,6 +530,7 @@ static inline void tcg_gen_div_i32(TCGv ret, TCGv arg1, TCGv arg2)
t0 = tcg_temp_new(TCG_TYPE_I32); t0 = tcg_temp_new(TCG_TYPE_I32);
tcg_gen_sari_i32(t0, arg1, 31); tcg_gen_sari_i32(t0, arg1, 31);
tcg_gen_op5(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2); tcg_gen_op5(INDEX_op_div2_i32, ret, t0, arg1, t0, arg2);
tcg_temp_free(t0);
} }
static inline void tcg_gen_rem_i32(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_rem_i32(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -490,6 +539,7 @@ static inline void tcg_gen_rem_i32(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -490,6 +539,7 @@ static inline void tcg_gen_rem_i32(TCGv ret, TCGv arg1, TCGv arg2)
t0 = tcg_temp_new(TCG_TYPE_I32); t0 = tcg_temp_new(TCG_TYPE_I32);
tcg_gen_sari_i32(t0, arg1, 31); tcg_gen_sari_i32(t0, arg1, 31);
tcg_gen_op5(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2); tcg_gen_op5(INDEX_op_div2_i32, t0, ret, arg1, t0, arg2);
tcg_temp_free(t0);
} }
static inline void tcg_gen_divu_i32(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_divu_i32(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -498,6 +548,7 @@ static inline void tcg_gen_divu_i32(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -498,6 +548,7 @@ static inline void tcg_gen_divu_i32(TCGv ret, TCGv arg1, TCGv arg2)
t0 = tcg_temp_new(TCG_TYPE_I32); t0 = tcg_temp_new(TCG_TYPE_I32);
tcg_gen_movi_i32(t0, 0); tcg_gen_movi_i32(t0, 0);
tcg_gen_op5(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2); tcg_gen_op5(INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2);
tcg_temp_free(t0);
} }
static inline void tcg_gen_remu_i32(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_remu_i32(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -506,6 +557,7 @@ static inline void tcg_gen_remu_i32(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -506,6 +557,7 @@ static inline void tcg_gen_remu_i32(TCGv ret, TCGv arg1, TCGv arg2)
t0 = tcg_temp_new(TCG_TYPE_I32); t0 = tcg_temp_new(TCG_TYPE_I32);
tcg_gen_movi_i32(t0, 0); tcg_gen_movi_i32(t0, 0);
tcg_gen_op5(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2); tcg_gen_op5(INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2);
tcg_temp_free(t0);
} }
#endif #endif
...@@ -608,7 +660,9 @@ static inline void tcg_gen_add_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -608,7 +660,9 @@ static inline void tcg_gen_add_i64(TCGv ret, TCGv arg1, TCGv arg2)
static inline void tcg_gen_addi_i64(TCGv ret, TCGv arg1, int64_t arg2) static inline void tcg_gen_addi_i64(TCGv ret, TCGv arg1, int64_t arg2)
{ {
tcg_gen_add_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_add_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -619,7 +673,9 @@ static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -619,7 +673,9 @@ static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2)
static inline void tcg_gen_subi_i64(TCGv ret, TCGv arg1, int64_t arg2) static inline void tcg_gen_subi_i64(TCGv ret, TCGv arg1, int64_t arg2)
{ {
tcg_gen_sub_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_sub_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
static inline void tcg_gen_and_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_and_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -713,11 +769,15 @@ static inline void tcg_gen_mul_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -713,11 +769,15 @@ static inline void tcg_gen_mul_i64(TCGv ret, TCGv arg1, TCGv arg2)
tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1); tcg_gen_add_i32(TCGV_HIGH(t0), TCGV_HIGH(t0), t1);
tcg_gen_mov_i64(ret, t0); tcg_gen_mov_i64(ret, t0);
tcg_temp_free(t0);
tcg_temp_free(t1);
} }
static inline void tcg_gen_muli_i64(TCGv ret, TCGv arg1, int64_t arg2) static inline void tcg_gen_muli_i64(TCGv ret, TCGv arg1, int64_t arg2)
{ {
tcg_gen_mul_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_mul_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
static inline void tcg_gen_div_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_div_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -824,7 +884,9 @@ static inline void tcg_gen_add_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -824,7 +884,9 @@ static inline void tcg_gen_add_i64(TCGv ret, TCGv arg1, TCGv arg2)
static inline void tcg_gen_addi_i64(TCGv ret, TCGv arg1, int64_t arg2) static inline void tcg_gen_addi_i64(TCGv ret, TCGv arg1, int64_t arg2)
{ {
tcg_gen_add_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_add_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -834,7 +896,9 @@ static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -834,7 +896,9 @@ static inline void tcg_gen_sub_i64(TCGv ret, TCGv arg1, TCGv arg2)
static inline void tcg_gen_subi_i64(TCGv ret, TCGv arg1, int64_t arg2) static inline void tcg_gen_subi_i64(TCGv ret, TCGv arg1, int64_t arg2)
{ {
tcg_gen_sub_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_sub_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
static inline void tcg_gen_and_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_and_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -844,7 +908,9 @@ static inline void tcg_gen_and_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -844,7 +908,9 @@ static inline void tcg_gen_and_i64(TCGv ret, TCGv arg1, TCGv arg2)
static inline void tcg_gen_andi_i64(TCGv ret, TCGv arg1, int64_t arg2) static inline void tcg_gen_andi_i64(TCGv ret, TCGv arg1, int64_t arg2)
{ {
tcg_gen_and_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_and_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
static inline void tcg_gen_or_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_or_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -854,7 +920,9 @@ static inline void tcg_gen_or_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -854,7 +920,9 @@ static inline void tcg_gen_or_i64(TCGv ret, TCGv arg1, TCGv arg2)
static inline void tcg_gen_ori_i64(TCGv ret, TCGv arg1, int64_t arg2) static inline void tcg_gen_ori_i64(TCGv ret, TCGv arg1, int64_t arg2)
{ {
tcg_gen_or_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_or_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
static inline void tcg_gen_xor_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_xor_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -864,7 +932,9 @@ static inline void tcg_gen_xor_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -864,7 +932,9 @@ static inline void tcg_gen_xor_i64(TCGv ret, TCGv arg1, TCGv arg2)
static inline void tcg_gen_xori_i64(TCGv ret, TCGv arg1, int64_t arg2) static inline void tcg_gen_xori_i64(TCGv ret, TCGv arg1, int64_t arg2)
{ {
tcg_gen_xor_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_xor_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
static inline void tcg_gen_shl_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_shl_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -877,7 +947,9 @@ static inline void tcg_gen_shli_i64(TCGv ret, TCGv arg1, int64_t arg2) ...@@ -877,7 +947,9 @@ static inline void tcg_gen_shli_i64(TCGv ret, TCGv arg1, int64_t arg2)
if (arg2 == 0) { if (arg2 == 0) {
tcg_gen_mov_i64(ret, arg1); tcg_gen_mov_i64(ret, arg1);
} else { } else {
tcg_gen_shl_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_shl_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -891,7 +963,9 @@ static inline void tcg_gen_shri_i64(TCGv ret, TCGv arg1, int64_t arg2) ...@@ -891,7 +963,9 @@ static inline void tcg_gen_shri_i64(TCGv ret, TCGv arg1, int64_t arg2)
if (arg2 == 0) { if (arg2 == 0) {
tcg_gen_mov_i64(ret, arg1); tcg_gen_mov_i64(ret, arg1);
} else { } else {
tcg_gen_shr_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_shr_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -905,7 +979,9 @@ static inline void tcg_gen_sari_i64(TCGv ret, TCGv arg1, int64_t arg2) ...@@ -905,7 +979,9 @@ static inline void tcg_gen_sari_i64(TCGv ret, TCGv arg1, int64_t arg2)
if (arg2 == 0) { if (arg2 == 0) {
tcg_gen_mov_i64(ret, arg1); tcg_gen_mov_i64(ret, arg1);
} else { } else {
tcg_gen_sar_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_sar_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
} }
...@@ -922,7 +998,9 @@ static inline void tcg_gen_mul_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -922,7 +998,9 @@ static inline void tcg_gen_mul_i64(TCGv ret, TCGv arg1, TCGv arg2)
static inline void tcg_gen_muli_i64(TCGv ret, TCGv arg1, int64_t arg2) static inline void tcg_gen_muli_i64(TCGv ret, TCGv arg1, int64_t arg2)
{ {
tcg_gen_mul_i64(ret, arg1, tcg_const_i64(arg2)); TCGv t0 = tcg_const_i64(arg2);
tcg_gen_mul_i64(ret, arg1, t0);
tcg_temp_free(t0);
} }
#ifdef TCG_TARGET_HAS_div_i64 #ifdef TCG_TARGET_HAS_div_i64
...@@ -952,6 +1030,7 @@ static inline void tcg_gen_div_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -952,6 +1030,7 @@ static inline void tcg_gen_div_i64(TCGv ret, TCGv arg1, TCGv arg2)
t0 = tcg_temp_new(TCG_TYPE_I64); t0 = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_sari_i64(t0, arg1, 63); tcg_gen_sari_i64(t0, arg1, 63);
tcg_gen_op5(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2); tcg_gen_op5(INDEX_op_div2_i64, ret, t0, arg1, t0, arg2);
tcg_temp_free(t0);
} }
static inline void tcg_gen_rem_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_rem_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -960,6 +1039,7 @@ static inline void tcg_gen_rem_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -960,6 +1039,7 @@ static inline void tcg_gen_rem_i64(TCGv ret, TCGv arg1, TCGv arg2)
t0 = tcg_temp_new(TCG_TYPE_I64); t0 = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_sari_i64(t0, arg1, 63); tcg_gen_sari_i64(t0, arg1, 63);
tcg_gen_op5(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2); tcg_gen_op5(INDEX_op_div2_i64, t0, ret, arg1, t0, arg2);
tcg_temp_free(t0);
} }
static inline void tcg_gen_divu_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_divu_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -968,6 +1048,7 @@ static inline void tcg_gen_divu_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -968,6 +1048,7 @@ static inline void tcg_gen_divu_i64(TCGv ret, TCGv arg1, TCGv arg2)
t0 = tcg_temp_new(TCG_TYPE_I64); t0 = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_movi_i64(t0, 0); tcg_gen_movi_i64(t0, 0);
tcg_gen_op5(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2); tcg_gen_op5(INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2);
tcg_temp_free(t0);
} }
static inline void tcg_gen_remu_i64(TCGv ret, TCGv arg1, TCGv arg2) static inline void tcg_gen_remu_i64(TCGv ret, TCGv arg1, TCGv arg2)
...@@ -976,6 +1057,7 @@ static inline void tcg_gen_remu_i64(TCGv ret, TCGv arg1, TCGv arg2) ...@@ -976,6 +1057,7 @@ static inline void tcg_gen_remu_i64(TCGv ret, TCGv arg1, TCGv arg2)
t0 = tcg_temp_new(TCG_TYPE_I64); t0 = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_movi_i64(t0, 0); tcg_gen_movi_i64(t0, 0);
tcg_gen_op5(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2); tcg_gen_op5(INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2);
tcg_temp_free(t0);
} }
#endif #endif
...@@ -1030,6 +1112,8 @@ static inline void tcg_gen_bswap16_i32(TCGv ret, TCGv arg) ...@@ -1030,6 +1112,8 @@ static inline void tcg_gen_bswap16_i32(TCGv ret, TCGv arg)
tcg_gen_andi_i32(t1, arg, 0x000000ff); tcg_gen_andi_i32(t1, arg, 0x000000ff);
tcg_gen_shli_i32(t1, t1, 8); tcg_gen_shli_i32(t1, t1, 8);
tcg_gen_or_i32(ret, t0, t1); tcg_gen_or_i32(ret, t0, t1);
tcg_temp_free(t0);
tcg_temp_free(t1);
#endif #endif
} }
...@@ -1054,6 +1138,8 @@ static inline void tcg_gen_bswap_i32(TCGv ret, TCGv arg) ...@@ -1054,6 +1138,8 @@ static inline void tcg_gen_bswap_i32(TCGv ret, TCGv arg)
tcg_gen_shri_i32(t1, arg, 24); tcg_gen_shri_i32(t1, arg, 24);
tcg_gen_or_i32(ret, t0, t1); tcg_gen_or_i32(ret, t0, t1);
tcg_temp_free(t0);
tcg_temp_free(t1);
#endif #endif
} }
...@@ -1121,6 +1207,8 @@ static inline void tcg_gen_bswap_i64(TCGv ret, TCGv arg) ...@@ -1121,6 +1207,8 @@ static inline void tcg_gen_bswap_i64(TCGv ret, TCGv arg)
tcg_gen_bswap_i32(t1, TCGV_HIGH(arg)); tcg_gen_bswap_i32(t1, TCGV_HIGH(arg));
tcg_gen_mov_i32(ret, t1); tcg_gen_mov_i32(ret, t1);
tcg_gen_mov_i32(TCGV_HIGH(ret), t0); tcg_gen_mov_i32(TCGV_HIGH(ret), t0);
tcg_temp_free(t0);
tcg_temp_free(t1);
} }
#else #else
...@@ -1227,6 +1315,8 @@ static inline void tcg_gen_bswap_i64(TCGv ret, TCGv arg) ...@@ -1227,6 +1315,8 @@ static inline void tcg_gen_bswap_i64(TCGv ret, TCGv arg)
tcg_gen_shri_i64(t1, arg, 56); tcg_gen_shri_i64(t1, arg, 56);
tcg_gen_or_i64(ret, t0, t1); tcg_gen_or_i64(ret, t0, t1);
tcg_temp_free(t0);
tcg_temp_free(t1);
#endif #endif
} }
...@@ -1237,7 +1327,9 @@ static inline void tcg_gen_neg_i32(TCGv ret, TCGv arg) ...@@ -1237,7 +1327,9 @@ static inline void tcg_gen_neg_i32(TCGv ret, TCGv arg)
#ifdef TCG_TARGET_HAS_neg_i32 #ifdef TCG_TARGET_HAS_neg_i32
tcg_gen_op2(INDEX_op_neg_i32, ret, arg); tcg_gen_op2(INDEX_op_neg_i32, ret, arg);
#else #else
tcg_gen_sub_i32(ret, tcg_const_i32(0), arg); TCGv t0 = tcg_const_i32(0);
tcg_gen_sub_i32(ret, t0, arg);
tcg_temp_free(t0);
#endif #endif
} }
...@@ -1246,18 +1338,20 @@ static inline void tcg_gen_neg_i64(TCGv ret, TCGv arg) ...@@ -1246,18 +1338,20 @@ static inline void tcg_gen_neg_i64(TCGv ret, TCGv arg)
#ifdef TCG_TARGET_HAS_neg_i64 #ifdef TCG_TARGET_HAS_neg_i64
tcg_gen_op2(INDEX_op_neg_i64, ret, arg); tcg_gen_op2(INDEX_op_neg_i64, ret, arg);
#else #else
tcg_gen_sub_i64(ret, tcg_const_i64(0), arg); TCGv t0 = tcg_const_i64(0);
tcg_gen_sub_i64(ret, t0, arg);
tcg_temp_free(t0);
#endif #endif
} }
static inline void tcg_gen_not_i32(TCGv ret, TCGv arg) static inline void tcg_gen_not_i32(TCGv ret, TCGv arg)
{ {
tcg_gen_xor_i32(ret, arg, tcg_const_i32(-1)); tcg_gen_xori_i32(ret, arg, -1);
} }
static inline void tcg_gen_not_i64(TCGv ret, TCGv arg) static inline void tcg_gen_not_i64(TCGv ret, TCGv arg)
{ {
tcg_gen_xor_i64(ret, arg, tcg_const_i64(-1)); tcg_gen_xori_i64(ret, arg, -1);
} }
static inline void tcg_gen_discard_i32(TCGv arg) static inline void tcg_gen_discard_i32(TCGv arg)
......
此差异已折叠。
...@@ -98,6 +98,7 @@ typedef int TCGType; ...@@ -98,6 +98,7 @@ typedef int TCGType;
#define TCG_TYPE_I32 0 #define TCG_TYPE_I32 0
#define TCG_TYPE_I64 1 #define TCG_TYPE_I64 1
#define TCG_TYPE_COUNT 2 /* number of different types */
#if TCG_TARGET_REG_BITS == 32 #if TCG_TARGET_REG_BITS == 32
#define TCG_TYPE_PTR TCG_TYPE_I32 #define TCG_TYPE_PTR TCG_TYPE_I32
...@@ -188,6 +189,9 @@ typedef struct TCGTemp { ...@@ -188,6 +189,9 @@ typedef struct TCGTemp {
unsigned int fixed_reg:1; unsigned int fixed_reg:1;
unsigned int mem_coherent:1; unsigned int mem_coherent:1;
unsigned int mem_allocated:1; unsigned int mem_allocated:1;
unsigned int temp_allocated:1; /* never used for code gen */
/* index of next free temp of same base type, -1 if end */
int next_free_temp;
const char *name; const char *name;
} TCGTemp; } TCGTemp;
...@@ -208,6 +212,8 @@ struct TCGContext { ...@@ -208,6 +212,8 @@ struct TCGContext {
TCGTemp *temps; /* globals first, temps after */ TCGTemp *temps; /* globals first, temps after */
int nb_globals; int nb_globals;
int nb_temps; int nb_temps;
int first_free_temp[TCG_TYPE_COUNT]; /* index of free temps, -1 if none */
/* constant indexes (end of temp array) */ /* constant indexes (end of temp array) */
int const_start; int const_start;
int const_end; int const_end;
...@@ -236,6 +242,7 @@ struct TCGContext { ...@@ -236,6 +242,7 @@ struct TCGContext {
TCGHelperInfo *helpers; TCGHelperInfo *helpers;
int nb_helpers; int nb_helpers;
int allocated_helpers; int allocated_helpers;
int helpers_sorted;
#ifdef CONFIG_PROFILER #ifdef CONFIG_PROFILER
/* profiling info */ /* profiling info */
...@@ -299,6 +306,7 @@ TCGv tcg_global_reg2_new_hack(TCGType type, int reg1, int reg2, ...@@ -299,6 +306,7 @@ TCGv tcg_global_reg2_new_hack(TCGType type, int reg1, int reg2,
TCGv tcg_global_mem_new(TCGType type, int reg, tcg_target_long offset, TCGv tcg_global_mem_new(TCGType type, int reg, tcg_target_long offset,
const char *name); const char *name);
TCGv tcg_temp_new(TCGType type); TCGv tcg_temp_new(TCGType type);
void tcg_temp_free(TCGv arg);
char *tcg_get_arg_str(TCGContext *s, char *buf, int buf_size, TCGv arg); char *tcg_get_arg_str(TCGContext *s, char *buf, int buf_size, TCGv arg);
void tcg_dump_info(FILE *f, void tcg_dump_info(FILE *f,
int (*cpu_fprintf)(FILE *f, const char *fmt, ...)); int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
...@@ -381,9 +389,6 @@ TCGv tcg_const_i64(int64_t val); ...@@ -381,9 +389,6 @@ TCGv tcg_const_i64(int64_t val);
void tcg_out_reloc(TCGContext *s, uint8_t *code_ptr, int type, void tcg_out_reloc(TCGContext *s, uint8_t *code_ptr, int type,
int label_index, long addend); int label_index, long addend);
void tcg_reg_alloc_start(TCGContext *s);
void tcg_reg_alloc_bb_end(TCGContext *s);
void tcg_liveness_analysis(TCGContext *s);
const TCGArg *tcg_gen_code_op(TCGContext *s, int opc, const TCGArg *args1, const TCGArg *tcg_gen_code_op(TCGContext *s, int opc, const TCGArg *args1,
unsigned int dead_iargs); unsigned int dead_iargs);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册