From nobody Sat Apr 26 14:15:12 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as
 permitted sender) client-ip=208.118.235.17;
 envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org;
 helo=lists.gnu.org;
Authentication-Results: mx.zohomail.com;
	dkim=fail;
	spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted
 sender)  smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org;
	dmarc=fail(p=none dis=none)  header.from=linaro.org
Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org>
Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by
 mx.zohomail.com
	with SMTPS id 1544758790623791.6072878219685;
 Thu, 13 Dec 2018 19:39:50 -0800 (PST)
Received: from localhost ([::1]:59159 helo=lists.gnu.org)
	by lists.gnu.org with esmtp (Exim 4.71)
	(envelope-from <qemu-devel-bounces+importer=patchew.org@nongnu.org>)
	id 1gXeKL-0007Q5-E3
	for importer@patchew.org; Thu, 13 Dec 2018 22:39:49 -0500
Received: from eggs.gnu.org ([2001:4830:134:3::10]:58919)
	by lists.gnu.org with esmtp (Exim 4.71)
	(envelope-from <richard.henderson@linaro.org>) id 1gXe1B-0006FO-1c
	for qemu-devel@nongnu.org; Thu, 13 Dec 2018 22:20:02 -0500
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
	(envelope-from <richard.henderson@linaro.org>) id 1gXe16-0007Uc-RY
	for qemu-devel@nongnu.org; Thu, 13 Dec 2018 22:19:59 -0500
Received: from mail-oi1-x229.google.com ([2607:f8b0:4864:20::229]:45952)
	by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)
	(Exim 4.71) (envelope-from <richard.henderson@linaro.org>)
	id 1gXe14-0007Eg-8A
	for qemu-devel@nongnu.org; Thu, 13 Dec 2018 22:19:55 -0500
Received: by mail-oi1-x229.google.com with SMTP id y1so3443290oie.12
	for <qemu-devel@nongnu.org>; Thu, 13 Dec 2018 19:19:50 -0800 (PST)
Received: from cloudburst.twiddle.net ([187.217.227.243])
	by smtp.gmail.com with ESMTPSA id
	g138sm2367537oib.26.2018.12.13.19.19.48
	(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);
	Thu, 13 Dec 2018 19:19:49 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=RGLha6wnqV2UoHvC7GVzmeu/KOuO36ywWoKZjz4PETE=;
	b=cFdevTllHngDS/Xhgg2LGwZRZHQyok/opBNmBu5982egykC/ZKEadI3EfsYoxmf0Pq
	gAF239KLcPc/NOuixo850e2H4M89j3IIl+EuzniVy2VasfDjagRmEXNY4xwR5vf4MkFI
	ERT3lYbStkpL/IjiE8ujXMbt+CqdH8YxehDWE=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20161025;
	h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
	:references;
	bh=RGLha6wnqV2UoHvC7GVzmeu/KOuO36ywWoKZjz4PETE=;
	b=ZR1g/FGmCU47NQfDy5Dp5/Ay+8nojUaqwCmSpPTvxYCYr5UdDgFTGRFLUaSrFwW27+
	2NToNHrRvt0+WdmHHlpQoMyTiABiguEZ0UlCdlventD3fXAGcqt+PSmKzdsBZAwwwdCy
	id7qVQ7TxclwbzJIrKyyhNQ3zmhSlnZnHEnXS/bcxYQUCUv4g0BUVkcj0YSxjzHJ5eBj
	SEaqvPqjCrqT0er6zIRbQUVijEi7WYRi4SR0FSIFOTgbgP2WXZB4RC5SFz0wZDshr05r
	eg71ba87l5vLwaS/rGWMZJDiO2drUJR6FOUDT/eH3qchIh43xyl7w3227pxQL+TftauP
	l1oA==
X-Gm-Message-State: AA+aEWZ3Kt2P8eA9esjioqePrQo9VDm1uYia9BLKt9Fk92MTNu7zHlyd
	vPyJlsfH9levlQ686vTA4iozrTvdA9tSug==
