Commit c9297f4d1d488bedba02242cc2c532582258c74e
1 parent
c905fdac
target-mips: optimize gen_farith()
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7046 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
47 additions
and
56 deletions
target-mips/translate.c
@@ -6122,32 +6122,32 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | @@ -6122,32 +6122,32 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | ||
6122 | case FOP(18, 16): | 6122 | case FOP(18, 16): |
6123 | { | 6123 | { |
6124 | int l1 = gen_new_label(); | 6124 | int l1 = gen_new_label(); |
6125 | - TCGv t0 = tcg_temp_new(); | ||
6126 | - TCGv_i32 fp0 = tcg_temp_local_new_i32(); | 6125 | + TCGv_i32 fp0; |
6127 | 6126 | ||
6128 | - gen_load_gpr(t0, ft); | ||
6129 | - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1); | 6127 | + if (ft != 0) { |
6128 | + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1); | ||
6129 | + } | ||
6130 | + fp0 = tcg_temp_new_i32(); | ||
6130 | gen_load_fpr32(fp0, fs); | 6131 | gen_load_fpr32(fp0, fs); |
6131 | gen_store_fpr32(fp0, fd); | 6132 | gen_store_fpr32(fp0, fd); |
6132 | tcg_temp_free_i32(fp0); | 6133 | tcg_temp_free_i32(fp0); |
6133 | gen_set_label(l1); | 6134 | gen_set_label(l1); |
6134 | - tcg_temp_free(t0); | ||
6135 | } | 6135 | } |
6136 | opn = "movz.s"; | 6136 | opn = "movz.s"; |
6137 | break; | 6137 | break; |
6138 | case FOP(19, 16): | 6138 | case FOP(19, 16): |
6139 | { | 6139 | { |
6140 | int l1 = gen_new_label(); | 6140 | int l1 = gen_new_label(); |
6141 | - TCGv t0 = tcg_temp_new(); | ||
6142 | - TCGv_i32 fp0 = tcg_temp_local_new_i32(); | ||
6143 | - | ||
6144 | - gen_load_gpr(t0, ft); | ||
6145 | - tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1); | ||
6146 | - gen_load_fpr32(fp0, fs); | ||
6147 | - gen_store_fpr32(fp0, fd); | ||
6148 | - tcg_temp_free_i32(fp0); | ||
6149 | - gen_set_label(l1); | ||
6150 | - tcg_temp_free(t0); | 6141 | + TCGv_i32 fp0; |
6142 | + | ||
6143 | + if (ft != 0) { | ||
6144 | + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1); | ||
6145 | + fp0 = tcg_temp_new_i32(); | ||
6146 | + gen_load_fpr32(fp0, fs); | ||
6147 | + gen_store_fpr32(fp0, fd); | ||
6148 | + tcg_temp_free_i32(fp0); | ||
6149 | + gen_set_label(l1); | ||
6150 | + } | ||
6151 | } | 6151 | } |
6152 | opn = "movn.s"; | 6152 | opn = "movn.s"; |
6153 | break; | 6153 | break; |
@@ -6541,32 +6541,32 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | @@ -6541,32 +6541,32 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | ||
6541 | case FOP(18, 17): | 6541 | case FOP(18, 17): |
6542 | { | 6542 | { |
6543 | int l1 = gen_new_label(); | 6543 | int l1 = gen_new_label(); |
6544 | - TCGv t0 = tcg_temp_new(); | ||
6545 | - TCGv_i64 fp0 = tcg_temp_local_new_i64(); | 6544 | + TCGv_i64 fp0; |
6546 | 6545 | ||
6547 | - gen_load_gpr(t0, ft); | ||
6548 | - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1); | 6546 | + if (ft != 0) { |
6547 | + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1); | ||
6548 | + } | ||
6549 | + fp0 = tcg_temp_new_i64(); | ||
6549 | gen_load_fpr64(ctx, fp0, fs); | 6550 | gen_load_fpr64(ctx, fp0, fs); |
6550 | gen_store_fpr64(ctx, fp0, fd); | 6551 | gen_store_fpr64(ctx, fp0, fd); |
6551 | tcg_temp_free_i64(fp0); | 6552 | tcg_temp_free_i64(fp0); |
6552 | gen_set_label(l1); | 6553 | gen_set_label(l1); |
6553 | - tcg_temp_free(t0); | ||
6554 | } | 6554 | } |
6555 | opn = "movz.d"; | 6555 | opn = "movz.d"; |
6556 | break; | 6556 | break; |
6557 | case FOP(19, 17): | 6557 | case FOP(19, 17): |
6558 | { | 6558 | { |
6559 | int l1 = gen_new_label(); | 6559 | int l1 = gen_new_label(); |
6560 | - TCGv t0 = tcg_temp_new(); | ||
6561 | - TCGv_i64 fp0 = tcg_temp_local_new_i64(); | ||
6562 | - | ||
6563 | - gen_load_gpr(t0, ft); | ||
6564 | - tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1); | ||
6565 | - gen_load_fpr64(ctx, fp0, fs); | ||
6566 | - gen_store_fpr64(ctx, fp0, fd); | ||
6567 | - tcg_temp_free_i64(fp0); | ||
6568 | - gen_set_label(l1); | ||
6569 | - tcg_temp_free(t0); | 6560 | + TCGv_i64 fp0; |
6561 | + | ||
6562 | + if (ft != 0) { | ||
6563 | + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1); | ||
6564 | + fp0 = tcg_temp_new_i64(); | ||
6565 | + gen_load_fpr64(ctx, fp0, fs); | ||
6566 | + gen_store_fpr64(ctx, fp0, fd); | ||
6567 | + tcg_temp_free_i64(fp0); | ||
6568 | + gen_set_label(l1); | ||
6569 | + } | ||
6570 | } | 6570 | } |
6571 | opn = "movn.d"; | 6571 | opn = "movn.d"; |
6572 | break; | 6572 | break; |
@@ -6876,20 +6876,15 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | @@ -6876,20 +6876,15 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | ||
6876 | check_cp1_64bitmode(ctx); | 6876 | check_cp1_64bitmode(ctx); |
6877 | { | 6877 | { |
6878 | int l1 = gen_new_label(); | 6878 | int l1 = gen_new_label(); |
6879 | - TCGv t0 = tcg_temp_new(); | ||
6880 | - TCGv_i32 fp0 = tcg_temp_local_new_i32(); | ||
6881 | - TCGv_i32 fph0 = tcg_temp_local_new_i32(); | 6879 | + TCGv_i32 fp0; |
6882 | 6880 | ||
6883 | - gen_load_gpr(t0, ft); | ||
6884 | - tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1); | ||
6885 | - gen_load_fpr32(fp0, fs); | ||
6886 | - gen_load_fpr32h(fph0, fs); | ||
6887 | - gen_store_fpr32(fp0, fd); | ||
6888 | - gen_store_fpr32h(fph0, fd); | ||
6889 | - tcg_temp_free_i32(fp0); | ||
6890 | - tcg_temp_free_i32(fph0); | 6881 | + if (ft != 0) |
6882 | + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1); | ||
6883 | + fp0 = tcg_temp_new_i64(); | ||
6884 | + gen_load_fpr64(ctx, fp0, fs); | ||
6885 | + gen_store_fpr64(ctx, fp0, fd); | ||
6886 | + tcg_temp_free_i64(fp0); | ||
6891 | gen_set_label(l1); | 6887 | gen_set_label(l1); |
6892 | - tcg_temp_free(t0); | ||
6893 | } | 6888 | } |
6894 | opn = "movz.ps"; | 6889 | opn = "movz.ps"; |
6895 | break; | 6890 | break; |
@@ -6897,20 +6892,16 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | @@ -6897,20 +6892,16 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | ||
6897 | check_cp1_64bitmode(ctx); | 6892 | check_cp1_64bitmode(ctx); |
6898 | { | 6893 | { |
6899 | int l1 = gen_new_label(); | 6894 | int l1 = gen_new_label(); |
6900 | - TCGv t0 = tcg_temp_new(); | ||
6901 | - TCGv_i32 fp0 = tcg_temp_local_new_i32(); | ||
6902 | - TCGv_i32 fph0 = tcg_temp_local_new_i32(); | ||
6903 | - | ||
6904 | - gen_load_gpr(t0, ft); | ||
6905 | - tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1); | ||
6906 | - gen_load_fpr32(fp0, fs); | ||
6907 | - gen_load_fpr32h(fph0, fs); | ||
6908 | - gen_store_fpr32(fp0, fd); | ||
6909 | - gen_store_fpr32h(fph0, fd); | ||
6910 | - tcg_temp_free_i32(fp0); | ||
6911 | - tcg_temp_free_i32(fph0); | ||
6912 | - gen_set_label(l1); | ||
6913 | - tcg_temp_free(t0); | 6895 | + TCGv_i32 fp0; |
6896 | + | ||
6897 | + if (ft != 0) { | ||
6898 | + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1); | ||
6899 | + fp0 = tcg_temp_new_i64(); | ||
6900 | + gen_load_fpr64(ctx, fp0, fs); | ||
6901 | + gen_store_fpr64(ctx, fp0, fd); | ||
6902 | + tcg_temp_free_i64(fp0); | ||
6903 | + gen_set_label(l1); | ||
6904 | + } | ||
6914 | } | 6905 | } |
6915 | opn = "movn.ps"; | 6906 | opn = "movn.ps"; |
6916 | break; | 6907 | break; |