Patchwork [17/22] tcg-i386: Tidy unary arithmetic.

login
register
mail settings
Submitter Richard Henderson
Date April 14, 2010, 6:22 p.m.
Message ID <a13a9ff3fcc6fbda1371e47992de65da8b9ea4e7.1272479073.git.rth@twiddle.net>
Download mbox | patch
Permalink /patch/51199/
State New
Headers show

Comments

Richard Henderson - April 14, 2010, 6:22 p.m.
Define OPC_GRP3 and EXT3_FOO to match.  Use them instead of
bare constants.

Define OPC_GRP5 and rename the existing EXT_BAR to EXT5_BAR to
make it clear which extension should be used with which opcode.

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 tcg/i386/tcg-target.c |   38 +++++++++++++++++++++++++-------------
 1 files changed, 25 insertions(+), 13 deletions(-)
Aurelien Jarno - May 21, 2010, 9:41 a.m.
On Wed, Apr 14, 2010 at 11:22:39AM -0700, Richard Henderson wrote:
> Define OPC_GRP3 and EXT3_FOO to match.  Use them instead of
> bare constants.
> 
> Define OPC_GRP5 and rename the existing EXT_BAR to EXT5_BAR to
> make it clear which extension should be used with which opcode.
> 
> Signed-off-by: Richard Henderson <rth@twiddle.net>

Acked-by: Aurelien Jarno <aurelien@aurel32.net>

> ---
>  tcg/i386/tcg-target.c |   38 +++++++++++++++++++++++++-------------
>  1 files changed, 25 insertions(+), 13 deletions(-)
> 
> diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c
> index 0c1a53a..c3f3e4d 100644
> --- a/tcg/i386/tcg-target.c
> +++ b/tcg/i386/tcg-target.c
> @@ -195,7 +195,11 @@ static inline int tcg_target_const_match(tcg_target_long val,
>  #define OPC_SHIFT_cl	(0xd3)
>  #define OPC_TESTL	(0x85)
>  
> -/* Group 1 opcode extensions for 0x80-0x83.  */
> +#define OPC_GRP3_Ev	(0xf7)
> +#define OPC_GRP5	(0xff)
> +
> +/* Group 1 opcode extensions for 0x80-0x83.
> +   These are also used as modifiers for OPC_ARITH.  */
>  #define ARITH_ADD 0
>  #define ARITH_OR  1
>  #define ARITH_ADC 2
> @@ -212,9 +216,17 @@ static inline int tcg_target_const_match(tcg_target_long val,
>  #define SHIFT_SHR 5
>  #define SHIFT_SAR 7
>  
> -/* Group 5 opcode extensions for 0xff.  */
> -#define EXT_CALLN_Ev	2
> -#define EXT_JMPN_Ev	4
> +/* Group 3 opcode extensions for 0xf6, 0xf7.  To be used with OPC_GRP3.  */
> +#define EXT3_NOT   2
> +#define EXT3_NEG   3
> +#define EXT3_MUL   4
> +#define EXT3_IMUL  5
> +#define EXT3_DIV   6
> +#define EXT3_IDIV  7
> +
> +/* Group 5 opcode extensions for 0xff.  To be used with OPC_GRP5.  */
> +#define EXT5_CALLN_Ev	2
> +#define EXT5_JMPN_Ev	4
>  
>  /* Condition codes to be added to OPC_JCC_{long,short}.  */
>  #define JCC_JMP (-1)
> @@ -1081,7 +1093,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>              tcg_out32(s, 0);
>          } else {
>              /* indirect jump method */
> -            tcg_out_modrm_offset(s, 0xff, EXT_JMPN_Ev, -1, 
> +            tcg_out_modrm_offset(s, OPC_GRP5, EXT5_JMPN_Ev, -1, 
>                                   (tcg_target_long)(s->tb_next + args[0]));
>          }
>          s->tb_next_offset[args[0]] = s->code_ptr - s->code_buf;
> @@ -1091,7 +1103,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>              tcg_out_calli(s, args[0]);
>          } else {
>              /* call *reg */
> -            tcg_out_modrm(s, 0xff, EXT_CALLN_Ev, args[0]);
> +            tcg_out_modrm(s, OPC_GRP5, EXT5_CALLN_Ev, args[0]);
>          }
>          break;
>      case INDEX_op_jmp:
> @@ -1100,7 +1112,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>              tcg_out32(s, args[0] - (tcg_target_long)s->code_ptr - 4);
>          } else {
>              /* jmp *reg */
> -            tcg_out_modrm(s, 0xff, EXT_JMPN_Ev, args[0]);
> +            tcg_out_modrm(s, OPC_GRP5, EXT5_JMPN_Ev, args[0]);
>          }
>          break;
>      case INDEX_op_br:
> @@ -1177,13 +1189,13 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>          }
>          break;
>      case INDEX_op_mulu2_i32:
> -        tcg_out_modrm(s, 0xf7, 4, args[3]);
> +        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_MUL, args[3]);
>          break;
>      case INDEX_op_div2_i32:
> -        tcg_out_modrm(s, 0xf7, 7, args[4]);
> +        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_IDIV, args[4]);
>          break;
>      case INDEX_op_divu2_i32:
> -        tcg_out_modrm(s, 0xf7, 6, args[4]);
> +        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_DIV, args[4]);
>          break;
>      case INDEX_op_shl_i32:
>          c = SHIFT_SHL;
> @@ -1247,11 +1259,11 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>          break;
>  
>      case INDEX_op_neg_i32:
> -        tcg_out_modrm(s, 0xf7, 3, args[0]);
> +        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_NEG, args[0]);
>          break;
>  
>      case INDEX_op_not_i32:
> -        tcg_out_modrm(s, 0xf7, 2, args[0]);
> +        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_NOT, args[0]);
>          break;
>  
>      case INDEX_op_ext8s_i32:
> @@ -1419,7 +1431,7 @@ void tcg_target_qemu_prologue(TCGContext *s)
>      stack_addend = frame_size - push_size;
>      tcg_out_addi(s, TCG_REG_ESP, -stack_addend);
>  
> -    tcg_out_modrm(s, 0xff, EXT_JMPN_Ev, TCG_REG_EAX); /* jmp *%eax */
> +    tcg_out_modrm(s, OPC_GRP5, EXT5_JMPN_Ev, TCG_REG_EAX); /* jmp *%eax */
>      
>      /* TB epilogue */
>      tb_ret_addr = s->code_ptr;
> -- 
> 1.6.6.1
> 
> 
> 
>

