From nobody Mon Feb 9 21:28:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1629319825; cv=none; d=zohomail.com; s=zohoarc; b=KaynvNCYXiFHdwVslF717vRhfZbb4q/O5EOTCPkN8cZ7FcnhIbPByYuTMKYAzgznwQIewhKQ/P75FkTe7gy4p0D0XUlvQOhhvpqLvTBfP1FPMHsuS55+TuKV1O2Al032IyYKDY7eX74mN1Bku7RgejAzaNLWuQgak6OU1UxMJBE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629319825; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=J6pcCxhBe14sRLuVb3W2OppzqwbB0uz8Jyn3ZdOGqBU=; b=Xsz3wHNWTzgWkBeVEmlHDvxzowfwxQh+Jmy5EhSgHbHVSRSVwcY2jXLDFSy91b18VpeZLAcBQ1ibXCfvB+++VcTCrmoqHsH7mebPnt+BKOIpYwwgteuSPGjZIjN0uIeE6B0S5+/Qe0jbkHAE0wh387AmnCodQy5m5Cbynr7oKtQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1629319825353730.8457919595521; Wed, 18 Aug 2021 13:50:25 -0700 (PDT) Received: from localhost ([::1]:57858 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mGSW0-0000h6-2X for importer@patchew.org; Wed, 18 Aug 2021 16:50:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45468) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mGSRu-0000I4-D7 for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:10 -0400 Received: from mail-pf1-x436.google.com ([2607:f8b0:4864:20::436]:38623) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mGSRr-00085C-U9 for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:10 -0400 Received: by mail-pf1-x436.google.com with SMTP id a21so3407950pfh.5 for ; Wed, 18 Aug 2021 13:46:07 -0700 (PDT) Received: from localhost.localdomain ([173.197.107.15]) by smtp.gmail.com with ESMTPSA id 143sm739815pfz.13.2021.08.18.13.46.05 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Aug 2021 13:46:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=J6pcCxhBe14sRLuVb3W2OppzqwbB0uz8Jyn3ZdOGqBU=; b=hmy1yERNgduTY28hP4C4tkxEJfib/JwH3xbia+oJE0wIqUmcV2ysDd/tW6zcKHeXWz khN2Sk8UkR29Mmv30aITf9vS0NgC6rGw+J4hI1hL9Ln7bX50iIsHZn43ggXjlhTI+nkl fbDii0YlvaTIa9tfhS06MmKni9g0xf9PMf16V7pCd7HoMyGvYDBrKQqjbja+uwM5lX42 ZRKl4669YFzxD41awPFa5y+IapuuLpDgJ+WiZvPBcSj3ZNjYA6a4Kmw1Yd3txZl00ZuO 94m++c3teKUyUB2NPZhiQVCcLa9QjScKZ++QU2P2MWTIpTCt6msUI3awh48eS7GGB4Er fJww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=J6pcCxhBe14sRLuVb3W2OppzqwbB0uz8Jyn3ZdOGqBU=; b=b5Z1wZcQ3xIrxFMsu8u+hr09+JyhtQAQ3Da/WWLiH10bO3Gr8J91M/qmz47E+76goA WatOInGLbHxgB4ltLI44qMIp3SiYuVqYNCeXFtMYZKpjeoA8VWGLktDhaiXiekkC8kGi p2AwH9/oKmw/DYSlR9QGXQjJKn3PthC5DY6/KaNWEzMpOCEa1NjuxRNL+jR5eNGET+0w FUi00miDB8XBJysbw3QUmGFjF6YZd28LL8EbJ8Yyk4R5eAVXkg6RLnz2CT/7w0y/ao6v 9yvtbwbWMcwf3rSTjVl1RRMOBMGX5dFhG6GRBGunMHePvFHo6hNq5QJ+X4eXz9MQGgU7 zYgA== X-Gm-Message-State: AOAM532oAUc2zEdAkrvatVIhelebz3UpKdR+47CLYtjnL4PKdQj4F4ad 49JRYkpBl4ZNNgzs97FTb4vC1MdwjkGb0Q== X-Google-Smtp-Source: ABdhPJyoSwrpQ+IIqHWWO4okuToUh/ba0cZ6HvWz+i0zVlPM9ZcRqw3R2kP86W2HpW314IQtypp2Pw== X-Received: by 2002:a65:468c:: with SMTP id h12mr10881253pgr.423.1629319566217; Wed, 18 Aug 2021 13:46:06 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 1/7] tcg/sparc: Drop inline markers Date: Wed, 18 Aug 2021 10:45:56 -1000 Message-Id: <20210818204602.394771-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210818204602.394771-1-richard.henderson@linaro.org> References: <20210818204602.394771-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::436; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x436.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1629319826687100001 Content-Type: text/plain; charset="utf-8" Let the compiler decide about inlining. Signed-off-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- tcg/sparc/tcg-target.c.inc | 45 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/tcg/sparc/tcg-target.c.inc b/tcg/sparc/tcg-target.c.inc index 0e3f460584..f2bd213449 100644 --- a/tcg/sparc/tcg-target.c.inc +++ b/tcg/sparc/tcg-target.c.inc @@ -294,12 +294,12 @@ static const int tcg_target_call_oarg_regs[] =3D { bool use_vis3_instructions; #endif =20 -static inline int check_fit_i64(int64_t val, unsigned int bits) +static bool check_fit_i64(int64_t val, unsigned int bits) { return val =3D=3D sextract64(val, 0, bits); } =20 -static inline int check_fit_i32(int32_t val, unsigned int bits) +static bool check_fit_i32(int32_t val, unsigned int bits) { return val =3D=3D sextract32(val, 0, bits); } @@ -362,14 +362,14 @@ static bool tcg_target_const_match(int64_t val, TCGTy= pe type, int ct) } } =20 -static inline void tcg_out_arith(TCGContext *s, TCGReg rd, TCGReg rs1, - TCGReg rs2, int op) +static void tcg_out_arith(TCGContext *s, TCGReg rd, TCGReg rs1, + TCGReg rs2, int op) { tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | INSN_RS2(rs2)); } =20 -static inline void tcg_out_arithi(TCGContext *s, TCGReg rd, TCGReg rs1, - int32_t offset, int op) +static void tcg_out_arithi(TCGContext *s, TCGReg rd, TCGReg rs1, + int32_t offset, int op) { tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | INSN_IMM13(offset)); } @@ -381,8 +381,7 @@ static void tcg_out_arithc(TCGContext *s, TCGReg rd, TC= GReg rs1, | (val2const ? INSN_IMM13(val2) : INSN_RS2(val2))); } =20 -static inline bool tcg_out_mov(TCGContext *s, TCGType type, - TCGReg ret, TCGReg arg) +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg ar= g) { if (ret !=3D arg) { tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR); @@ -390,12 +389,12 @@ static inline bool tcg_out_mov(TCGContext *s, TCGType= type, return true; } =20 -static inline void tcg_out_sethi(TCGContext *s, TCGReg ret, uint32_t arg) +static void tcg_out_sethi(TCGContext *s, TCGReg ret, uint32_t arg) { tcg_out32(s, SETHI | INSN_RD(ret) | ((arg & 0xfffffc00) >> 10)); } =20 -static inline void tcg_out_movi_imm13(TCGContext *s, TCGReg ret, int32_t a= rg) +static void tcg_out_movi_imm13(TCGContext *s, TCGReg ret, int32_t arg) { tcg_out_arithi(s, ret, TCG_REG_G0, arg, ARITH_OR); } @@ -470,14 +469,14 @@ static void tcg_out_movi_int(TCGContext *s, TCGType t= ype, TCGReg ret, } } =20 -static inline void tcg_out_movi(TCGContext *s, TCGType type, - TCGReg ret, tcg_target_long arg) +static void tcg_out_movi(TCGContext *s, TCGType type, + TCGReg ret, tcg_target_long arg) { tcg_out_movi_int(s, type, ret, arg, false); } =20 -static inline void tcg_out_ldst_rr(TCGContext *s, TCGReg data, TCGReg a1, - TCGReg a2, int op) +static void tcg_out_ldst_rr(TCGContext *s, TCGReg data, TCGReg a1, + TCGReg a2, int op) { tcg_out32(s, op | INSN_RD(data) | INSN_RS1(a1) | INSN_RS2(a2)); } @@ -494,20 +493,20 @@ static void tcg_out_ldst(TCGContext *s, TCGReg ret, T= CGReg addr, } } =20 -static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, - TCGReg arg1, intptr_t arg2) +static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, + TCGReg arg1, intptr_t arg2) { tcg_out_ldst(s, ret, arg1, arg2, (type =3D=3D TCG_TYPE_I32 ? LDUW : LD= X)); } =20 -static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, - TCGReg arg1, intptr_t arg2) +static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) { tcg_out_ldst(s, arg, arg1, arg2, (type =3D=3D TCG_TYPE_I32 ? STW : STX= )); } =20 -static inline bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val, - TCGReg base, intptr_t ofs) +static bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val, + TCGReg base, intptr_t ofs) { if (val =3D=3D 0) { tcg_out_st(s, type, TCG_REG_G0, base, ofs); @@ -527,12 +526,12 @@ static void tcg_out_ld_ptr(TCGContext *s, TCGReg ret,= const void *arg) tcg_out_ld(s, TCG_TYPE_PTR, ret, ret, (uintptr_t)arg & 0x3ff); } =20 -static inline void tcg_out_sety(TCGContext *s, TCGReg rs) +static void tcg_out_sety(TCGContext *s, TCGReg rs) { tcg_out32(s, WRY | INSN_RS1(TCG_REG_G0) | INSN_RS2(rs)); } =20 -static inline void tcg_out_rdy(TCGContext *s, TCGReg rd) +static void tcg_out_rdy(TCGContext *s, TCGReg rd) { tcg_out32(s, RDY | INSN_RD(rd)); } @@ -552,7 +551,7 @@ static void tcg_out_div32(TCGContext *s, TCGReg rd, TCG= Reg rs1, uns ? ARITH_UDIV : ARITH_SDIV); } =20 -static inline void tcg_out_nop(TCGContext *s) +static void tcg_out_nop(TCGContext *s) { tcg_out32(s, NOP); } --=20 2.25.1 From nobody Mon Feb 9 21:28:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1629320015; cv=none; d=zohomail.com; s=zohoarc; b=DW/IUdaaWwGiL3fC61swcVE9JQKXFxV5Q1MDrfe5mGWBer6/mjfvmX+3eIRle0rmaJS1cFovZgoiIdcyWITKK/EJZx4Ho1QTM+jF2ih5lYluul3I0tjue6k6RcxexvjPUUpnkEGCt1OymQ3jFcMmalup8I7jJbKCRv6YLRJPfMI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629320015; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=2YMEXY5lcm5x3Zkh5+yyZ4R7hiwANUr2YGFQ8Zw8JOk=; b=PSRaQ5QbFlYxbGRgyTK12uH/YFEjT4pSlAw8ngEFHNUszB4bx3ZgDZGoRvMRPSA+HUyV7ZVcNNQjAwNp4C5yIywWRWUfH9sAKtvGQc1nNCxefkLdpPy77fqqL2Cq5hvKZSXp6nvrE6udjR86xGR3GBuPBNU1uyCdlVw6z2eWwis= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1629320015116254.69170751520903; Wed, 18 Aug 2021 13:53:35 -0700 (PDT) Received: from localhost ([::1]:39476 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mGSZ4-0007nC-2v for importer@patchew.org; Wed, 18 Aug 2021 16:53:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45500) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mGSRv-0000KQ-JQ for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:12 -0400 Received: from mail-pg1-x533.google.com ([2607:f8b0:4864:20::533]:42916) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mGSRs-00085s-Dw for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:11 -0400 Received: by mail-pg1-x533.google.com with SMTP id o2so3572458pgr.9 for ; Wed, 18 Aug 2021 13:46:08 -0700 (PDT) Received: from localhost.localdomain ([173.197.107.15]) by smtp.gmail.com with ESMTPSA id 143sm739815pfz.13.2021.08.18.13.46.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Aug 2021 13:46:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=2YMEXY5lcm5x3Zkh5+yyZ4R7hiwANUr2YGFQ8Zw8JOk=; b=laZDXteSC8GahKqs6HYAOXy33sxArIhKXE2jbzTC81dOtxq63XD1HilxO2C9OQNCqz o9Hw6/wXwLIFfQDLnPVxUzNTs79mNTkUhX49s20PhO0C/cN8X5Hc1nuY0YIq7wD8ufyz +ICzvqG+C1jZ1aq+bRV562mamGwy6kCfEY93zd64W+FYIO+am9ywWxFUvrmErQ5SLOZ2 fGRedR56l+W/6XgnoZ7K5zK+ZHa/gIO98k1JFVCcYOPhOzqq+4hmHA0554MEn2YjNrxP X3FswubOwAR84MOb0W7jbBby988epfYOKiOmKnA4gLubs2sVP1dFUmsZTsn5qa7T8tpX Oq2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2YMEXY5lcm5x3Zkh5+yyZ4R7hiwANUr2YGFQ8Zw8JOk=; b=BvffYK9ASApX7p8+jLrau3A+Apr57ebP7fqSk9K5G7DjJGEyEy/wTgQvd2W6wU4Axq n8dXBTilTR0S+73+61dpdbftSxk7OVk9e2LQf0pB3KpdiwtqdwQS6/fBtUAYJtODBJlg nNQ4wTjbNEnIRz+uxULpgOOZV9T9y174O0a/R78yPOPkevE/JIvHOLJXXrO4ULMBRzVH Mu18s2XcnHyRkZRdz4cLciwAlDIKlfAghZ5IhKNJiyS6Lx/AMpRiX8svq/ZwfMEuUBUG 9km2OUJWnpzf92gaMI/+0XAuVYw8eWKGzmnHfavMY5Pxu7ZNwq08Xhui63M5avvGEbAy W1HQ== X-Gm-Message-State: AOAM532QkrXQPo5nXJXIOF625q1y5uvfmRB1ddQtZdVam+IBT8j43QDM Xifv5n+XOLfVTh6I0XGV+daUhxLC9z+Y+Q== X-Google-Smtp-Source: ABdhPJy5kwWRQbgEdbAU5AUAKIFAd3FxC8bnCAX+IJYQm6+48RHDHxIFVzokKzD04eC/ew8hoj/8eg== X-Received: by 2002:a65:4682:: with SMTP id h2mr10819779pgr.409.1629319567229; Wed, 18 Aug 2021 13:46:07 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 2/7] tcg/sparc: Introduce tcg_out_mov_delay Date: Wed, 18 Aug 2021 10:45:57 -1000 Message-Id: <20210818204602.394771-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210818204602.394771-1-richard.henderson@linaro.org> References: <20210818204602.394771-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::533; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x533.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1629320017208100001 Content-Type: text/plain; charset="utf-8" This version of tcg_out_mov is emits a nop to fill the delay slot if the move is not required. The only current use, for INDEX_op_goto_ptr, will always require the move but properly documents the delay slot. Signed-off-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- tcg/sparc/tcg-target.c.inc | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tcg/sparc/tcg-target.c.inc b/tcg/sparc/tcg-target.c.inc index f2bd213449..9dd32ef95e 100644 --- a/tcg/sparc/tcg-target.c.inc +++ b/tcg/sparc/tcg-target.c.inc @@ -362,6 +362,11 @@ static bool tcg_target_const_match(int64_t val, TCGTyp= e type, int ct) } } =20 +static void tcg_out_nop(TCGContext *s) +{ + tcg_out32(s, NOP); +} + static void tcg_out_arith(TCGContext *s, TCGReg rd, TCGReg rs1, TCGReg rs2, int op) { @@ -389,6 +394,15 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, T= CGReg ret, TCGReg arg) return true; } =20 +static void tcg_out_mov_delay(TCGContext *s, TCGReg ret, TCGReg arg) +{ + if (ret !=3D arg) { + tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR); + } else { + tcg_out_nop(s); + } +} + static void tcg_out_sethi(TCGContext *s, TCGReg ret, uint32_t arg) { tcg_out32(s, SETHI | INSN_RD(ret) | ((arg & 0xfffffc00) >> 10)); @@ -551,11 +565,6 @@ static void tcg_out_div32(TCGContext *s, TCGReg rd, TC= GReg rs1, uns ? ARITH_UDIV : ARITH_SDIV); } =20 -static void tcg_out_nop(TCGContext *s) -{ - tcg_out32(s, NOP); -} - static const uint8_t tcg_cond_to_bcond[] =3D { [TCG_COND_EQ] =3D COND_E, [TCG_COND_NE] =3D COND_NE, @@ -1349,7 +1358,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, case INDEX_op_goto_ptr: tcg_out_arithi(s, TCG_REG_G0, a0, 0, JMPL); if (USE_REG_TB) { - tcg_out_arith(s, TCG_REG_TB, a0, TCG_REG_G0, ARITH_OR); + tcg_out_mov_delay(s, TCG_REG_TB, a0); } else { tcg_out_nop(s); } --=20 2.25.1 From nobody Mon Feb 9 21:28:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1629320126; cv=none; d=zohomail.com; s=zohoarc; b=BwPOWDyMZVkpY3M/YX6hQjHyJIT6n52dIFsotzp+ZlMtYUwC5Th9EVoPXcbrsFxDK5ft8gUV6TZyEGtFN+fSB5F8PxmSH4G0ch7WrqlK3oVZ/RwWHpZT7U3ApNS87FUhtJzLxeWnQ7MllxtBbhYRzof1J3XrPr+ue/8Njvt0N7c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629320126; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=yq7odZJKEOQT4jSEqTj2CmwhltJ5iDYOv4u5oxAiYrc=; b=C5OqNS2vQ7pJN4fgrYKs4Cq9eFOIo9aMaPWhzrhvoWh9GeqMB5lqGhT+SizJpQY/RyznWFV7NsqErftefW7Fypuh04JxyNNVO+OH3GLqGcRCaPQTi58fmg4gdkOBXwB3kJkdnGmSFYGxCayoxhxyU+xgyl6P5E9y3j2z28Qssg4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1629320126270748.536990841129; Wed, 18 Aug 2021 13:55:26 -0700 (PDT) Received: from localhost ([::1]:43046 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mGSaq-0001ok-Nj for importer@patchew.org; Wed, 18 Aug 2021 16:55:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45506) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mGSRv-0000KR-TC for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:12 -0400 Received: from mail-pf1-x42f.google.com ([2607:f8b0:4864:20::42f]:36706) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mGSRt-00086X-GI for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:11 -0400 Received: by mail-pf1-x42f.google.com with SMTP id m26so3404835pff.3 for ; Wed, 18 Aug 2021 13:46:09 -0700 (PDT) Received: from localhost.localdomain ([173.197.107.15]) by smtp.gmail.com with ESMTPSA id 143sm739815pfz.13.2021.08.18.13.46.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Aug 2021 13:46:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=yq7odZJKEOQT4jSEqTj2CmwhltJ5iDYOv4u5oxAiYrc=; b=FgVfzNUZV2QQpxjHJooX4JVs5FVLMLc02p3fz+0j0m6KCpmKBamzTSwyXQ9L+1b2eS i+7Q5Nj38ICHQgxjY4Trf9ZGSHd6BRWG+q3emzaOjb1RYfK5k5e0rIfqxvn95lpP7UYp 3fVaJU/0IpqsrUNnGmgtI2omdiph5t/kDWNCeboXv95BxKdYFzwJNUuKvcuTIINUdq2o 23B6hr0GvG+3nyf5hFqhkgUEEWLGlYclTi4iwp8chfeawIOd1CTdDCxYhCk69X4acJbv Q4cFNqT+xhVQ6RGQ3cT9TWrc+aoqWNBinSzbvrDOZMLe1UVc9zuNuqwwSZ2VvbRjylAa BBPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yq7odZJKEOQT4jSEqTj2CmwhltJ5iDYOv4u5oxAiYrc=; b=VFqU8LsrprB/WzJp23RNfsktIWpGQZ/CATPz1zy8W2uyTCfAhKNSMoJNAuOzGDbJsw TU/hwEDIGy7G/Tgi9ytiyfiWhIQ9DxwunTnLBy5+QpIk8QjmL1v+KCgFiESdaATWJceH vE//rRvZ0JSxKIEJq6TFvfUhI6o5F7TjoDYPHu0rYYhUPe3NSrDYnYdJPz7IrBMYZdMU PnpAFgzAPlCnp8K4FEpp+jvuqZ2bcfdX6cNkjQrz3NC+Hr5l86z3JwxbjC6a+EKfOitK O2Lb0WjPo5SCwpOT1HekD266hj3YOgD1WJnLno0iClFlTVCf2mxIffkFs0UbRzuuNj4K piSg== X-Gm-Message-State: AOAM530lwJMkxTvTVO2MzqZrwoMvtwjimaF17MvJuvArSh8fUhMd3uCg Ry94AhHU73Di37Xb7cIZkFGx+AJXLYIu+g== X-Google-Smtp-Source: ABdhPJwXL9t468+b/0UmtJJt0w3yz9dDxuElNY1HvR92VOrWXHSutTMIIhE0wHR903WcOVHjCQfvbw== X-Received: by 2002:a63:5c1b:: with SMTP id q27mr10550475pgb.284.1629319568262; Wed, 18 Aug 2021 13:46:08 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 3/7] tcg/sparc: Add scratch argument to tcg_out_movi_int Date: Wed, 18 Aug 2021 10:45:58 -1000 Message-Id: <20210818204602.394771-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210818204602.394771-1-richard.henderson@linaro.org> References: <20210818204602.394771-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42f; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x42f.google.com X-Spam_score_int: -1 X-Spam_score: -0.2 X-Spam_bar: / X-Spam_report: (-0.2 / 5.0 requ) DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1629320128062100001 Content-Type: text/plain; charset="utf-8" This will allow us to control exactly what scratch register is used for loading the constant. Also, fix a theoretical problem in recursing through tcg_out_movi, which may provide a different value for in_prologue. Signed-off-by: Richard Henderson --- tcg/sparc/tcg-target.c.inc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tcg/sparc/tcg-target.c.inc b/tcg/sparc/tcg-target.c.inc index 9dd32ef95e..f11f054df5 100644 --- a/tcg/sparc/tcg-target.c.inc +++ b/tcg/sparc/tcg-target.c.inc @@ -414,7 +414,8 @@ static void tcg_out_movi_imm13(TCGContext *s, TCGReg re= t, int32_t arg) } =20 static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret, - tcg_target_long arg, bool in_prologue) + tcg_target_long arg, bool in_prologue, + TCGReg scratch) { tcg_target_long hi, lo =3D (int32_t)arg; tcg_target_long test, lsb; @@ -471,22 +472,24 @@ static void tcg_out_movi_int(TCGContext *s, TCGType t= ype, TCGReg ret, /* A 64-bit constant decomposed into 2 32-bit pieces. */ if (check_fit_i32(lo, 13)) { hi =3D (arg - lo) >> 32; - tcg_out_movi(s, TCG_TYPE_I32, ret, hi); + tcg_out_movi_int(s, TCG_TYPE_I32, ret, hi, in_prologue, scratch); tcg_out_arithi(s, ret, ret, 32, SHIFT_SLLX); tcg_out_arithi(s, ret, ret, lo, ARITH_ADD); } else { + tcg_debug_assert(scratch !=3D TCG_REG_G0); hi =3D arg >> 32; - tcg_out_movi(s, TCG_TYPE_I32, ret, hi); - tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_T2, lo); + tcg_out_movi_int(s, TCG_TYPE_I32, ret, hi, in_prologue, scratch); + tcg_out_movi_int(s, TCG_TYPE_I32, scratch, lo, in_prologue, TCG_RE= G_G0); tcg_out_arithi(s, ret, ret, 32, SHIFT_SLLX); - tcg_out_arith(s, ret, ret, TCG_REG_T2, ARITH_OR); + tcg_out_arith(s, ret, ret, scratch, ARITH_OR); } } =20 static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret, tcg_target_long arg) { - tcg_out_movi_int(s, type, ret, arg, false); + tcg_debug_assert(ret !=3D TCG_REG_T2); + tcg_out_movi_int(s, type, ret, arg, false, TCG_REG_T2); } =20 static void tcg_out_ldst_rr(TCGContext *s, TCGReg data, TCGReg a1, @@ -837,7 +840,7 @@ static void tcg_out_call_nodelay(TCGContext *s, const t= cg_insn_unit *dest, } else { uintptr_t desti =3D (uintptr_t)dest; tcg_out_movi_int(s, TCG_TYPE_PTR, TCG_REG_T1, - desti & ~0xfff, in_prologue); + desti & ~0xfff, in_prologue, TCG_REG_O7); tcg_out_arithi(s, TCG_REG_O7, TCG_REG_T1, desti & 0xfff, JMPL); } } @@ -1013,7 +1016,8 @@ static void tcg_target_qemu_prologue(TCGContext *s) =20 #ifndef CONFIG_SOFTMMU if (guest_base !=3D 0) { - tcg_out_movi_int(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, guest_base, = true); + tcg_out_movi_int(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, guest_base, + true, TCG_REG_T1); tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG); } #endif --=20 2.25.1 From nobody Mon Feb 9 21:28:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1629320186; cv=none; d=zohomail.com; s=zohoarc; b=igd7sbEm+kwy5c+Vjakj8tXmFuFEfkV8YtB0ilvSVPJI8uAZyzu89u6XCzgJXhp5w9n6snBQoTIO6aTI6W7seA0FOc7b23gBr+BvuWA5roVa3muAulWbPgPATCxIiNYDOzeyRPOba18iaHJTaoPx60xn5F4YAUqcJiK2ZouvbmA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629320186; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=w3g1x/elRBGk2QbFRakGSd+ap6Y5NHb2+du5x0pPFnY=; b=kW5okimqnFVWDOB6xgdY+yZy1W/44FAPMDQnK9DWI5k0PtttES8m7Q9tsgEJpTIU+YqSLknYD69zja/REVPFHXhwgNGGjTWBvk+t8YVJgdasKATxSdDkuzULhz57lqX63oPDsUBkOpc+JhPmWsQc6QczyxZaTEJtwW0TblVMk7E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1629320186581558.9451651810402; Wed, 18 Aug 2021 13:56:26 -0700 (PDT) Received: from localhost ([::1]:45354 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mGSbp-0003TJ-EK for importer@patchew.org; Wed, 18 Aug 2021 16:56:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45510) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mGSRw-0000KT-2G for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:12 -0400 Received: from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d]:43744) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mGSRu-00087B-K9 for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:11 -0400 Received: by mail-pf1-x42d.google.com with SMTP id 7so3413315pfl.10 for ; Wed, 18 Aug 2021 13:46:10 -0700 (PDT) Received: from localhost.localdomain ([173.197.107.15]) by smtp.gmail.com with ESMTPSA id 143sm739815pfz.13.2021.08.18.13.46.08 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Aug 2021 13:46:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=w3g1x/elRBGk2QbFRakGSd+ap6Y5NHb2+du5x0pPFnY=; b=uG1sxHYBY7jJi+V0QtKuLdaRyEtuzMNZrh9ciwNcf6Ypu10Igkrmexm8yPMSI2vvqh XLbhkN77Dw/AyvzL9SZrADiTKQwWz/MC7NjGNXz6KgWmSfNV/F9nXEi4B+n7pNB+s2m9 o0+mCqEHF2RsWizHD0iq47a0KoaCtNNNwfj9qVEBpU78pWGDpMoeRThMT8/NkW4QGavD Le0K+gh+lz4fa5y4u3j7MTBhkyIru8iBsXxA1Zjh6VD2KvhPSv41CIr0GJIs1NFcujxM ZoaHIRwTjw3bXz+/Ad5o7DDLoLb6zezI+et9ObAMpCPDUyGWeFdiiHSzG58QkiXEwKZQ bPqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=w3g1x/elRBGk2QbFRakGSd+ap6Y5NHb2+du5x0pPFnY=; b=taqy2lmEBQLeaqPg86cPX5pv2ycxUSRGzxxflthnKtOJ65mgVvwUxiXSz+nnuIVGxj FCmoAp01RfLP85fl4lIqveg/cM+yBIfmVZuikV28PcxNgIH6hs7zh2iNcyXLT3wQoeAr lh5rdgnX9VJm01Ff07R4QYc3zG/LTtMVYbyM99L+ZHpXB6mod6tSPa06calFAzY4IKG3 nBktUoinaunqdk3td2fFM46NG3SsMKEHeAoV972OZPaEEUq4LbRXWI/QFpRFiesOkN2p ad3WF4dIgvuKP3l/LXL9Zhobd2OrMcpjJZ+9qJOG1jwolmc+CKs2vaZX3+FAwNzsJVQO zdrA== X-Gm-Message-State: AOAM531NYGAkLXHMhlefgp/2Zg4sceLyTZozinNmDz3vhIhyLXd89rSq +Yu63wlXPyMQj8VDpMdQRttWK3CEIeITEg== X-Google-Smtp-Source: ABdhPJzUFL81bIULWshzd9bF80fiIn5A/EZrojotgeN5+fugGU59FQOZAxg6EAHraVLEYdxmv5gJhw== X-Received: by 2002:a65:44c6:: with SMTP id g6mr10605492pgs.442.1629319569294; Wed, 18 Aug 2021 13:46:09 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 4/7] tcg/sparc: Improve code gen for shifted 32-bit constants Date: Wed, 18 Aug 2021 10:45:59 -1000 Message-Id: <20210818204602.394771-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210818204602.394771-1-richard.henderson@linaro.org> References: <20210818204602.394771-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42d; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x42d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1629320188364100001 Content-Type: text/plain; charset="utf-8" We had code for checking for 13 and 21-bit shifted constants, but we can do better and allow 32-bit shifted constants. This is still 2 insns shorter than the full 64-bit sequence. Signed-off-by: Richard Henderson --- tcg/sparc/tcg-target.c.inc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tcg/sparc/tcg-target.c.inc b/tcg/sparc/tcg-target.c.inc index f11f054df5..16e2258b9b 100644 --- a/tcg/sparc/tcg-target.c.inc +++ b/tcg/sparc/tcg-target.c.inc @@ -456,17 +456,17 @@ static void tcg_out_movi_int(TCGContext *s, TCGType t= ype, TCGReg ret, return; } =20 - /* A 21-bit constant, shifted. */ + /* A 32-bit constant, shifted. */ lsb =3D ctz64(arg); test =3D (tcg_target_long)arg >> lsb; - if (check_fit_tl(test, 13)) { - tcg_out_movi_imm13(s, ret, test); - tcg_out_arithi(s, ret, ret, lsb, SHIFT_SLLX); - return; - } else if (lsb > 10 && test =3D=3D extract64(test, 0, 21)) { + if (lsb > 10 && test =3D=3D extract64(test, 0, 21)) { tcg_out_sethi(s, ret, test << 10); tcg_out_arithi(s, ret, ret, lsb - 10, SHIFT_SLLX); return; + } else if (test =3D=3D (uint32_t)test || test =3D=3D (int32_t)test) { + tcg_out_movi_int(s, TCG_TYPE_I64, ret, test, in_prologue, scratch); + tcg_out_arithi(s, ret, ret, lsb, SHIFT_SLLX); + return; } =20 /* A 64-bit constant decomposed into 2 32-bit pieces. */ --=20 2.25.1 From nobody Mon Feb 9 21:28:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1629319822; cv=none; d=zohomail.com; s=zohoarc; b=V+E5bnJ9jy1s4hndBcfL8BZihI/MWci8TenKfWRgJ2HOF5CJ6upkiiX/wF9yOJ8x7nwtPnEoojbXw9qPPOHSYzu5CtzlWjzRw7T+StwSawwQ6tjUcBXu+JA80fTBpwvtvUEGAusO0cjh4o3jQoza3FIPU649SzVNGBf3Y1KuJSs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629319822; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=eXSlP509FPYxp/SHlpwwNwQWv2WcEvZieYKUWUJBBNw=; b=VCRQH5O62G5J4Hn+D5fMNO528ci0dPACcmunKKFJ1wfhfKRc/yhtYXXPgZgJh3+aLGe+cY1Mfev2t2V0tot03/fSXXIsmNulJ5NZNUjf/lscixtdxp3NcJhJlgBPJYoslQbnOTK2/jlD/gxiZG4YfkXrnb1MIMTHJhmrXFBvmuA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1629319822106964.2671631741863; Wed, 18 Aug 2021 13:50:22 -0700 (PDT) Received: from localhost ([::1]:57688 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mGSVw-0000aJ-VB for importer@patchew.org; Wed, 18 Aug 2021 16:50:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45522) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mGSRw-0000KV-Vo for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:13 -0400 Received: from mail-pg1-x52c.google.com ([2607:f8b0:4864:20::52c]:46822) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mGSRv-00088C-JS for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:12 -0400 Received: by mail-pg1-x52c.google.com with SMTP id k14so3566127pga.13 for ; Wed, 18 Aug 2021 13:46:11 -0700 (PDT) Received: from localhost.localdomain ([173.197.107.15]) by smtp.gmail.com with ESMTPSA id 143sm739815pfz.13.2021.08.18.13.46.09 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Aug 2021 13:46:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=eXSlP509FPYxp/SHlpwwNwQWv2WcEvZieYKUWUJBBNw=; b=gqk9KmG8DO9gT64dLGnYuBjsQrjR/G6QQtpWd86GXL1kWuulL9qdiprQNQA8wG6c68 gtrTIcvthD7z9x7PdabfyYoy588bPkNm34jVZqN99XF6IgjitWDTeJnymiMBT/p8WgEy ikfv+WHVzsqkCs7EEomC5QmwCv8SFJwGFS1F77z2OYLHtFHnqWNoq2orhvKoewzIXWzE yIen9A2aajRfpIzDBh/dBcUOux/PfFjFX5bmqAvVObp2S39iKmYMWLgGXEHxIyFucZEq M9vl0vjb+3dhaxq0g7bwk9QNFQ/i5FK/qzblwMMBYpWadYzqDf3Qb9pXrRiIkyJvlVwc j4aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eXSlP509FPYxp/SHlpwwNwQWv2WcEvZieYKUWUJBBNw=; b=ZpuCVsU+bE/mkaDF77UPp6/j+QZP8khxlcwiGbFW2wO8aq6DRcii1t1nxItSqxvbZZ adKw5HO3t3UjueB4fvGGQgGvceh9aLP6cd5yQ2FqxbeUXB1l5UO+1UxD6i8UWutXd3k6 7HmMYbmJ9dNlDGTaRVoWJdIG64UUClZf7SXlQus8p+SRVzUdJ6z/bJOOOd3VQYwPl8jh NXenKf5sy9KFBVNJDbZfIfgh5QkOVygPQKa/Gi5Qi+lhTEoYe9cZX0zN0i9/nfmtMQi2 DFZNwwcRSTCJ6GEphDiySeU9CeJixQ34fbO8x5Y77iHT6q2fH7pvhVv1gLw0DcfIOuPH OIfQ== X-Gm-Message-State: AOAM532FsBIRvOPZFoHxD2qI74mmrB/bdrfiNXBUdKHOGFDtWT11O4ww F8i8MnRqwcIQNT7rfzGXCV+cLEqz9NsdRA== X-Google-Smtp-Source: ABdhPJws5vu3Cf8u3FOnDK3L0XAV8E+d7v0Vn85kO0aslga2qijXhywKd8iLdbX5yEv2Yq7oq1fAQQ== X-Received: by 2002:a63:a511:: with SMTP id n17mr10620250pgf.156.1629319570355; Wed, 18 Aug 2021 13:46:10 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 5/7] tcg/sparc: Use the constant pool for 64-bit constants Date: Wed, 18 Aug 2021 10:46:00 -1000 Message-Id: <20210818204602.394771-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210818204602.394771-1-richard.henderson@linaro.org> References: <20210818204602.394771-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::52c; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x52c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1629319824386100003 Content-Type: text/plain; charset="utf-8" Signed-off-by: Richard Henderson --- tcg/sparc/tcg-target.c.inc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tcg/sparc/tcg-target.c.inc b/tcg/sparc/tcg-target.c.inc index 16e2258b9b..b64760e736 100644 --- a/tcg/sparc/tcg-target.c.inc +++ b/tcg/sparc/tcg-target.c.inc @@ -332,6 +332,13 @@ static bool patch_reloc(tcg_insn_unit *src_rw, int typ= e, insn &=3D ~INSN_OFF19(-1); insn |=3D INSN_OFF19(pcrel); break; + case R_SPARC_13: + if (!check_fit_ptr(value, 13)) { + return false; + } + insn &=3D ~INSN_IMM13(-1); + insn |=3D INSN_IMM13(value); + break; default: g_assert_not_reached(); } @@ -469,6 +476,14 @@ static void tcg_out_movi_int(TCGContext *s, TCGType ty= pe, TCGReg ret, return; } =20 + /* Use the constant pool, if possible. */ + if (!in_prologue && USE_REG_TB) { + new_pool_label(s, arg, R_SPARC_13, s->code_ptr, + tcg_tbrel_diff(s, NULL)); + tcg_out32(s, LDX | INSN_RD(ret) | INSN_RS1(TCG_REG_TB)); + return; + } + /* A 64-bit constant decomposed into 2 32-bit pieces. */ if (check_fit_i32(lo, 13)) { hi =3D (arg - lo) >> 32; --=20 2.25.1 From nobody Mon Feb 9 21:28:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1629319931; cv=none; d=zohomail.com; s=zohoarc; b=lQsARR/8dfnEE5DB3BxACIWxCVHxtHZDtkNrzawuANNgI6jsABODgppNx2Im7/e3rei8mu74EfWTwg95COBNi7NsbNeYHRJIMxUTsoM24nBDm9FT/OVB7zR444+4JzyxfV+gtRAI6QAK7VylszrqOs6Xes4xDr+IGceoY2xQOyc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629319931; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=JZiqz6o6Xj+jMjnO5DlRRpE4nRwaHpEQrs1cPBmCDrY=; b=bVaHAaAffVX6Lc+2Dba7WvHzm9K+oMTkUXASio/dL/r9VoFrfi9BSWDvzPFZUswxTP82MyBC6QduETqZP+/YVfA+5Wstrwn/qJkWiwIl0wy1LKV913yq+QWYw8pJzstQAdXO1k2CA3RLka9jGRdj/nc9cc1E99frDYi+Ycb0RRU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1629319931216468.4179908902612; Wed, 18 Aug 2021 13:52:11 -0700 (PDT) Received: from localhost ([::1]:35778 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mGSXi-0005Et-6w for importer@patchew.org; Wed, 18 Aug 2021 16:52:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45538) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mGSRy-0000OX-4T for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:14 -0400 Received: from mail-pf1-x42b.google.com ([2607:f8b0:4864:20::42b]:35487) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mGSRw-00089A-GF for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:13 -0400 Received: by mail-pf1-x42b.google.com with SMTP id x16so3411878pfh.2 for ; Wed, 18 Aug 2021 13:46:12 -0700 (PDT) Received: from localhost.localdomain ([173.197.107.15]) by smtp.gmail.com with ESMTPSA id 143sm739815pfz.13.2021.08.18.13.46.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Aug 2021 13:46:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=JZiqz6o6Xj+jMjnO5DlRRpE4nRwaHpEQrs1cPBmCDrY=; b=fRYGHWEH0og0MJvS9rspIAy7W306YUvrBZcSFClsM+tJ1GEvoDK5jEmp5S3a2R8i0J 1449jtYDgoBXa0zXqcUMr+RrQPqj+4lcyd5IHc6H0J4ggPOBZJho29tMpfyzusZv8WhK BJmgcuFNr7HbzFpbxbCtS6SR/We0rDg4jSllwpJLu0OfEim2LUMlxuutQhzolvk402HQ pxHN/iDk0E4I5pOS+mH1wgz80Lm0PofCQ0w3n8t/vZw9hrAI2R4luk3T8/2XWE7FKQ0l LBoKeKGZGF7LaVeCXy6mMSqIez6bX88PaUq7BZHVwOpOb4k3iPQiUANw+3lbLJy3XnJz 4sRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JZiqz6o6Xj+jMjnO5DlRRpE4nRwaHpEQrs1cPBmCDrY=; b=VufCjlHFVynia+bvGNfYFUxcdGFhQuX5Y/KSABza0eOGgEpXf13haC5CGyf0YI1fIA BhB9UasZgnXiq2DT80OwVfJrHIGAdYoPom5qwCGDZqlrS6fXhFNaYzWXAQWrRHgJ3P/N m2pI+S673bjT+oWiAC3TN+Y4oqsF6q4CilDD1ogU0MugIk+FvT7V11/t1/B1+2jLJhKu fX4qffPAxQLpXlt2HlN9hqqxblcMC3gfu27xHPGg1VxA0JRiCvKnu3Wrcf1h9ur+wiT6 N7aPu26pvP9OgYmOmOcurZqVcsVj4lCUuMQnqpQrSn2Fu80L3Aqp8Zr+dHBFhC/tw2HD 9E3Q== X-Gm-Message-State: AOAM532JwmJe6HgmEPx4oMHv6gT3dcQxScQYAR32hOYn18a+07tPG/fK KrNbW2cfOycNmPfkcotP9uzxc+dRMB5KMw== X-Google-Smtp-Source: ABdhPJzDdX+F6+xQlYIZqv0tmVeJvij9rKpeUuWOCRGKVNVeVNpyJVyx5wD/Sz+QlZz2NVKAVjzh8w== X-Received: by 2002:a63:a46:: with SMTP id z6mr10631045pgk.167.1629319571262; Wed, 18 Aug 2021 13:46:11 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 6/7] tcg/sparc: Add tcg_out_jmpl_const for better tail calls Date: Wed, 18 Aug 2021 10:46:01 -1000 Message-Id: <20210818204602.394771-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210818204602.394771-1-richard.henderson@linaro.org> References: <20210818204602.394771-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42b; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x42b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1629319933157100001 Content-Type: text/plain; charset="utf-8" Due to mapping changes, we now rarely place the code_gen_buffer near the main executable. Which means that direct calls will now rarely be in range. So, always use indirect calls for tail calls, which allows us to avoid clobbering %o7, and therefore we need not save and restore it. Signed-off-by: Richard Henderson --- tcg/sparc/tcg-target.c.inc | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/tcg/sparc/tcg-target.c.inc b/tcg/sparc/tcg-target.c.inc index b64760e736..8c1a0277d5 100644 --- a/tcg/sparc/tcg-target.c.inc +++ b/tcg/sparc/tcg-target.c.inc @@ -845,6 +845,19 @@ static void tcg_out_addsub2_i64(TCGContext *s, TCGReg = rl, TCGReg rh, tcg_out_mov(s, TCG_TYPE_I64, rl, tmp); } =20 +static void tcg_out_jmpl_const(TCGContext *s, const tcg_insn_unit *dest, + bool in_prologue, bool tail_call) +{ + uintptr_t desti =3D (uintptr_t)dest; + + /* Be careful not to clobber %o7 for a tail call. */ + tcg_out_movi_int(s, TCG_TYPE_PTR, TCG_REG_T1, + desti & ~0xfff, in_prologue, + tail_call ? TCG_REG_G2 : TCG_REG_O7); + tcg_out_arithi(s, tail_call ? TCG_REG_G0 : TCG_REG_O7, + TCG_REG_T1, desti & 0xfff, JMPL); +} + static void tcg_out_call_nodelay(TCGContext *s, const tcg_insn_unit *dest, bool in_prologue) { @@ -853,10 +866,7 @@ static void tcg_out_call_nodelay(TCGContext *s, const = tcg_insn_unit *dest, if (disp =3D=3D (int32_t)disp) { tcg_out32(s, CALL | (uint32_t)disp >> 2); } else { - uintptr_t desti =3D (uintptr_t)dest; - tcg_out_movi_int(s, TCG_TYPE_PTR, TCG_REG_T1, - desti & ~0xfff, in_prologue, TCG_REG_O7); - tcg_out_arithi(s, TCG_REG_O7, TCG_REG_T1, desti & 0xfff, JMPL); + tcg_out_jmpl_const(s, dest, in_prologue, false); } } =20 @@ -947,11 +957,10 @@ static void build_trampolines(TCGContext *s) =20 /* Set the retaddr operand. */ tcg_out_mov(s, TCG_TYPE_PTR, ra, TCG_REG_O7); - /* Set the env operand. */ - tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O0, TCG_AREG0); /* Tail call. */ - tcg_out_call_nodelay(s, qemu_ld_helpers[i], true); - tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O7, ra); + tcg_out_jmpl_const(s, qemu_ld_helpers[i], true, true); + /* delay slot -- set the env argument */ + tcg_out_mov_delay(s, TCG_REG_O0, TCG_AREG0); } =20 for (i =3D 0; i < ARRAY_SIZE(qemu_st_helpers); ++i) { @@ -993,14 +1002,14 @@ static void build_trampolines(TCGContext *s) if (ra >=3D TCG_REG_O6) { tcg_out_st(s, TCG_TYPE_PTR, TCG_REG_O7, TCG_REG_CALL_STACK, TCG_TARGET_CALL_STACK_OFFSET); - ra =3D TCG_REG_G1; + } else { + tcg_out_mov(s, TCG_TYPE_PTR, ra, TCG_REG_O7); } - tcg_out_mov(s, TCG_TYPE_PTR, ra, TCG_REG_O7); - /* Set the env operand. */ - tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O0, TCG_AREG0); + /* Tail call. */ - tcg_out_call_nodelay(s, qemu_st_helpers[i], true); - tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O7, ra); + tcg_out_jmpl_const(s, qemu_st_helpers[i], true, true); + /* delay slot -- set the env argument */ + tcg_out_mov_delay(s, TCG_REG_O0, TCG_AREG0); } } #endif --=20 2.25.1 From nobody Mon Feb 9 21:28:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1629320044; cv=none; d=zohomail.com; s=zohoarc; b=JdFuTtYwjhChMLSv8UWFT9D19f4s2sREZlpzgPm4IRMKKX44wFV2YBRFsCp2phSXZG7+fEGL9wfEyJ1n6KPt2T3uOQUznu8xFWsO57X8keBbbyziE/kga8gzhR7h2a1r/oL7pa/gcXq3ZR3dO/vJUNfMmHo+WURb8K1X0UcEOZ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629320044; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Geazi5Px1rFCbu/BjMaZBQQnfa1xGcAi/sE9A1f2dpE=; b=lNVi1gv1IypoqhVYYnOtU6Td3YgeE5NHvlyp2IO7M7NZ15NuPtGfFsVghDO8/Skz+sbS6619dfBMo5zWLcAI2Q4TdLTn/liS6ytUfpmhbreJCX+XBfBimnGng3dNRdy5QFUKWLW7a4HerqdZB0+70G5XGYGLX9HZ/az3M7mai0I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 162932004460985.27009879764444; Wed, 18 Aug 2021 13:54:04 -0700 (PDT) Received: from localhost ([::1]:40070 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mGSZX-0008By-HW for importer@patchew.org; Wed, 18 Aug 2021 16:54:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45564) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mGSS2-0000aA-DK for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:18 -0400 Received: from mail-pg1-x533.google.com ([2607:f8b0:4864:20::533]:46829) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mGSRx-0008AT-RU for qemu-devel@nongnu.org; Wed, 18 Aug 2021 16:46:18 -0400 Received: by mail-pg1-x533.google.com with SMTP id k14so3566249pga.13 for ; Wed, 18 Aug 2021 13:46:13 -0700 (PDT) Received: from localhost.localdomain ([173.197.107.15]) by smtp.gmail.com with ESMTPSA id 143sm739815pfz.13.2021.08.18.13.46.11 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Aug 2021 13:46:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Geazi5Px1rFCbu/BjMaZBQQnfa1xGcAi/sE9A1f2dpE=; b=BRxQNd6eLCQxOLrNNPaMqMXfYYcXYjjaXT8TGYtJF11GvyV6rQ1IMndwwh5XWC9/F0 Ex4xr4u+vKvPOZBZ+hW7IgTxWOLxjy8vGVOsopEyiB+K2vCt94TGrL+uFgtNZ3Mw4pT7 w2GeohFK8+QwqWeIjFYil0q7i+p7NAyykE3exz5rb/ZvURdetDnIyhTFWRC8Ohjpafcg 6qhKR8bb/sNwEIFpZW6ngP28RLJwmcGZLxrWX240z5xzjeJ0mWq320cW1Rf3KVKSGojm KmMd6qexDdNWoQ9vYbayd+DlSmvrd8BJvvuluXLBUfxI0aWlCr8pM/pvDqrXWUvUE6/2 sYfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Geazi5Px1rFCbu/BjMaZBQQnfa1xGcAi/sE9A1f2dpE=; b=onsprZxSkauOclrXshy+tXRuvBt8vijqep03Q1r4A+52tOvJm49hgwL1X6SA5QKFca 6SgSYUJQPyOh5/DkOfwiYPPCc6sTsuFAO1vvyPqPJgxLZWZjCj7WAJm8zSPS8vyVwfiI gm8BHFhFkPc44LvJkX+2hAyJJSPThtogjB3WZW0EF/VXmpW3P6UOc2URDrsVwLT65+Lx Qs27zc3kBfOG2piLGXoJPF9ZneSok0QxXdVAHD7nR71wsHL5j3OUzBhFG0vRA0r/giCu 2IXZupgE/B98b7wRrjb5aOVhBNBqfaT4qQzQXUqaHI5yKdzyHq4gRODPo3S55Nm1aO00 NUTg== X-Gm-Message-State: AOAM53328jHGB1Jt/UmvHCApTwm+gwLO0itwYptulGn7a24AOTkJ4K3w LTcbGbMUoJES2zvaaipHVj1KKH8K89DcCQ== X-Google-Smtp-Source: ABdhPJyLax9onAvnVuYCGUtBlTgVw4JBaWvuXwd6fl9aAdCPgg3iEN2SnPvi1bynA7wDgNoc4NImZA== X-Received: by 2002:a65:5b86:: with SMTP id i6mr10796135pgr.180.1629319572466; Wed, 18 Aug 2021 13:46:12 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 7/7] tcg/sparc: Support unaligned access for user-only Date: Wed, 18 Aug 2021 10:46:02 -1000 Message-Id: <20210818204602.394771-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210818204602.394771-1-richard.henderson@linaro.org> References: <20210818204602.394771-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::533; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x533.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1629320044995100001 Content-Type: text/plain; charset="utf-8" This is kinda sorta the opposite of the other tcg hosts, where we get (normal) alignment checks for free with host SIGBUS and need to add code to support unaligned accesses. This inline code expansion is somewhat large, but it takes quite a few instructions to make a function call to a helper anyway. Signed-off-by: Richard Henderson --- tcg/sparc/tcg-target.c.inc | 367 ++++++++++++++++++++++++++++++++++++- 1 file changed, 358 insertions(+), 9 deletions(-) diff --git a/tcg/sparc/tcg-target.c.inc b/tcg/sparc/tcg-target.c.inc index 8c1a0277d5..40cf329b45 100644 --- a/tcg/sparc/tcg-target.c.inc +++ b/tcg/sparc/tcg-target.c.inc @@ -211,6 +211,7 @@ static const int tcg_target_call_oarg_regs[] =3D { #define ARITH_ADD (INSN_OP(2) | INSN_OP3(0x00)) #define ARITH_ADDCC (INSN_OP(2) | INSN_OP3(0x10)) #define ARITH_AND (INSN_OP(2) | INSN_OP3(0x01)) +#define ARITH_ANDCC (INSN_OP(2) | INSN_OP3(0x11)) #define ARITH_ANDN (INSN_OP(2) | INSN_OP3(0x05)) #define ARITH_OR (INSN_OP(2) | INSN_OP3(0x02)) #define ARITH_ORCC (INSN_OP(2) | INSN_OP3(0x12)) @@ -997,7 +998,7 @@ static void build_trampolines(TCGContext *s) /* Skip the oi argument. */ ra +=3D 1; } - =20 + /* Set the retaddr operand. */ if (ra >=3D TCG_REG_O6) { tcg_out_st(s, TCG_TYPE_PTR, TCG_REG_O7, TCG_REG_CALL_STACK, @@ -1012,6 +1013,40 @@ static void build_trampolines(TCGContext *s) tcg_out_mov_delay(s, TCG_REG_O0, TCG_AREG0); } } +#else +static const tcg_insn_unit *qemu_unalign_ld_trampoline; +static const tcg_insn_unit *qemu_unalign_st_trampoline; + +static void build_trampolines(TCGContext *s) +{ + for (int ld =3D 0; ld < 2; ++ld) { + void *helper; + + while ((uintptr_t)s->code_ptr & 15) { + tcg_out_nop(s); + } + + if (ld) { + helper =3D helper_unaligned_ld; + qemu_unalign_ld_trampoline =3D tcg_splitwx_to_rx(s->code_ptr); + } else { + helper =3D helper_unaligned_st; + qemu_unalign_st_trampoline =3D tcg_splitwx_to_rx(s->code_ptr); + } + + if (!SPARC64 && TARGET_LONG_BITS =3D=3D 64) { + /* Install the high part of the address. */ + tcg_out_arithi(s, TCG_REG_O1, TCG_REG_O2, 32, SHIFT_SRLX); + } + /* Set the env operand. */ + tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O0, TCG_AREG0); + + /* Tail call. */ + tcg_out_jmpl_const(s, helper, true, true); + /* delay slot -- set the env argument */ + tcg_out_mov_delay(s, TCG_REG_O0, TCG_AREG0); + } +} #endif =20 /* Generate global QEMU prologue and epilogue code */ @@ -1062,9 +1097,7 @@ static void tcg_target_qemu_prologue(TCGContext *s) /* delay slot */ tcg_out_movi_imm13(s, TCG_REG_O0, 0); =20 -#ifdef CONFIG_SOFTMMU build_trampolines(s); -#endif } =20 static void tcg_out_nop_fill(tcg_insn_unit *p, int count) @@ -1149,18 +1182,22 @@ static TCGReg tcg_out_tlb_load(TCGContext *s, TCGRe= g addr, int mem_index, static const int qemu_ld_opc[(MO_SSIZE | MO_BSWAP) + 1] =3D { [MO_UB] =3D LDUB, [MO_SB] =3D LDSB, + [MO_UB | MO_LE] =3D LDUB, + [MO_SB | MO_LE] =3D LDSB, =20 [MO_BEUW] =3D LDUH, [MO_BESW] =3D LDSH, [MO_BEUL] =3D LDUW, [MO_BESL] =3D LDSW, [MO_BEQ] =3D LDX, + [MO_BEQ | MO_SIGN] =3D LDX, =20 [MO_LEUW] =3D LDUH_LE, [MO_LESW] =3D LDSH_LE, [MO_LEUL] =3D LDUW_LE, [MO_LESL] =3D LDSW_LE, [MO_LEQ] =3D LDX_LE, + [MO_LEQ | MO_SIGN] =3D LDX_LE, }; =20 static const int qemu_st_opc[(MO_SIZE | MO_BSWAP) + 1] =3D { @@ -1179,11 +1216,12 @@ static void tcg_out_qemu_ld(TCGContext *s, TCGReg d= ata, TCGReg addr, MemOpIdx oi, bool is_64) { MemOp memop =3D get_memop(oi); + tcg_insn_unit *label_ptr; + #ifdef CONFIG_SOFTMMU unsigned memi =3D get_mmuidx(oi); TCGReg addrz, param; const tcg_insn_unit *func; - tcg_insn_unit *label_ptr; =20 addrz =3D tcg_out_tlb_load(s, addr, memi, memop, offsetof(CPUTLBEntry, addr_read)); @@ -1247,13 +1285,247 @@ static void tcg_out_qemu_ld(TCGContext *s, TCGReg = data, TCGReg addr, =20 *label_ptr |=3D INSN_OFF19(tcg_ptr_byte_diff(s->code_ptr, label_ptr)); #else + TCGReg index =3D (guest_base ? TCG_GUEST_BASE_REG : TCG_REG_G0); + unsigned a_bits =3D get_alignment_bits(memop); + unsigned s_bits =3D memop & MO_SIZE; + unsigned t_bits; + TCGReg orig_addr =3D addr; + if (SPARC64 && TARGET_LONG_BITS =3D=3D 32) { tcg_out_arithi(s, TCG_REG_T1, addr, 0, SHIFT_SRL); addr =3D TCG_REG_T1; } - tcg_out_ldst_rr(s, data, addr, - (guest_base ? TCG_GUEST_BASE_REG : TCG_REG_G0), + + /* + * Normal case: alignment equal to access size. + */ + if (a_bits =3D=3D s_bits) { + tcg_out_ldst_rr(s, data, addr, index, + qemu_ld_opc[memop & (MO_BSWAP | MO_SSIZE)]); + return; + } + + /* + * Overalignment: Use a larger load to enforce alignment then + * extract the required value. + */ + switch ((unsigned)memop) { + case MO_UB | MO_ALIGN_2: + case MO_UB | MO_ALIGN_4: + case MO_UB | MO_ALIGN_8: + tcg_out_ldst_rr(s, data, addr, index, qemu_ld_opc[a_bits | MO_LE]); + tcg_out_arithi(s, data, data, 0xff, ARITH_AND); + return; + + case MO_SB | MO_ALIGN_2: + case MO_SB | MO_ALIGN_4: + case MO_SB | MO_ALIGN_8: + case MO_BESW | MO_ALIGN_4: + case MO_BESW | MO_ALIGN_8: + case MO_BESL | MO_ALIGN_8: + /* Load into T1 because data may not be a 64-bit register. */ + tcg_out_ldst_rr(s, TCG_REG_T1, addr, index, + qemu_ld_opc[a_bits | MO_BE | MO_SIGN]); + tcg_out_arithi(s, data, TCG_REG_T1, + 8 << (a_bits - s_bits), SHIFT_SRAX); + return; + + case MO_BEUW | MO_ALIGN_4: + case MO_BEUW | MO_ALIGN_8: + case MO_BEUL | MO_ALIGN_8: + /* Load into T1 because data may not be a 64-bit register. */ + tcg_out_ldst_rr(s, TCG_REG_T1, addr, index, + qemu_ld_opc[a_bits | MO_BE]); + tcg_out_arithi(s, data, TCG_REG_T1, + 8 << (a_bits - s_bits), SHIFT_SRLX); + return; + + case MO_LEUW | MO_ALIGN_4: + case MO_LESW | MO_ALIGN_4: + case MO_LEUW | MO_ALIGN_8: + case MO_LESW | MO_ALIGN_8: + tcg_out_ldst_rr(s, data, addr, index, qemu_ld_opc[a_bits | MO_LE]); + tcg_out_arithi(s, data, data, 16, SHIFT_SLL); + tcg_out_arithi(s, data, data, 16, + memop & MO_SIGN ? SHIFT_SRA : SHIFT_SRL); + return; + + case MO_LEUL | MO_ALIGN_8: + case MO_LESL | MO_ALIGN_8: + tcg_out_ldst_rr(s, data, addr, index, LDX_LE); + if (is_64) { + tcg_out_arithi(s, data, data, 0, + memop & MO_SIGN ? SHIFT_SRA : SHIFT_SRL); + } + return; + } + + /* + * Test for at least natural alignment, and assume most accesses + * will be aligned -- perform a straight load in the delay slot. + * This is required to preserve atomicity for aligned accesses. + */ + t_bits =3D MAX(a_bits, s_bits); + tcg_debug_assert(t_bits < 13); + tcg_out_arithi(s, TCG_REG_G0, addr, (1u << t_bits) - 1, ARITH_ANDCC); + + /* beq,a,pt %icc, label */ + label_ptr =3D s->code_ptr; + tcg_out_bpcc0(s, COND_E, BPCC_A | BPCC_PT | BPCC_ICC, 0); + /* delay slot */ + tcg_out_ldst_rr(s, data, addr, index, qemu_ld_opc[memop & (MO_BSWAP | MO_SSIZE)]); + + /* + * Overalignment: When we're asking for really large alignment, + * the actual access is always done above and all we need to do + * here is invoke the handler for SIGBUS. + */ + if (a_bits >=3D s_bits) { + TCGReg arg_low =3D TCG_REG_O1 + (!SPARC64 && TARGET_LONG_BITS =3D= =3D 64); + tcg_out_call_nodelay(s, qemu_unalign_ld_trampoline, false); + /* delay slot -- move to low part of argument reg */ + tcg_out_mov_delay(s, arg_low, addr); + goto done; + } + + /* + * Underalignment: use multiple loads to perform the operation. + * + * Force full address into T1 early; avoids problems with + * overlap between @addr and @data. + */ + tcg_out_arith(s, TCG_REG_T1, addr, index, ARITH_ADD); + + switch ((unsigned)memop) { + case MO_BEUW | MO_UNALN: + case MO_BESW | MO_UNALN: + case MO_BEUL | MO_ALIGN_2: + case MO_BESL | MO_ALIGN_2: + case MO_BEQ | MO_ALIGN_4: + /* Two loads: shift and combine. */ + tcg_out_ldst(s, TCG_REG_T2, TCG_REG_T1, 0, + qemu_ld_opc[a_bits | MO_BE | (memop & MO_SIGN)]); + tcg_out_ldst(s, data, TCG_REG_T1, 1 << a_bits, + qemu_ld_opc[a_bits | MO_BE]); + tcg_out_arithi(s, TCG_REG_T2, TCG_REG_T2, 8 << a_bits, SHIFT_SLLX); + tcg_out_arith(s, data, data, TCG_REG_T2, ARITH_OR); + break; + + case MO_LEUW | MO_UNALN: + case MO_LESW | MO_UNALN: + case MO_LEUL | MO_ALIGN_2: + case MO_LESL | MO_ALIGN_2: + case MO_LEQ | MO_ALIGN_4: + /* Similarly, with shifts adjusted for little-endian. */ + tcg_out_ldst_rr(s, TCG_REG_T2, TCG_REG_T1, TCG_REG_G0, + qemu_ld_opc[a_bits | MO_LE]); + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 1 << a_bits, ARITH_ADD); + tcg_out_ldst_rr(s, data, TCG_REG_T1, TCG_REG_G0, + qemu_ld_opc[a_bits | MO_LE | (memop & MO_SIGN)]); + tcg_out_arithi(s, data, data, 8 << a_bits, SHIFT_SLLX); + tcg_out_arith(s, data, data, TCG_REG_T2, ARITH_OR); + break; + + case MO_BEUL | MO_UNALN: + case MO_BESL | MO_UNALN: + /* + * Naively, this would require 4 loads, 3 shifts, 3 ors. + * Use two 32-bit aligned loads, combine, and extract. + */ + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 3, ARITH_ANDN); + tcg_out_ldst(s, TCG_REG_T2, TCG_REG_T1, 0, LDUW); + tcg_out_ldst(s, TCG_REG_T1, TCG_REG_T1, 4, LDUW); + tcg_out_arithi(s, TCG_REG_T2, TCG_REG_T2, 32, SHIFT_SLLX); + tcg_out_arith(s, TCG_REG_T1, TCG_REG_T1, TCG_REG_T2, ARITH_OR); + tcg_out_arithi(s, TCG_REG_T2, orig_addr, 3, ARITH_AND); + tcg_out_arithi(s, TCG_REG_T2, TCG_REG_T2, 3, SHIFT_SLL); + tcg_out_arith(s, TCG_REG_T1, TCG_REG_T1, TCG_REG_T2, SHIFT_SLLX); + tcg_out_arithi(s, data, TCG_REG_T1, 32, + memop & MO_SIGN ? SHIFT_SRAX : SHIFT_SRLX); + break; + + case MO_LEUL | MO_UNALN: + case MO_LESL | MO_UNALN: + /* Similarly, with shifts adjusted for little-endian. */ + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 3, ARITH_ANDN); + tcg_out_ldst_rr(s, TCG_REG_T2, TCG_REG_T1, TCG_REG_G0, LDUW_LE); + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 4, ARITH_ADD); + tcg_out_ldst_rr(s, TCG_REG_T1, TCG_REG_T1, TCG_REG_G0, LDUW_LE); + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 32, SHIFT_SLLX); + tcg_out_arith(s, TCG_REG_T1, TCG_REG_T1, TCG_REG_T2, ARITH_OR); + tcg_out_arithi(s, TCG_REG_T2, orig_addr, 3, ARITH_AND); + tcg_out_arithi(s, TCG_REG_T2, TCG_REG_T2, 3, SHIFT_SLL); + tcg_out_arith(s, data, TCG_REG_T1, TCG_REG_T2, SHIFT_SRLX); + if (is_64) { + tcg_out_arithi(s, data, data, 0, + memop & MO_SIGN ? SHIFT_SRA : SHIFT_SRL); + } + break; + + case MO_BEQ | MO_UNALN: + /* Similarly for 64-bit. */ + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 7, ARITH_ANDN); + tcg_out_ldst(s, TCG_REG_T2, TCG_REG_T1, 0, LDX); + tcg_out_ldst(s, TCG_REG_T1, TCG_REG_T1, 8, LDX); + tcg_out_arithi(s, data, orig_addr, 7, ARITH_AND); + tcg_out_arithi(s, data, data, 3, SHIFT_SLL); + tcg_out_arith(s, TCG_REG_T2, TCG_REG_T2, data, SHIFT_SLLX); + tcg_out_arithi(s, data, data, 64, ARITH_SUB); + tcg_out_arith(s, TCG_REG_T1, TCG_REG_T1, data, SHIFT_SRLX); + tcg_out_arith(s, data, TCG_REG_T1, TCG_REG_T2, ARITH_OR); + break; + + case MO_LEQ | MO_UNALN: + /* Similarly for little-endian. */ + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 7, ARITH_ANDN); + tcg_out_ldst_rr(s, TCG_REG_T2, TCG_REG_T1, TCG_REG_G0, LDX_LE); + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 8, ARITH_ADD); + tcg_out_ldst_rr(s, TCG_REG_T1, TCG_REG_T1, TCG_REG_G0, LDX_LE); + tcg_out_arithi(s, data, orig_addr, 7, ARITH_AND); + tcg_out_arithi(s, data, data, 3, SHIFT_SLL); + tcg_out_arith(s, TCG_REG_T2, TCG_REG_T2, data, SHIFT_SRLX); + tcg_out_arithi(s, data, data, 64, ARITH_SUB); + tcg_out_arith(s, TCG_REG_T1, TCG_REG_T1, data, SHIFT_SLLX); + tcg_out_arith(s, data, TCG_REG_T1, TCG_REG_T2, ARITH_OR); + break; + + case MO_BEQ | MO_ALIGN_2: + /* + * An extra test to verify alignment 2 is 5 insns, which + * is more than we would save by using the slightly smaller + * unaligned sequence above. + */ + tcg_out_ldst(s, data, TCG_REG_T1, 0, LDUH); + for (int i =3D 2; i < 8; i +=3D 2) { + tcg_out_ldst(s, TCG_REG_T2, TCG_REG_T1, i, LDUW); + tcg_out_arithi(s, data, data, 16, SHIFT_SLLX); + tcg_out_arith(s, data, data, TCG_REG_T2, ARITH_OR); + } + break; + + case MO_LEQ | MO_ALIGN_2: + /* + * Similarly for little-endian + * Note that STHA w/ immediate asi, like LDUW_LE, must be used + * with rr addressing. Be careful not to clobber inputs, and + * that @addr may already be T2. + */ + tcg_out_ldst_rr(s, data, TCG_REG_T1, TCG_REG_G0, LDUH_LE); + for (int i =3D 2; i < 8; i +=3D 2) { + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, 2, ARITH_ADD); + tcg_out_ldst_rr(s, TCG_REG_T2, TCG_REG_T1, TCG_REG_G0, LDUW_LE= ); + tcg_out_arithi(s, TCG_REG_T2, TCG_REG_T2, i * 8, SHIFT_SLLX); + tcg_out_arith(s, data, data, TCG_REG_T2, ARITH_OR); + } + break; + + default: + g_assert_not_reached(); + } + + done: + *label_ptr |=3D INSN_OFF19(tcg_ptr_byte_diff(s->code_ptr, label_ptr)); #endif /* CONFIG_SOFTMMU */ } =20 @@ -1261,11 +1533,12 @@ static void tcg_out_qemu_st(TCGContext *s, TCGReg d= ata, TCGReg addr, MemOpIdx oi) { MemOp memop =3D get_memop(oi); + tcg_insn_unit *label_ptr; + #ifdef CONFIG_SOFTMMU unsigned memi =3D get_mmuidx(oi); TCGReg addrz, param; const tcg_insn_unit *func; - tcg_insn_unit *label_ptr; =20 addrz =3D tcg_out_tlb_load(s, addr, memi, memop, offsetof(CPUTLBEntry, addr_write)); @@ -1302,13 +1575,89 @@ static void tcg_out_qemu_st(TCGContext *s, TCGReg d= ata, TCGReg addr, =20 *label_ptr |=3D INSN_OFF19(tcg_ptr_byte_diff(s->code_ptr, label_ptr)); #else + TCGReg index =3D (guest_base ? TCG_GUEST_BASE_REG : TCG_REG_G0); + unsigned a_bits =3D get_alignment_bits(memop); + unsigned s_bits =3D memop & MO_SIZE; + unsigned t_bits; + if (SPARC64 && TARGET_LONG_BITS =3D=3D 32) { tcg_out_arithi(s, TCG_REG_T1, addr, 0, SHIFT_SRL); addr =3D TCG_REG_T1; } - tcg_out_ldst_rr(s, data, addr, - (guest_base ? TCG_GUEST_BASE_REG : TCG_REG_G0), + + /* + * Normal case: alignment equal to access size. + */ + if (a_bits =3D=3D s_bits) { + tcg_out_ldst_rr(s, data, addr, index, + qemu_st_opc[memop & (MO_BSWAP | MO_SIZE)]); + return; + } + + /* + * Test for at least natural alignment, and assume most accesses + * will be aligned -- perform a straight store in the delay slot. + * This is required to preserve atomicity for aligned accesses. + */ + t_bits =3D MAX(a_bits, s_bits); + tcg_debug_assert(t_bits < 13); + tcg_out_arithi(s, TCG_REG_G0, addr, (1u << t_bits) - 1, ARITH_ANDCC); + + /* beq,a,pt %icc, label */ + label_ptr =3D s->code_ptr; + tcg_out_bpcc0(s, COND_E, BPCC_A | BPCC_PT | BPCC_ICC, 0); + /* delay slot */ + tcg_out_ldst_rr(s, data, addr, index, qemu_st_opc[memop & (MO_BSWAP | MO_SIZE)]); + + if (a_bits >=3D s_bits) { + TCGReg arg_low =3D TCG_REG_O1 + (!SPARC64 && TARGET_LONG_BITS =3D= =3D 64); + /* Overalignment: only need to call helper for SIGBUS. */ + tcg_out_call_nodelay(s, qemu_unalign_st_trampoline, false); + /* delay slot -- move to low part of argument reg */ + tcg_out_mov_delay(s, arg_low, addr); + } else { + /* Underalignment: store by pieces of minimum alignment. */ + int st_opc, a_size, s_size, i; + + /* + * Force full address into T1 early; avoids problems with + * overlap between @addr and @data. + */ + tcg_out_arith(s, TCG_REG_T1, addr, index, ARITH_ADD); + + a_size =3D 1 << a_bits; + s_size =3D 1 << (memop & MO_SIZE); + if ((memop & MO_BSWAP) =3D=3D MO_BE) { + st_opc =3D qemu_st_opc[a_bits + MO_BE]; + for (i =3D 0; i < s_size; i +=3D a_size) { + TCGReg d =3D data; + int shift =3D (s_size - a_size - i) * 8; + if (shift) { + d =3D TCG_REG_T2; + tcg_out_arithi(s, d, data, shift, SHIFT_SRLX); + } + tcg_out_ldst(s, d, TCG_REG_T1, i, st_opc); + } + } else if (a_bits =3D=3D 0) { + tcg_out_ldst(s, data, TCG_REG_T1, 0, STB); + for (i =3D 1; i < s_size; i++) { + tcg_out_arithi(s, TCG_REG_T2, data, i * 8, SHIFT_SRLX); + tcg_out_ldst(s, TCG_REG_T2, TCG_REG_T1, i, STB); + } + } else { + /* Note that ST*A with immediate asi must use indexed address.= */ + st_opc =3D qemu_st_opc[a_bits + MO_LE]; + tcg_out_ldst_rr(s, data, TCG_REG_T1, TCG_REG_G0, st_opc); + for (i =3D a_size; i < s_size; i +=3D a_size) { + tcg_out_arithi(s, TCG_REG_T2, data, i * 8, SHIFT_SRLX); + tcg_out_arithi(s, TCG_REG_T1, TCG_REG_T1, a_size, ARITH_AD= D); + tcg_out_ldst_rr(s, TCG_REG_T2, TCG_REG_T1, TCG_REG_G0, st_= opc); + } + } + } + + *label_ptr |=3D INSN_OFF19(tcg_ptr_byte_diff(s->code_ptr, label_ptr)); #endif /* CONFIG_SOFTMMU */ } =20 --=20 2.25.1