[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/22] tcg-i386: Tidy shift operations.
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH 06/22] tcg-i386: Tidy shift operations. |
Date: |
Wed, 28 Apr 2010 10:38:04 -0700 |
Define OPC_SHIFT_{1,Ib,cl}. Factor opcode emission to a function.
Signed-off-by: Richard Henderson <address@hidden>
---
tcg/i386/tcg-target.c | 43 ++++++++++++++++++++++---------------------
1 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c
index 094b2da..c0133be 100644
--- a/tcg/i386/tcg-target.c
+++ b/tcg/i386/tcg-target.c
@@ -168,6 +168,9 @@ static inline int tcg_target_const_match(tcg_target_long
val,
#define OPC_MOVZWL (0xb7 | P_EXT)
#define OPC_MOVSBL (0xbe | P_EXT)
#define OPC_MOVSWL (0xbf | P_EXT)
+#define OPC_SHIFT_1 (0xd1)
+#define OPC_SHIFT_Ib (0xc1)
+#define OPC_SHIFT_cl (0xd3)
#define ARITH_ADD 0
#define ARITH_OR 1
@@ -294,6 +297,16 @@ static inline void tcg_out_st(TCGContext *s, TCGType type,
int arg,
tcg_out_modrm_offset(s, 0x89, arg, arg1, arg2);
}
+static void tcg_out_shifti(TCGContext *s, int subopc, int reg, int count)
+{
+ if (count == 1) {
+ tcg_out_modrm(s, OPC_SHIFT_1, subopc, reg);
+ } else {
+ tcg_out_modrm(s, OPC_SHIFT_Ib, subopc, reg);
+ tcg_out8(s, count);
+ }
+}
+
static void tcg_out_ext8u(TCGContext *s, int dest, int src)
{
if (src >= 4) {
@@ -314,12 +327,8 @@ static void tcg_out_ext8s(TCGContext *s, int dest, int src)
if (src >= 4) {
tcg_out_mov(s, dest, src);
if (dest >= 4) {
- /* shl $24, dest */
- tcg_out_modrm(s, 0xc1, SHIFT_SHL, dest);
- tcg_out8(s, 24);
- /* sar $24, dest */
- tcg_out_modrm(s, 0xc1, SHIFT_SAR, dest);
- tcg_out8(s, 24);
+ tcg_out_shifti(s, SHIFT_SHL, dest, 24);
+ tcg_out_shifti(s, SHIFT_SAR, dest, 24);
return;
}
src = dest;
@@ -348,8 +357,7 @@ static inline void tcg_out_bswap32(TCGContext *s, int reg)
static inline void tcg_out_rolw_8(TCGContext *s, int reg)
{
tcg_out8(s, 0x66);
- tcg_out_modrm(s, 0xc1, 0, reg);
- tcg_out8(s, 8);
+ tcg_out_shifti(s, SHIFT_ROL, reg, 8);
}
static inline void tgen_arithi(TCGContext *s, int c, int r0, int32_t val, int
cf)
@@ -644,9 +652,8 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg
*args,
tcg_out_mov(s, r0, addr_reg);
- tcg_out_modrm(s, 0xc1, 5, r1); /* shr $x, r1 */
- tcg_out8(s, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS);
-
+ tcg_out_shifti(s, SHIFT_SHR, r1, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS);
+
tcg_out_modrm(s, 0x81, 4, r0); /* andl $x, r0 */
tcg_out32(s, TARGET_PAGE_MASK | ((1 << s_bits) - 1));
@@ -842,9 +849,8 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg
*args,
tcg_out_mov(s, r0, addr_reg);
- tcg_out_modrm(s, 0xc1, 5, r1); /* shr $x, r1 */
- tcg_out8(s, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS);
-
+ tcg_out_shifti(s, SHIFT_SHR, r1, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS);
+
tcg_out_modrm(s, 0x81, 4, r0); /* andl $x, r0 */
tcg_out32(s, TARGET_PAGE_MASK | ((1 << s_bits) - 1));
@@ -1141,14 +1147,9 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
opc,
c = SHIFT_SHL;
gen_shift32:
if (const_args[2]) {
- if (args[2] == 1) {
- tcg_out_modrm(s, 0xd1, c, args[0]);
- } else {
- tcg_out_modrm(s, 0xc1, c, args[0]);
- tcg_out8(s, args[2]);
- }
+ tcg_out_shifti(s, c, args[0], args[2]);
} else {
- tcg_out_modrm(s, 0xd3, c, args[0]);
+ tcg_out_modrm(s, OPC_SHIFT_cl, c, args[0]);
}
break;
case INDEX_op_shr_i32:
--
1.6.6.1
- [Qemu-devel] [PATCH 13/22] tcg-i386: Tidy push/pop., (continued)
- [Qemu-devel] [PATCH 13/22] tcg-i386: Tidy push/pop., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 08/22] tcg-i386: Eliminate extra move from qemu_ld64., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 09/22] tcg-i386: Tidy jumps., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 04/22] tcg-i386: Tidy ext8s and ext16s operations., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 03/22] tcg-i386: Tidy ext8u and ext16u operations., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 12/22] tcg-i386: Tidy movi., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 10/22] tcg-i386: Tidy immediate arithmetic operations., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 07/22] tcg-i386: Tidy move operations., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 01/22] tcg-i386: Allocate call-saved registers first., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 11/22] tcg-i386: Tidy non-immediate arithmetic operations., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 06/22] tcg-i386: Tidy shift operations.,
Richard Henderson <=
- [Qemu-devel] [PATCH 17/22] tcg-i386: Tidy unary arithmetic., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 20/22] tcg-i386: Tidy lea., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 19/22] tcg-i386: Tidy xchg., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 22/22] tcg-i386: Tidy data16 prefixes., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 21/22] tcg-i386: Use lea for three-operand add., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 16/22] tcg-i386: Tidy setcc., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 14/22] tcg-i386: Tidy calls., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 15/22] tcg-i386: Tidy ret., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 18/22] tcg-i386: Tidy multiply., Richard Henderson, 2010/04/28
- [Qemu-devel] [PATCH 05/22] tcg-i386: Tidy bswap operations., Richard Henderson, 2010/04/28