Patch

diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c
index 0c1a53a..c3f3e4d 100644
--- a/tcg/i386/tcg-target.c
+++ b/tcg/i386/tcg-target.c
@@ -195,7 +195,11 @@  static inline int tcg_target_const_match(tcg_target_long val,
 #define OPC_SHIFT_cl	(0xd3)
 #define OPC_TESTL	(0x85)
 
-/* Group 1 opcode extensions for 0x80-0x83.  */
+#define OPC_GRP3_Ev	(0xf7)
+#define OPC_GRP5	(0xff)
+
+/* Group 1 opcode extensions for 0x80-0x83.
+   These are also used as modifiers for OPC_ARITH.  */
 #define ARITH_ADD 0
 #define ARITH_OR  1
 #define ARITH_ADC 2
@@ -212,9 +216,17 @@  static inline int tcg_target_const_match(tcg_target_long val,
 #define SHIFT_SHR 5
 #define SHIFT_SAR 7
 
-/* Group 5 opcode extensions for 0xff.  */
-#define EXT_CALLN_Ev	2
-#define EXT_JMPN_Ev	4
+/* Group 3 opcode extensions for 0xf6, 0xf7.  To be used with OPC_GRP3.  */
+#define EXT3_NOT   2
+#define EXT3_NEG   3
+#define EXT3_MUL   4
+#define EXT3_IMUL  5
+#define EXT3_DIV   6
+#define EXT3_IDIV  7
+
+/* Group 5 opcode extensions for 0xff.  To be used with OPC_GRP5.  */
+#define EXT5_CALLN_Ev	2
+#define EXT5_JMPN_Ev	4
 
 /* Condition codes to be added to OPC_JCC_{long,short}.  */
 #define JCC_JMP (-1)
@@ -1081,7 +1093,7 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
             tcg_out32(s, 0);
         } else {
             /* indirect jump method */
-            tcg_out_modrm_offset(s, 0xff, EXT_JMPN_Ev, -1, 
+            tcg_out_modrm_offset(s, OPC_GRP5, EXT5_JMPN_Ev, -1, 
                                  (tcg_target_long)(s->tb_next + args[0]));
         }
         s->tb_next_offset[args[0]] = s->code_ptr - s->code_buf;
@@ -1091,7 +1103,7 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
             tcg_out_calli(s, args[0]);
         } else {
             /* call *reg */
-            tcg_out_modrm(s, 0xff, EXT_CALLN_Ev, args[0]);
+            tcg_out_modrm(s, OPC_GRP5, EXT5_CALLN_Ev, args[0]);
         }
         break;
     case INDEX_op_jmp:
@@ -1100,7 +1112,7 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
             tcg_out32(s, args[0] - (tcg_target_long)s->code_ptr - 4);
         } else {
             /* jmp *reg */
-            tcg_out_modrm(s, 0xff, EXT_JMPN_Ev, args[0]);
+            tcg_out_modrm(s, OPC_GRP5, EXT5_JMPN_Ev, args[0]);
         }
         break;
     case INDEX_op_br:
@@ -1177,13 +1189,13 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
         }
         break;
     case INDEX_op_mulu2_i32:
-        tcg_out_modrm(s, 0xf7, 4, args[3]);
+        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_MUL, args[3]);
         break;
     case INDEX_op_div2_i32:
-        tcg_out_modrm(s, 0xf7, 7, args[4]);
+        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_IDIV, args[4]);
         break;
     case INDEX_op_divu2_i32:
-        tcg_out_modrm(s, 0xf7, 6, args[4]);
+        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_DIV, args[4]);
         break;
     case INDEX_op_shl_i32:
         c = SHIFT_SHL;
@@ -1247,11 +1259,11 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
         break;
 
     case INDEX_op_neg_i32:
-        tcg_out_modrm(s, 0xf7, 3, args[0]);
+        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_NEG, args[0]);
         break;
 
     case INDEX_op_not_i32:
-        tcg_out_modrm(s, 0xf7, 2, args[0]);
+        tcg_out_modrm(s, OPC_GRP3_Ev, EXT3_NOT, args[0]);
         break;
 
     case INDEX_op_ext8s_i32:
@@ -1419,7 +1431,7 @@  void tcg_target_qemu_prologue(TCGContext *s)
     stack_addend = frame_size - push_size;
     tcg_out_addi(s, TCG_REG_ESP, -stack_addend);
 
-    tcg_out_modrm(s, 0xff, EXT_JMPN_Ev, TCG_REG_EAX); /* jmp *%eax */
+    tcg_out_modrm(s, OPC_GRP5, EXT5_JMPN_Ev, TCG_REG_EAX); /* jmp *%eax */
     
     /* TB epilogue */
     tb_ret_addr = s->code_ptr;