Re: [Qemu-devel] [PATCH 1/2] tcg/i386: Extend addresses for 32-bit guests

2015-07-17 Thread Aurelien Jarno
On 2015-07-16 22:25, Richard Henderson wrote:
 Removing the ??? comment explaining why it (mostly) worked.
 
 Signed-off-by: Richard Henderson r...@twiddle.net
 ---
  tcg/i386/tcg-target.c | 105 
 +++---
  1 file changed, 65 insertions(+), 40 deletions(-)
 
 diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c
 index ff4d9cf..bbe2963 100644
 --- a/tcg/i386/tcg-target.c
 +++ b/tcg/i386/tcg-target.c
 @@ -1434,8 +1434,8 @@ static inline void setup_guest_base_seg(void) { }
  #endif /* SOFTMMU */
  
  static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg 
 datahi,
 -   TCGReg base, intptr_t ofs, int seg,
 -   TCGMemOp memop)
 +   TCGReg base, int index, intptr_t ofs,
 +   int seg, TCGMemOp memop)
  {
  const TCGMemOp real_bswap = memop  MO_BSWAP;
  TCGMemOp bswap = real_bswap;
 @@ -1448,13 +1448,16 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, 
 TCGReg datalo, TCGReg datahi,
  
  switch (memop  MO_SSIZE) {
  case MO_UB:
 -tcg_out_modrm_offset(s, OPC_MOVZBL + seg, datalo, base, ofs);
 +tcg_out_modrm_sib_offset(s, OPC_MOVZBL + seg, datalo,
 + base, index, 0, ofs);
  break;
  case MO_SB:
 -tcg_out_modrm_offset(s, OPC_MOVSBL + P_REXW + seg, datalo, base, 
 ofs);
 +tcg_out_modrm_sib_offset(s, OPC_MOVSBL + P_REXW + seg, datalo,
 + base, index, 0, ofs);
  break;
  case MO_UW:
 -tcg_out_modrm_offset(s, OPC_MOVZWL + seg, datalo, base, ofs);
 +tcg_out_modrm_sib_offset(s, OPC_MOVZWL + seg, datalo,
 + base, index, 0, ofs);
  if (real_bswap) {
  tcg_out_rolw_8(s, datalo);
  }
 @@ -1462,20 +1465,21 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, 
 TCGReg datalo, TCGReg datahi,
  case MO_SW:
  if (real_bswap) {
  if (have_movbe) {
 -tcg_out_modrm_offset(s, OPC_MOVBE_GyMy + P_DATA16 + seg,
 - datalo, base, ofs);
 +tcg_out_modrm_sib_offset(s, OPC_MOVBE_GyMy + P_DATA16 + seg,
 + datalo, base, index, 0, ofs);
  } else {
 -tcg_out_modrm_offset(s, OPC_MOVZWL + seg, datalo, base, ofs);
 +tcg_out_modrm_sib_offset(s, OPC_MOVZWL + seg, datalo,
 + base, index, 0, ofs);
  tcg_out_rolw_8(s, datalo);
  }
  tcg_out_modrm(s, OPC_MOVSWL + P_REXW, datalo, datalo);
  } else {
 -tcg_out_modrm_offset(s, OPC_MOVSWL + P_REXW + seg,
 - datalo, base, ofs);
 +tcg_out_modrm_sib_offset(s, OPC_MOVSWL + P_REXW + seg,
 + datalo, base, index, 0, ofs);
  }
  break;
  case MO_UL:
 -tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs);
 +tcg_out_modrm_sib_offset(s, movop + seg, datalo, base, index, 0, 
 ofs);
  if (bswap) {
  tcg_out_bswap32(s, datalo);
  }
 @@ -1483,19 +1487,22 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, 
 TCGReg datalo, TCGReg datahi,
  #if TCG_TARGET_REG_BITS == 64
  case MO_SL:
  if (real_bswap) {
 -tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs);
 +tcg_out_modrm_sib_offset(s, movop + seg, datalo,
 + base, index, 0, ofs);
  if (bswap) {
  tcg_out_bswap32(s, datalo);
  }
  tcg_out_ext32s(s, datalo, datalo);
  } else {
 -tcg_out_modrm_offset(s, OPC_MOVSLQ + seg, datalo, base, ofs);
 +tcg_out_modrm_sib_offset(s, OPC_MOVSLQ + seg, datalo,
 + base, index, 0, ofs);
  }
  break;
  #endif
  case MO_Q:
  if (TCG_TARGET_REG_BITS == 64) {
 -tcg_out_modrm_offset(s, movop + P_REXW + seg, datalo, base, ofs);
 +tcg_out_modrm_sib_offset(s, movop + P_REXW + seg, datalo,
 + base, index, 0, ofs);
  if (bswap) {
  tcg_out_bswap64(s, datalo);
  }
 @@ -1506,11 +1513,15 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, 
 TCGReg datalo, TCGReg datahi,
  datahi = t;
  }
  if (base != datalo) {
 -tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs);
 -tcg_out_modrm_offset(s, movop + seg, datahi, base, ofs + 4);
 +tcg_out_modrm_sib_offset(s, movop + seg, datalo,
 + base, index, 0, ofs);
 +tcg_out_modrm_sib_offset(s, movop + seg, datahi,
 +   

[Qemu-devel] [PATCH 1/2] tcg/i386: Extend addresses for 32-bit guests

2015-07-16 Thread Richard Henderson
Removing the ??? comment explaining why it (mostly) worked.

Signed-off-by: Richard Henderson r...@twiddle.net
---
 tcg/i386/tcg-target.c | 105 +++---
 1 file changed, 65 insertions(+), 40 deletions(-)

diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c
index ff4d9cf..bbe2963 100644
--- a/tcg/i386/tcg-target.c
+++ b/tcg/i386/tcg-target.c
@@ -1434,8 +1434,8 @@ static inline void setup_guest_base_seg(void) { }
 #endif /* SOFTMMU */
 
 static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi,
-   TCGReg base, intptr_t ofs, int seg,
-   TCGMemOp memop)
+   TCGReg base, int index, intptr_t ofs,
+   int seg, TCGMemOp memop)
 {
 const TCGMemOp real_bswap = memop  MO_BSWAP;
 TCGMemOp bswap = real_bswap;
@@ -1448,13 +1448,16 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, 
TCGReg datalo, TCGReg datahi,
 
 switch (memop  MO_SSIZE) {
 case MO_UB:
-tcg_out_modrm_offset(s, OPC_MOVZBL + seg, datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, OPC_MOVZBL + seg, datalo,
+ base, index, 0, ofs);
 break;
 case MO_SB:
-tcg_out_modrm_offset(s, OPC_MOVSBL + P_REXW + seg, datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, OPC_MOVSBL + P_REXW + seg, datalo,
+ base, index, 0, ofs);
 break;
 case MO_UW:
-tcg_out_modrm_offset(s, OPC_MOVZWL + seg, datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, OPC_MOVZWL + seg, datalo,
+ base, index, 0, ofs);
 if (real_bswap) {
 tcg_out_rolw_8(s, datalo);
 }
@@ -1462,20 +1465,21 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, 
TCGReg datalo, TCGReg datahi,
 case MO_SW:
 if (real_bswap) {
 if (have_movbe) {
-tcg_out_modrm_offset(s, OPC_MOVBE_GyMy + P_DATA16 + seg,
- datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, OPC_MOVBE_GyMy + P_DATA16 + seg,
+ datalo, base, index, 0, ofs);
 } else {
-tcg_out_modrm_offset(s, OPC_MOVZWL + seg, datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, OPC_MOVZWL + seg, datalo,
+ base, index, 0, ofs);
 tcg_out_rolw_8(s, datalo);
 }
 tcg_out_modrm(s, OPC_MOVSWL + P_REXW, datalo, datalo);
 } else {
-tcg_out_modrm_offset(s, OPC_MOVSWL + P_REXW + seg,
- datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, OPC_MOVSWL + P_REXW + seg,
+ datalo, base, index, 0, ofs);
 }
 break;
 case MO_UL:
-tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, movop + seg, datalo, base, index, 0, ofs);
 if (bswap) {
 tcg_out_bswap32(s, datalo);
 }
@@ -1483,19 +1487,22 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, 
TCGReg datalo, TCGReg datahi,
 #if TCG_TARGET_REG_BITS == 64
 case MO_SL:
 if (real_bswap) {
-tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, movop + seg, datalo,
+ base, index, 0, ofs);
 if (bswap) {
 tcg_out_bswap32(s, datalo);
 }
 tcg_out_ext32s(s, datalo, datalo);
 } else {
-tcg_out_modrm_offset(s, OPC_MOVSLQ + seg, datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, OPC_MOVSLQ + seg, datalo,
+ base, index, 0, ofs);
 }
 break;
 #endif
 case MO_Q:
 if (TCG_TARGET_REG_BITS == 64) {
-tcg_out_modrm_offset(s, movop + P_REXW + seg, datalo, base, ofs);
+tcg_out_modrm_sib_offset(s, movop + P_REXW + seg, datalo,
+ base, index, 0, ofs);
 if (bswap) {
 tcg_out_bswap64(s, datalo);
 }
@@ -1506,11 +1513,15 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, 
TCGReg datalo, TCGReg datahi,
 datahi = t;
 }
 if (base != datalo) {
-tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs);
-tcg_out_modrm_offset(s, movop + seg, datahi, base, ofs + 4);
+tcg_out_modrm_sib_offset(s, movop + seg, datalo,
+ base, index, 0, ofs);
+tcg_out_modrm_sib_offset(s, movop + seg, datahi,
+ base, index, 0, ofs + 4);
 } else {
-tcg_out_modrm_offset(s, movop + seg, datahi, base, ofs + 4);
-