diff mbox

[v5,9/9] target-mips: Clean up position of abs2008/nan2008 cases in genfarith()

Message ID 1460995422-14373-10-git-send-email-aleksandar.markovic@rt-rk.com (mailing list archive)
State New, archived
Headers show

Commit Message

Aleksandar Markovic April 18, 2016, 4:03 p.m. UTC
From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>

This patch slightly reorders cases in genfarith() so that abs2008/nan2008-
dependant cases are grouped together, for easier maintenantce (code becomes
less prone to errors).

Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
---
 target-mips/translate.c | 152 ++++++++++++++++++++++++------------------------
 1 file changed, 76 insertions(+), 76 deletions(-)

Comments

Aleksandar Markovic April 19, 2016, 9:07 a.m. UTC | #1
Diff looks messy, but, in fact, this change is just changing location of
six cases in gen_farith().

This is illustrated in the diagram below: (I added indentation of 2 spaces for
abs2008-related cases, and 4 spaces for nan2008-related cases, to stress
the effect of grouping cases with similar handling; right order of cases is
of tremendous help during development; the diagram makes sense only
if it is displayed with fixed width fonts; you can copy/paste it in any editor
if that is not he case)

    case OPC_ADD_S                           case OPC_ADD_S        
    case OPC_SUB_S                           case OPC_SUB_S        
    case OPC_MUL_S                           case OPC_MUL_S        
    case OPC_DIV_S                           case OPC_DIV_S        
    case OPC_SQRT_S                          case OPC_SQRT_S       
      case OPC_ABS_S  -------------|         case OPC_MOV_S        
    case OPC_MOV_S                 |------>    case OPC_ABS_S      
      case OPC_NEG_S                           case OPC_NEG_S      
        case OPC_ROUND_L_S         |------>      case OPC_CVT_L_S  
        case OPC_TRUNC_L_S         |             case OPC_ROUND_L_S
        case OPC_CEIL_L_S          |             case OPC_TRUNC_L_S
        case OPC_FLOOR_L_S         |             case OPC_CEIL_L_S 
        case OPC_ROUND_W_S         |             case OPC_FLOOR_L_S
        case OPC_TRUNC_W_S         |  |--->      case OPC_CVT_W_S  
        case OPC_CEIL_W_S          |  |          case OPC_ROUND_W_S
        case OPC_FLOOR_W_S         |  |          case OPC_TRUNC_W_S
    case OPC_SEL_S                 |  |          case OPC_CEIL_W_S 
    case OPC_SELEQZ_S              |  |          case OPC_FLOOR_W_S
    case OPC_SELNEZ_S              |  |      case OPC_SEL_S        
    case OPC_MOVCF_S               |  |      case OPC_SELEQZ_S     
    case OPC_MOVZ_S                |  |      case OPC_SELNEZ_S     
    case OPC_MOVN_S                |  |      case OPC_MOVCF_S      
    case OPC_RECIP_S               |  |      case OPC_MOVZ_S       
    case OPC_RSQRT_S               |  |      case OPC_MOVN_S       
    case OPC_MADDF_S               |  |      case OPC_RECIP_S      
    case OPC_MSUBF_S               |  |      case OPC_RSQRT_S      
    case OPC_RINT_S                |  |      case OPC_MADDF_S      
    case OPC_CLASS_S               |  |      case OPC_MSUBF_S      
    case OPC_MIN_S                 |  |      case OPC_RINT_S       
    case OPC_MINA_S                |  |      case OPC_CLASS_S      
    case OPC_MAX_S                 |  |      case OPC_MIN_S        
    case OPC_MAXA_S                |  |      case OPC_MINA_S       
    case OPC_CVT_D_S               |  |      case OPC_MAX_S        
        case OPC_CVT_W_S  ------------|      case OPC_MAXA_S       
        case OPC_CVT_L_S  ---------|         case OPC_CVT_D_S      
    case OPC_CVT_PS_S                        case OPC_CVT_PS_S     
    case OPC_CMP_F_S                         case OPC_CMP_F_S      
    case OPC_CMP_UN_S                        case OPC_CMP_UN_S     
    case OPC_CMP_EQ_S                        case OPC_CMP_EQ_S     
    case OPC_CMP_UEQ_S                       case OPC_CMP_UEQ_S    
    case OPC_CMP_OLT_S                       case OPC_CMP_OLT_S    
    case OPC_CMP_ULT_S                       case OPC_CMP_ULT_S    
    case OPC_CMP_OLE_S                       case OPC_CMP_OLE_S    
    case OPC_CMP_ULE_S                       case OPC_CMP_ULE_S    
    case OPC_CMP_SF_S                        case OPC_CMP_SF_S     
    case OPC_CMP_NGLE_S                      case OPC_CMP_NGLE_S   
    case OPC_CMP_SEQ_S                       case OPC_CMP_SEQ_S    
    case OPC_CMP_NGL_S                       case OPC_CMP_NGL_S    
    case OPC_CMP_LT_S                        case OPC_CMP_LT_S     
    case OPC_CMP_NGE_S                       case OPC_CMP_NGE_S    
    case OPC_CMP_LE_S                        case OPC_CMP_LE_S     
    case OPC_CMP_NGT_S                       case OPC_CMP_NGT_S    
    case OPC_ADD_D                           case OPC_ADD_D        
    case OPC_SUB_D                           case OPC_SUB_D        
    case OPC_MUL_D                           case OPC_MUL_D        
    case OPC_DIV_D                           case OPC_DIV_D        
    case OPC_SQRT_D                          case OPC_SQRT_D       
      case OPC_ABS_D  -------------|         case OPC_MOV_D        
    case OPC_MOV_D                 |------>    case OPC_ABS_D      
      case OPC_NEG_D                           case OPC_NEG_D      
        case OPC_ROUND_L_D         |------>      case OPC_CVT_L_D  
        case OPC_TRUNC_L_D         |             case OPC_ROUND_L_D
        case OPC_CEIL_L_D          |             case OPC_TRUNC_L_D
        case OPC_FLOOR_L_D         |             case OPC_CEIL_L_D 
        case OPC_ROUND_W_D         |             case OPC_FLOOR_L_D
        case OPC_TRUNC_W_D         |  |--->      case OPC_CVT_W_D  
        case OPC_CEIL_W_D          |  |          case OPC_ROUND_W_D
        case OPC_FLOOR_W_D         |  |          case OPC_TRUNC_W_D
    case OPC_SEL_D                 |  |          case OPC_CEIL_W_D 
    case OPC_SELEQZ_D              |  |          case OPC_FLOOR_W_D
    case OPC_SELNEZ_D              |  |      case OPC_SEL_D        
    case OPC_MOVCF_D               |  |      case OPC_SELEQZ_D     
    case OPC_MOVZ_D                |  |      case OPC_SELNEZ_D     
    case OPC_MOVN_D                |  |      case OPC_MOVCF_D      
    case OPC_RECIP_D               |  |      case OPC_MOVZ_D       
    case OPC_RSQRT_D               |  |      case OPC_MOVN_D       
    case OPC_MADDF_D               |  |      case OPC_RECIP_D      
    case OPC_MSUBF_D               |  |      case OPC_RSQRT_D      
    case OPC_RINT_D                |  |      case OPC_MADDF_D      
    case OPC_CLASS_D               |  |      case OPC_MSUBF_D      
    case OPC_MIN_D                 |  |      case OPC_RINT_D       
    case OPC_MINA_D                |  |      case OPC_CLASS_D      
    case OPC_MAX_D                 |  |      case OPC_MIN_D        
    case OPC_MAXA_D                |  |      case OPC_MINA_D       
    case OPC_CMP_F_D               |  |      case OPC_MAX_D        
    case OPC_CMP_UN_D              |  |      case OPC_MAXA_D       
    case OPC_CMP_EQ_D              |  |      case OPC_CMP_F_D      
    case OPC_CMP_UEQ_D             |  |      case OPC_CMP_UN_D     
    case OPC_CMP_OLT_D             |  |      case OPC_CMP_EQ_D     
    case OPC_CMP_ULT_D             |  |      case OPC_CMP_UEQ_D    
    case OPC_CMP_OLE_D             |  |      case OPC_CMP_OLT_D    
    case OPC_CMP_ULE_D             |  |      case OPC_CMP_ULT_D    
    case OPC_CMP_SF_D              |  |      case OPC_CMP_OLE_D    
    case OPC_CMP_NGLE_D            |  |      case OPC_CMP_ULE_D    
    case OPC_CMP_SEQ_D             |  |      case OPC_CMP_SF_D     
    case OPC_CMP_NGL_D             |  |      case OPC_CMP_NGLE_D   
    case OPC_CMP_LT_D              |  |      case OPC_CMP_SEQ_D    
    case OPC_CMP_NGE_D             |  |      case OPC_CMP_NGL_D    
    case OPC_CMP_LE_D              |  |      case OPC_CMP_LT_D     
    case OPC_CMP_NGT_D             |  |      case OPC_CMP_NGE_D    
    case OPC_CVT_S_D               |  |      case OPC_CMP_LE_D     
        case OPC_CVT_W_D  ------------|      case OPC_CMP_NGT_D    
        case OPC_CVT_L_D  ---------|         case OPC_CVT_S_D      
    case OPC_CVT_S_W                         case OPC_CVT_S_W      
    case OPC_CVT_D_W                         case OPC_CVT_D_W      
    case OPC_CVT_S_L                         case OPC_CVT_S_L      
    case OPC_CVT_D_L                         case OPC_CVT_D_L      
    case OPC_CVT_PS_PW                       case OPC_CVT_PS_PW    
    case OPC_ADD_PS                          case OPC_ADD_PS       
    case OPC_SUB_PS                          case OPC_SUB_PS       
    case OPC_MUL_PS                          case OPC_MUL_PS       
    case OPC_ABS_PS                          case OPC_ABS_PS       
    case OPC_MOV_PS                          case OPC_MOV_PS       
    case OPC_NEG_PS                          case OPC_NEG_PS       
    case OPC_MOVCF_PS                        case OPC_MOVCF_PS     
    case OPC_MOVZ_PS                         case OPC_MOVZ_PS      
    case OPC_MOVN_PS                         case OPC_MOVN_PS      
    case OPC_ADDR_PS                         case OPC_ADDR_PS      
    case OPC_MULR_PS                         case OPC_MULR_PS      
    case OPC_RECIP2_PS                       case OPC_RECIP2_PS    
    case OPC_RECIP1_PS                       case OPC_RECIP1_PS    
    case OPC_RSQRT1_PS                       case OPC_RSQRT1_PS    
    case OPC_RSQRT2_PS                       case OPC_RSQRT2_PS    
    case OPC_CVT_S_PU                        case OPC_CVT_S_PU     
    case OPC_CVT_PW_PS                       case OPC_CVT_PW_PS    
    case OPC_CVT_S_PL                        case OPC_CVT_S_PL     
    case OPC_PLL_PS                          case OPC_PLL_PS       
    case OPC_PLU_PS                          case OPC_PLU_PS       
    case OPC_PUL_PS                          case OPC_PUL_PS       
    case OPC_PUU_PS                          case OPC_PUU_PS       
    case OPC_CMP_F_PS                        case OPC_CMP_F_PS     
    case OPC_CMP_UN_PS                       case OPC_CMP_UN_PS    
    case OPC_CMP_EQ_PS                       case OPC_CMP_EQ_PS    
    case OPC_CMP_UEQ_PS                      case OPC_CMP_UEQ_PS   
    case OPC_CMP_OLT_PS                      case OPC_CMP_OLT_PS   
    case OPC_CMP_ULT_PS                      case OPC_CMP_ULT_PS   
    case OPC_CMP_OLE_PS                      case OPC_CMP_OLE_PS   
    case OPC_CMP_ULE_PS                      case OPC_CMP_ULE_PS   
    case OPC_CMP_SF_PS                       case OPC_CMP_SF_PS    
    case OPC_CMP_NGLE_PS                     case OPC_CMP_NGLE_PS  
    case OPC_CMP_SEQ_PS                      case OPC_CMP_SEQ_PS   
    case OPC_CMP_NGL_PS                      case OPC_CMP_NGL_PS   
    case OPC_CMP_LT_PS                       case OPC_CMP_LT_PS    
    case OPC_CMP_NGE_PS                      case OPC_CMP_NGE_PS   
    case OPC_CMP_LE_PS                       case OPC_CMP_LE_PS    
    case OPC_CMP_NGT_PS                      case OPC_CMP_NGT_PS
