qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 06/57] tcg/i386: Generalize multi-part load overlap test


From: Richard Henderson
Subject: Re: [PATCH v3 06/57] tcg/i386: Generalize multi-part load overlap test
Date: Mon, 1 May 2023 08:42:15 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0

On 4/29/23 14:01, Philippe Mathieu-Daudé wrote:
On 24/4/23 07:40, Richard Henderson wrote:
Test for both base and index; use datahi as a temporary, overwritten
by the final load.  Always perform the loads in ascending order, so
that any (user-only) fault sees the correct address.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
  tcg/i386/tcg-target.c.inc | 31 +++++++++++++++----------------
  1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
index b986109d77..794d440a9e 100644
--- a/tcg/i386/tcg-target.c.inc
+++ b/tcg/i386/tcg-target.c.inc
@@ -2223,23 +2223,22 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi,
          if (TCG_TARGET_REG_BITS == 64) {
              tcg_out_modrm_sib_offset(s, movop + P_REXW + seg, datalo,
                                       base, index, 0, ofs);
+            break;
+        }
+        if (use_movbe) {
+            TCGReg t = datalo;
+            datalo = datahi;
+            datahi = t;
+        }
+        if (base == datalo || index == datalo) {
+            tcg_out_modrm_sib_offset(s, OPC_LEA, datahi, base, index, 0, ofs);
+            tcg_out_modrm_offset(s, movop + seg, datalo, datahi, 0);
+            tcg_out_modrm_offset(s, movop + seg, datahi, datahi, 4);

LGTM but I'd rather have someone fluent with x86 review this one...

The original address is (base + (index << 0) + ofs).

If datalo overlaps either base or index, then we can't use the same form of address for the second load for datahi. So we "Load Effective Address" to perform the computation of the original address once, storing into datahi as temporary (we are guaranteed that datalo != datahi because they're both outputs). After that, the two addresses that we want are (datahi + 0) and (datahi + 4).


r~



reply via email to

[Prev in Thread] Current Thread [Next in Thread]