X-Google-Smtp-Source: 
 AFSGD/XBovLNn9+2xitNmHyC7JBuVuajHc6CWM0R1AcgDAOcLeHZrgQbFUfxfafKadDW/CHPIWJQvQ==
X-Received: by 2002:a54:4895:: with SMTP id r21mr847663oic.210.1544757589977;
	Thu, 13 Dec 2018 19:19:49 -0800 (PST)
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Date: Thu, 13 Dec 2018 21:19:12 -0600
Message-Id: <20181214031923.29527-23-richard.henderson@linaro.org>
X-Mailer: git-send-email 2.17.2
In-Reply-To: <20181214031923.29527-1-richard.henderson@linaro.org>
References: <20181214031923.29527-1-richard.henderson@linaro.org>
X-detected-operating-system: by eggs.gnu.org: Genre and OS details not
	recognized.
X-Received-From: 2607:f8b0:4864:20::229
Subject: [Qemu-devel] [PULL 21/32] tcg/i386: Precompute all guest_base
 parameters
X-BeenThere: qemu-devel@nongnu.org
X-Mailman-Version: 2.1.21
Precedence: list
List-Id: <qemu-devel.nongnu.org>
List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>,
	<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>
List-Archive: <http://lists.nongnu.org/archive/html/qemu-devel/>
List-Post: <mailto:qemu-devel@nongnu.org>
List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help>
List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>,
	<mailto:qemu-devel-request@nongnu.org?subject=subscribe>
Cc: peter.maydell@linaro.org
Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org
Sender: "Qemu-devel" <qemu-devel-bounces+importer=patchew.org@nongnu.org>
X-ZohoMail-DKIM: fail (Header signature does not verify)
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"

These values are constant between all qemu_ld/st invocations;
there is no need to figure this out each time.  If we cannot
use a segment or an offset directly for guest_base, load the
value into a register in the prologue.

Reviewed-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 tcg/i386/tcg-target.inc.c | 101 +++++++++++++++-----------------------
 1 file changed, 40 insertions(+), 61 deletions(-)

diff --git a/tcg/i386/tcg-target.inc.c b/tcg/i386/tcg-target.inc.c
index f7b548545a..3fb2f4b971 100644
--- a/tcg/i386/tcg-target.inc.c
+++ b/tcg/i386/tcg-target.inc.c
@@ -1857,22 +1857,31 @@ static void tcg_out_qemu_st_slow_path(TCGContext *s=
, TCGLabelQemuLdst *l)
     tcg_out_push(s, retaddr);
     tcg_out_jmp(s, qemu_st_helpers[opc & (MO_BSWAP | MO_SIZE)]);
 }
-#elif defined(__x86_64__) && defined(__linux__)
-# include <asm/prctl.h>
-# include <sys/prctl.h>
-
+#elif TCG_TARGET_REG_BITS =3D=3D 32
+# define x86_guest_base_seg     0
+# define x86_guest_base_index   -1
+# define x86_guest_base_offset  guest_base
+#else
+static int x86_guest_base_seg;
+static int x86_guest_base_index =3D -1;
+static int32_t x86_guest_base_offset;
+# if defined(__x86_64__) && defined(__linux__)
+#  include <asm/prctl.h>
+#  include <sys/prctl.h>
 int arch_prctl(int code, unsigned long addr);
-
-static int guest_base_flags;
-static inline void setup_guest_base_seg(void)
+static inline int setup_guest_base_seg(void)
 {
     if (arch_prctl(ARCH_SET_GS, guest_base) =3D=3D 0) {
-        guest_base_flags =3D P_GS;
+        return P_GS;
     }
+    return 0;
 }
-#else
-# define guest_base_flags 0
-static inline void setup_guest_base_seg(void) { }
+# else
+static inline int setup_guest_base_seg(void)
+{
+    return 0;
+}
+# endif
 #endif /* SOFTMMU */
=20
 static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg da=
tahi,
@@ -2011,27 +2020,9 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCG=
Arg *args, bool is64)
     add_qemu_ldst_label(s, true, is64, oi, datalo, datahi, addrlo, addrhi,
                         s->code_ptr, label_ptr);
 #else