diff mbox

Patch

diff --git a/target-mips/translate.c b/target-mips/translate.c
index b7ab98a..76df972 100644
--- a/target-mips/translate.c
+++ b/target-mips/translate.c
@@ -8876,25 +8876,25 @@  static void gen_farith (DisasContext *ctx, enum fopcode op1,
             tcg_temp_free_i32(fp0);
         }
         break;
-    case OPC_ABS_S:
+    case OPC_MOV_S:
         {
             TCGv_i32 fp0 = tcg_temp_new_i32();
 
             gen_load_fpr32(ctx, fp0, fs);
-            if (ctx->abs2008) {
-                tcg_gen_andi_i32(fp0, fp0, 0x7fffffffUL);
-            } else {
-                gen_helper_float_abs_s(fp0, fp0);
-            }
             gen_store_fpr32(ctx, fp0, fd);
             tcg_temp_free_i32(fp0);
         }
         break;
-    case OPC_MOV_S:
+    case OPC_ABS_S:
         {
             TCGv_i32 fp0 = tcg_temp_new_i32();
 
             gen_load_fpr32(ctx, fp0, fs);
+            if (ctx->abs2008) {
+                tcg_gen_andi_i32(fp0, fp0, 0x7fffffffUL);
+            } else {
+                gen_helper_float_abs_s(fp0, fp0);
+            }
             gen_store_fpr32(ctx, fp0, fd);
             tcg_temp_free_i32(fp0);
         }