-    {
-        int32_t offset =3D guest_base;
-        int index =3D -1;
-        int seg =3D 0;
-
-        /*
-         * Recall we store 32-bit values zero-extended.  No need for
-         * further manual extension or an addr32 (0x67) prefix.
-         */
-        if (guest_base =3D=3D 0 || guest_base_flags) {
-            seg =3D guest_base_flags;
-            offset =3D 0;
-        } else if (TCG_TARGET_REG_BITS =3D=3D 64 && offset !=3D guest_base=
) {
-            tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_L1, guest_base);
-            index =3D TCG_REG_L1;
-            offset =3D 0;
-        }
-
-        tcg_out_qemu_ld_direct(s, datalo, datahi,
-                               addrlo, index, offset, seg, is64, opc);
-    }
+    tcg_out_qemu_ld_direct(s, datalo, datahi, addrlo, x86_guest_base_index,
+                           x86_guest_base_offset, x86_guest_base_seg,
+                           is64, opc);
 #endif
 }
=20
@@ -2147,28 +2138,8 @@ static void tcg_out_qemu_st(TCGContext *s, const TCG=
Arg *args, bool is64)
     add_qemu_ldst_label(s, false, is64, oi, datalo, datahi, addrlo, addrhi,
                         s->code_ptr, label_ptr);
 #else
-    {
-        int32_t offset =3D guest_base;
-        int index =3D -1;
-        int seg =3D 0;
-
-        /*
-         * Recall we store 32-bit values zero-extended.  No need for
-         * further manual extension or an addr32 (0x67) prefix.
-         */
-        if (guest_base =3D=3D 0 || guest_base_flags) {
-            seg =3D guest_base_flags;
-            offset =3D 0;
-        } else if (TCG_TARGET_REG_BITS =3D=3D 64 && offset !=3D guest_base=
) {
-            /* ??? Note that we require L0 free for bswap.  */
-            tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_L1, guest_base);
-            index =3D TCG_REG_L1;
-            offset =3D 0;
-        }
-
-        tcg_out_qemu_st_direct(s, datalo, datahi,
-                               addrlo, index, offset, seg, opc);
-    }
+    tcg_out_qemu_st_direct(s, datalo, datahi, addrlo, x86_guest_base_index,
+                           x86_guest_base_offset, x86_guest_base_seg, opc);
 #endif
 }
=20
@@ -3415,6 +3386,21 @@ static void tcg_target_qemu_prologue(TCGContext *s)
 		         (ARRAY_SIZE(tcg_target_callee_save_regs) + 2) * 4
 			 + stack_addend);
 #else
+# if !defined(CONFIG_SOFTMMU) && TCG_TARGET_REG_BITS =3D=3D 64
+    if (guest_base) {
+        int seg =3D setup_guest_base_seg();
+        if (seg !=3D 0) {
+            x86_guest_base_seg =3D seg;
+        } else if (guest_base =3D=3D (int32_t)guest_base) {
+            x86_guest_base_offset =3D guest_base;
+        } else {
+            /* Choose R12 because, as a base, it requires a SIB byte. */
+            x86_guest_base_index =3D TCG_REG_R12;
+            tcg_out_mov(s, TCG_TYPE_PTR, x86_guest_base_index, guest_base);
+            tcg_regset_set_reg(s->reserved_regs, x86_guest_base_index);
+        }
+    }
+# endif
     tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, tcg_target_call_iarg_regs[0]);
     tcg_out_addi(s, TCG_REG_ESP, -stack_addend);
     /* jmp *tb.  */
@@ -3440,13 +3426,6 @@ static void tcg_target_qemu_prologue(TCGContext *s)
         tcg_out_pop(s, tcg_target_callee_save_regs[i]);
     }
     tcg_out_opc(s, OPC_RET, 0, 0, 0);
-
-#if !defined(CONFIG_SOFTMMU)
-    /* Try to set up a segment register to point to guest_base.  */
-    if (guest_base) {
-        setup_guest_base_seg();
-    }
-#endif
 }
=20
 static void tcg_out_nop_fill(tcg_insn_unit *p, int count)
--=20
2.17.2