@@ -8913,6 +8913,23 @@  static void gen_farith (DisasContext *ctx, enum fopcode op1,
             tcg_temp_free_i32(fp0);
         }
         break;
+    case OPC_CVT_L_S:
+        check_cp1_64bitmode(ctx);
+        {
+            TCGv_i32 fp32 = tcg_temp_new_i32();
+            TCGv_i64 fp64 = tcg_temp_new_i64();
+
+            gen_load_fpr32(ctx, fp32, fs);
+            if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->nan2008)) {
+                gen_helper_float_cvt_2008_l_s(fp64, cpu_env, fp32);
+            } else {
+                gen_helper_float_cvt_l_s(fp64, cpu_env, fp32);
+            }
+            tcg_temp_free_i32(fp32);
+            gen_store_fpr64(ctx, fp64, fd);
+            tcg_temp_free_i64(fp64);
+        }
+        break;
     case OPC_ROUND_L_S:
         check_cp1_64bitmode(ctx);
         {
@@ -8981,6 +8998,20 @@  static void gen_farith (DisasContext *ctx, enum fopcode op1,
             tcg_temp_free_i64(fp64);
         }
         break;
+    case OPC_CVT_W_S:
+        {
+            TCGv_i32 fp0 = tcg_temp_new_i32();
+
+            gen_load_fpr32(ctx, fp0, fs);
+            if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->nan2008)) {
+                gen_helper_float_cvt_2008_w_s(fp0, cpu_env, fp0);
+            } else {
+                gen_helper_float_cvt_w_s(fp0, cpu_env, fp0);
+            }
+            gen_store_fpr32(ctx, fp0, fd);
+            tcg_temp_free_i32(fp0);
+        }
+        break;
     case OPC_ROUND_W_S:
         {
             TCGv_i32 fp0 = tcg_temp_new_i32();
@@ -9276,37 +9307,6 @@  static void gen_farith (DisasContext *ctx, enum fopcode op1,
             tcg_temp_free_i64(fp64);
         }
         break;
-    case OPC_CVT_W_S:
-        {
-            TCGv_i32 fp0 = tcg_temp_new_i32();
-
-            gen_load_fpr32(ctx, fp0, fs);
-            if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->nan2008)) {
-                gen_helper_float_cvt_2008_w_s(fp0, cpu_env, fp0);
-            } else {
-                gen_helper_float_cvt_w_s(fp0, cpu_env, fp0);
-            }
-            gen_store_fpr32(ctx, fp0, fd);
-            tcg_temp_free_i32(fp0);
-        }
-        break;
-    case OPC_CVT_L_S:
-        check_cp1_64bitmode(ctx);
-        {
-            TCGv_i32 fp32 = tcg_temp_new_i32();
-            TCGv_i64 fp64 = tcg_temp_new_i64();
-
-            gen_load_fpr32(ctx, fp32, fs);
-            if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->nan2008)) {
-                gen_helper_float_cvt_2008_l_s(fp64, cpu_env, fp32);
-            } else {
-                gen_helper_float_cvt_l_s(fp64, cpu_env, fp32);
-            }
-            tcg_temp_free_i32(fp32);
-            gen_store_fpr64(ctx, fp64, fd);
-            tcg_temp_free_i64(fp64);
-        }
-        break;
     case OPC_CVT_PS_S:
         check_ps(ctx);
         {
@@ -9413,6 +9413,16 @@  static void gen_farith (DisasContext *ctx, enum fopcode op1,
             tcg_temp_free_i64(fp0);
         }
         break;
+    case OPC_MOV_D:
+        check_cp1_registers(ctx, fs | fd);
+        {
+            TCGv_i64 fp0 = tcg_temp_new_i64();
+
+            gen_load_fpr64(ctx, fp0, fs);
+            gen_store_fpr64(ctx, fp0, fd);
+            tcg_temp_free_i64(fp0);
+        }
+        break;
     case OPC_ABS_D:
         check_cp1_registers(ctx, fs | fd);
         {
@@ -9428,26 +9438,31 @@  static void gen_farith (DisasContext *ctx, enum fopcode op1,
             tcg_temp_free_i64(fp0);
         }
         break;
-    case OPC_MOV_D:
+    case OPC_NEG_D:
         check_cp1_registers(ctx, fs | fd);
         {
             TCGv_i64 fp0 = tcg_temp_new_i64();
 
             gen_load_fpr64(ctx, fp0, fs);
+            if (ctx->abs2008) {
+                tcg_gen_xori_i64(fp0, fp0, 1ULL << 63);
+            } else {
+                gen_helper_float_chs_d(fp0, fp0);
+            }
             gen_store_fpr64(ctx, fp0, fd);
             tcg_temp_free_i64(fp0);
         }
         break;
-    case OPC_NEG_D:
-        check_cp1_registers(ctx, fs | fd);
+    case OPC_CVT_L_D:
+        check_cp1_64bitmode(ctx);
         {
             TCGv_i64 fp0 = tcg_temp_new_i64();
 
             gen_load_fpr64(ctx, fp0, fs);
-            if (ctx->abs2008) {
-                tcg_gen_xori_i64(fp0, fp0, 1ULL << 63);
+            if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->nan2008)) {
+                gen_helper_float_cvt_2008_l_d(fp0, cpu_env, fp0);
             } else {
-                gen_helper_float_chs_d(fp0, fp0);
+                gen_helper_float_cvt_l_d(fp0, cpu_env, fp0);
             }
             gen_store_fpr64(ctx, fp0, fd);
             tcg_temp_free_i64(fp0);
@@ -9513,6 +9528,23 @@  static void gen_farith (DisasContext *ctx, enum fopcode op1,
             tcg_temp_free_i64(fp0);
         }
         break;
+    case OPC_CVT_W_D:
+        check_cp1_registers(ctx, fs);
+        {
+            TCGv_i32 fp32 = tcg_temp_new_i32();
+            TCGv_i64 fp64 = tcg_temp_new_i64();
+
+            gen_load_fpr64(ctx, fp64, fs);
+            if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->nan2008)) {
+                gen_helper_float_cvt_2008_w_d(fp32, cpu_env, fp64);
+            } else {
+                gen_helper_float_cvt_w_d(fp32, cpu_env, fp64);
+            }
+            tcg_temp_free_i64(fp64);
+            gen_store_fpr32(ctx, fp32, fd);
+            tcg_temp_free_i32(fp32);
+        }
+        break;
     case OPC_ROUND_W_D:
         check_cp1_registers(ctx, fs);
         {
@@ -9841,38 +9873,6 @@  static void gen_farith (DisasContext *ctx, enum fopcode op1,
             tcg_temp_free_i32(fp32);
         }
         break;
-    case OPC_CVT_W_D:
-        check_cp1_registers(ctx, fs);
-        {
-            TCGv_i32 fp32 = tcg_temp_new_i32();
-            TCGv_i64 fp64 = tcg_temp_new_i64();
-
-            gen_load_fpr64(ctx, fp64, fs);
-            if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->nan2008)) {
-                gen_helper_float_cvt_2008_w_d(fp32, cpu_env, fp64);
-            } else {
-                gen_helper_float_cvt_w_d(fp32, cpu_env, fp64);
-            }
-            tcg_temp_free_i64(fp64);
-            gen_store_fpr32(ctx, fp32, fd);
-            tcg_temp_free_i32(fp32);
-        }
-        break;
-    case OPC_CVT_L_D:
-        check_cp1_64bitmode(ctx);
-        {
-            TCGv_i64 fp0 = tcg_temp_new_i64();
-
-            gen_load_fpr64(ctx, fp0, fs);
-            if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->nan2008)) {
-                gen_helper_float_cvt_2008_l_d(fp0, cpu_env, fp0);
-            } else {
-                gen_helper_float_cvt_l_d(fp0, cpu_env, fp0);
-            }
-            gen_store_fpr64(ctx, fp0, fd);
-            tcg_temp_free_i64(fp0);
-        }
-        break;
     case OPC_CVT_S_W:
         {
             TCGv_i32 fp0 = tcg_temp_new_i32();