From nobody Thu Aug 27 01:43:24 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=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1785938587; cv=none; d=zohomail.com; s=zohoarc; b=RKBZTkQWr75na7wu3/ez+ggKD9H2aXtUNVc7QixdDrNbmgMT9ErDEmL2BmeLTP2YFjtrjaMwfswwTb1MOJQ3c9kmpyzSDr1xFTN5huAzklOx3PGp2jeJ8Wb5pdqmTk5wPRiQhVxRxK6Hx8kywhjOwU7pm0DscpMzaxx1lGIEZlI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785938587; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=aL2QtzIWBaHonagOtdqhvKcmA8Zi740kaUnBhcdlcfY=; b=XpPJzVXpyTaRB53rxysCxyN0XoiYOA9BRmX0E7YUwoGV1Pk+ZejUHay4IA8DiTrepPL3/bDqRgaPIaRNh7IX1oxshDZvJ5Z3TnD25vgLH8qI70/+iGmDTc9poPTL6VgSFI+f+aJ4kYXUjE1YA9l4uxonvgqvU9CfZFUOZIYxBGQ= 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=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785938587902196.77342170858856; Wed, 5 Aug 2026 07:03:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wrcCH-00058u-IX; Wed, 05 Aug 2026 10:02:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wrcCE-00058O-2V for qemu-devel@nongnu.org; Wed, 05 Aug 2026 10:02:14 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wrcCB-0002cx-PY for qemu-devel@nongnu.org; Wed, 05 Aug 2026 10:02:13 -0400 Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 675BvSRU2823500 for ; Wed, 5 Aug 2026 14:02:08 GMT Received: from mail-yw1-f199.google.com (mail-yw1-f199.google.com [209.85.128.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fv2c0958h-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 05 Aug 2026 14:02:07 +0000 (GMT) Received: by mail-yw1-f199.google.com with SMTP id 00721157ae682-81e6fce9ed7so18907187b3.3 for ; Wed, 05 Aug 2026 07:02:07 -0700 (PDT) Received: from hu-bcain-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 00721157ae682-820134cadb4sm20828947b3.44.2026.08.05.07.02.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Aug 2026 07:02:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to; s=qcppdkim1; bh=aL2QtzIWBaHonagOtdqhvK cmA8Zi740kaUnBhcdlcfY=; b=Dz0ZvzNPkWOGzqSbF5trWdAEuBOpQUlqicMR/O Y9NkrzA1ZbSxBwzJHpLP1roqBFhNqNIPlw+Ho8oZ3zHzpC9eaJmaGYWjLWk+EW4B qEtl/QjOHNN5+uj9up0YW9/U2osw1RiGnQylOhKLts1DRAhKBmyC9L3Tz6G41sa/ BERN3oLuu4Gm86C/eN7fONIDLMgY2XPz7WfanaHWp73tPLb9nWoj9B2cjvcwk9Lz yamH3FrkMYwJ5GVtd5fvjHZxikGfq72fJWgvqEaW2cP0KVYt9UbmshS4JPbe0VLN +PqOZjst8ROD/lwa2B4xepgdbuK6VgT3fxPcVIz7D1byLREg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1785938527; x=1786543327; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:message-id:date :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to :content-type; bh=aL2QtzIWBaHonagOtdqhvKcmA8Zi740kaUnBhcdlcfY=; b=ftgVpdDUk9XCMD0zlRxBHDM8IIV4wL2q/vjMCvuE8VZt6MxX0Kg8Q+AC2ja+x/Odo3 dwLRWR8M6efIHL3PJbCcHFp2+GjYZqjr0Ghc49uOWcKdUrx7MspDt9FuZGFzluj3KKhy szzNt7AToHYTg1PkVvouCqZpSU3e43QGsXLG8tBReHeV9T8kv9sSBmyYvRLGPR3mkP1k Las3C0uUkZy/dU+GF95sO3kmMRwr+YRqehaD6s1uGoLhPcboHUj5ctjYNCzmry7eRrR6 2LZlTqeeedXIlFBKF9bp9m9B1rU6DTQt5A7Kmqqsg6fuJWVALcV244LWWRidlfMEyg8U h4ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785938527; x=1786543327; h=content-transfer-encoding:content-type:mime-version:message-id:date :subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=aL2QtzIWBaHonagOtdqhvKcmA8Zi740kaUnBhcdlcfY=; b=JwPas0O/hs1qsYURn+FYTrHIoKCQ6Pk/PdWAqRApgOyk6HkKGVcdHa3VH2mh/UPDwe 6+xlyRCAHDcwBC6QnMqIQsUyKTEZOiLJZIgkVShckcg+8lo9/oRtHn5ruu/n7m2ttI8P PpsLy3Ke738EPO5e911tUP4roWMsoLBeGLXff04qhMj0OHO0Ty5WDzr2GXqpRZMWaPZo BxWb1HM77blALV7CZeJPW61rHu+3qpEpCEm9lTaIexJkPCupycDB7pdsMWBR1Gax6cBO EbIJF8yLYpov9kC/NSwsFf/DbwyF76eT4IUg3mitR8HmP0enkFQBC0M+6/fXTLc+34LN 4AVA== X-Gm-Message-State: AOJu0Ywo9pQl4912hGM2t4bmqp5Gp6JfD/VWvZXAsfrLb/l/j5l5dpfz w6FJx42Gpk4zt1e+JahPGBYE+w6uHec0ck8R3v6hP7xZxEEykuEPhXTkHkZ9NS/Hz+g85aRkRz2 9dXZ/yTyBY6cN+V4YAr/8qdE1yPHnMWgIKdIbxqzCZBLyH/MYGnnjfd3zoNtMyCIhHw== X-Gm-Gg: AR+sD13onyeuuWkcJbBvD13b4u8tOrtTFOt6JK2n3ldESP6Abgxu85yB+T2SxLVcdNC 1W25hn6q1Y5J6377HoUgQ1gJRxLlveMJv3OK97CsWCYqHCZEDv8L8YH00eCs8Unqz4slFzAw0bo fUUFjnJa78g1yF0gkr3IfpDR6d36rhYiWMxh6S0oWotAgs0wIcjo1pvr7iWgTTmvKhSDtEMhrLS F5bLsgj5WJgUp1hanY/6SfIqzXjQwjjyx69kHRQNlrqPnfMcHo7w0lzNdBkQs0JT6VtJsCTDmo5 1JTiNaLVvqap9dy9VmdELYXxiAvh6Ew9sBU0C6RjjpkJOT+hCulyhsDblaphaFlnrO0/VuXPAZ/ 2QVnlAuoPZvsbayRYQzlEzMkSJ0yIcjzA0fTUsO8KIjcy/+y5 X-Received: by 2002:a05:690c:4:b0:81f:2403:9e70 with SMTP id 00721157ae682-82022326055mr36924067b3.19.1785938524796; Wed, 05 Aug 2026 07:02:04 -0700 (PDT) X-Received: by 2002:a05:690c:4:b0:81f:2403:9e70 with SMTP id 00721157ae682-82022326055mr36921187b3.19.1785938523272; Wed, 05 Aug 2026 07:02:03 -0700 (PDT) From: Brian Cain To: qemu-devel@nongnu.org Cc: Brian Cain , Pierrick Bouvier Subject: [PATCH] target/hexagon: don't let an idef-parser dest clobber its own source Date: Wed, 5 Aug 2026 07:02:00 -0700 Message-Id: <20260805140200.2710205-1-brian.cain@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: nkTiJr3BtE4fQMRLJYVoZtv4-cI97LiF X-Authority-Analysis: v=2.4 cv=aOfAb79m c=1 sm=1 tr=0 ts=6a73425f cx=c_pps a=72HoHk1woDtn7btP4rdmlg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=k_uBiIes2qVQFvI5dK8A:9 a=QEXdDO2ut3YA:10 a=kA6IBgd4cpdPkAWqgNAz:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwODA1MDExMyBTYWx0ZWRfX6OCwi9K2qdXg YR7jxGiLTuHvRb+1I4G9eHCXzEkvDyFnEBM9sicg7011/FiNf5ejrAuG15marR4u33ptFMV09jm fVIGEgWyqnD/pOztGql5GHU2mc233KQ= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODA1MDExMyBTYWx0ZWRfX0USdnacTmj4w rg/muTpjoXzH2AWetLhMJ0oYor6XYsdUI6jaWFyzzQ3VSt8scyKdMig6sPil2PVpIFv4TRpHMN4 6cF9wECM6fpvvuMTDYo4y5e4SeoiRkV8IyfCbVU5k57kC3Ci2KphdSpq70jauWa7O7+nIJtn1V1 wnKmOZ06V5ocMpSZE/cPGr8MLUCnYh90liPWUUS5PafsxUyapcYSktJ9A7jl5ckXv36diuTogcI XRmVlI43WdXjZpaONxY15sTX2Uy79jQrKs+x5Mss2UhsE9J2WRkKqiqoLiBHpLAqRZlMJ2PgkOg eK5+72x9i42Qv29wagIdFCdT05EFQK7N2Z8ZGzvXEfuGZluK+G7VETkR75G6jX5LB35v+d/Tp/q bUmFNG365asGxto/tBE9WeZbnNdMOUn7hmNMPJCqRq6a/Kl9iZkWFG37ltx4bssrC1qfsZRjbUN 4egRKFjfZKigN/n+EdQ== X-Proofpoint-GUID: nkTiJr3BtE4fQMRLJYVoZtv4-cI97LiF X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-05_04,2026-08-04_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 clxscore=1015 phishscore=0 malwarescore=0 bulkscore=0 impostorscore=0 suspectscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608050113 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=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=brian.cain@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 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_LOW=-0.7, 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.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1785938590214158500 The idef-parser emitters write the destination in place, so when a packet is short-circuited and get_result_gpr() returns hex_gpr[] itself, an instruction naming one register as both source and destination reads back a value it already overwrote. `Rd32=3Dcmpy(Rs32,Rt32):<<1:rnd:sat` with Rs =3D=3D Rd is an example. Give a source reg that aliases a destination its own copy of the register value. Signed-off-by: Brian Cain Reviewed-by: Pierrick Bouvier --- target/hexagon/genptr.h | 1 + target/hexagon/genptr.c | 11 ++++++ tests/tcg/hexagon/read_write_overlap.c | 47 ++++++++++++++++++++++++++ target/hexagon/gen_tcg_funcs.py | 15 ++++++++ target/hexagon/hex_common.py | 12 +++++++ 5 files changed, 86 insertions(+) diff --git a/target/hexagon/genptr.h b/target/hexagon/genptr.h index 45ee038ca94..5d096774102 100644 --- a/target/hexagon/genptr.h +++ b/target/hexagon/genptr.h @@ -36,6 +36,7 @@ void gen_store8i(TCGv_env cpu_env, TCGv vaddr, int64_t sr= c, uint32_t slot); TCGv gen_read_reg(TCGv result, int num); TCGv gen_read_preg(TCGv pred, uint8_t num); TCGv get_result_gpr(DisasContext *ctx, int rnum); +TCGv gen_unalias_gpr_src(TCGv src, TCGv dst); TCGv get_result_pred(DisasContext *ctx, int pnum); void gen_pred_write(DisasContext *ctx, int pnum, TCGv val); void gen_set_usr_field(DisasContext *ctx, int field, TCGv val); diff --git a/target/hexagon/genptr.c b/target/hexagon/genptr.c index 3f310377097..12813f48bf9 100644 --- a/target/hexagon/genptr.c +++ b/target/hexagon/genptr.c @@ -91,6 +91,17 @@ TCGv get_result_gpr(DisasContext *ctx, int rnum) } } =20 +TCGv gen_unalias_gpr_src(TCGv src, TCGv dst) +{ + if (src !=3D dst) { + return src; + } + + TCGv tmp =3D tcg_temp_new(); + tcg_gen_mov_tl(tmp, src); + return tmp; +} + static TCGv_i64 get_result_gpr_pair(DisasContext *ctx, int rnum) { TCGv_i64 result =3D tcg_temp_new_i64(); diff --git a/tests/tcg/hexagon/read_write_overlap.c b/tests/tcg/hexagon/rea= d_write_overlap.c index 95c54ccd63c..7eaf75f545a 100644 --- a/tests/tcg/hexagon/read_write_overlap.c +++ b/tests/tcg/hexagon/read_write_overlap.c @@ -115,12 +115,59 @@ static void test_swiz(void) check32(swiz(0x11223344), 0x44332211); } =20 +#define CMPY(NAME, ASM) \ +static inline uint32_t NAME##_rd_eq_rs(uint32_t x, uint32_t y) \ +{ \ + uint32_t res; \ + asm("r7 =3D %1\n\t" \ + ASM("r7", "%2") "\n\t" \ + "%0 =3D r7\n\t" \ + : "=3Dr"(res) : "r"(x), "r"(y) : "r7"); \ + return res; \ +} \ +static inline uint32_t NAME##_rd_eq_rt(uint32_t x, uint32_t y) \ +{ \ + uint32_t res; \ + asm("r7 =3D %2\n\t" \ + ASM("%1", "r7") "\n\t" \ + "%0 =3D r7\n\t" \ + : "=3Dr"(res) : "r"(x), "r"(y) : "r7"); \ + return res; \ +} + +#define CMPY_RND_SAT(RS, RT) "r7 =3D cmpy(" RS "," RT "):rnd:sat" +#define CMPY_S1_RND_SAT(RS, RT) "r7 =3D cmpy(" RS "," RT "):<<1:rnd:sat" +#define CMPYC_RND_SAT(RS, RT) "r7 =3D cmpy(" RS "," RT "*):rnd:sat" +#define CMPYC_S1_RND_SAT(RS, RT) "r7 =3D cmpy(" RS "," RT "*):<<1:rnd:sat" + +CMPY(cmpyrs_s0, CMPY_RND_SAT) +CMPY(cmpyrs_s1, CMPY_S1_RND_SAT) +CMPY(cmpyrsc_s0, CMPYC_RND_SAT) +CMPY(cmpyrsc_s1, CMPYC_S1_RND_SAT) + +static void test_cmpy(void) +{ + check32(cmpyrs_s0_rd_eq_rs(0x32195ce2, 0xef862430), 0x011b105b); + check32(cmpyrs_s0_rd_eq_rt(0x32195ce2, 0xef862430), 0x011b105b); + check32(cmpyrs_s1_rd_eq_rs(0x32195ce2, 0xef862430), 0x023520b5); + check32(cmpyrs_s1_rd_eq_rt(0x32195ce2, 0xef862430), 0x023520b5); + check32(cmpyrsc_s0_rd_eq_rs(0x32195ce2, 0xef862430), 0x0d0f09e8); + check32(cmpyrsc_s0_rd_eq_rt(0x32195ce2, 0xef862430), 0x0d0f09e8); + check32(cmpyrsc_s1_rd_eq_rs(0x32195ce2, 0xef862430), 0x1a1f13d0); + check32(cmpyrsc_s1_rd_eq_rt(0x32195ce2, 0xef862430), 0x1a1f13d0); + + /* Both halves saturate */ + check32(cmpyrs_s1_rd_eq_rs(0x80008000, 0x80008000), 0x7fff0000); + check32(cmpyrsc_s1_rd_eq_rs(0x7fff8001, 0x80017fff), 0x00008000); +} + int main() { test_insert(); test_insert_rp(); test_asr_r_svw_trun(); test_swiz(); + test_cmpy(); =20 puts(err ? "FAIL" : "PASS"); return err ? EXIT_FAILURE : EXIT_SUCCESS; diff --git a/target/hexagon/gen_tcg_funcs.py b/target/hexagon/gen_tcg_funcs= .py index 6d5d99cee3a..43e68077495 100755 --- a/target/hexagon/gen_tcg_funcs.py +++ b/target/hexagon/gen_tcg_funcs.py @@ -75,6 +75,21 @@ def gen_tcg_func(f, tag, regs, imms): f.write(f" int {hex_common.imm_name(immlett)} =3D insn->immed[{= i}];\n") =20 if hex_common.is_idef_parser_enabled(tag): + gpr_operands =3D [ + hex_common.get_register(tag, regtype, regid) + for regtype, regid in regs + if hex_common.get_register(tag, regtype, regid).may_alias_gpr() + ] + dests =3D [reg for reg in gpr_operands if reg.is_written()] + for reg in gpr_operands: + if reg.is_written() or not reg.is_read(): + continue + src =3D reg.reg_tcg() + for dest in dests: + f.write(hex_common.code_fmt(f"""\ + {src} =3D gen_unalias_gpr_src({src}, {dest.reg_tcg()}); + """)) + declared =3D [] ## Handle registers for regtype, regid in regs: diff --git a/target/hexagon/hex_common.py b/target/hexagon/hex_common.py index d91a653c3d4..09a025ba13e 100755 --- a/target/hexagon/hex_common.py +++ b/target/hexagon/hex_common.py @@ -388,6 +388,8 @@ def decl_reg_num(self, f, regno): """)) def idef_arg(self, declared): declared.append(self.reg_tcg()) + def may_alias_gpr(self): + return False def helper_arg(self): return HelperArg( self.helper_proto_type(), @@ -495,6 +497,8 @@ def is_new(self): return False =20 class GprDest(Register, Single, Dest): + def may_alias_gpr(self): + return True def decl_tcg(self, f, tag, regno): self.decl_reg_num(f, regno) f.write(code_fmt(f"""\ @@ -510,6 +514,8 @@ def analyze_write(self, f, tag, regno): """)) =20 class GprSource(Register, Single, OldSource): + def may_alias_gpr(self): + return True def decl_tcg(self, f, tag, regno): self.decl_reg_num(f, regno) f.write(code_fmt(f"""\ @@ -531,6 +537,8 @@ def analyze_read(self, f, regno): """)) =20 class GprReadWrite(Register, Single, ReadWrite): + def may_alias_gpr(self): + return True def decl_tcg(self, f, tag, regno): self.decl_reg_num(f, regno) f.write(code_fmt(f"""\ @@ -557,6 +565,8 @@ def analyze_write(self, f, tag, regno): """)) =20 class ControlDest(Register, Single, Dest): + def may_alias_gpr(self): + return True def decl_reg_num(self, f, regno): f.write(code_fmt(f"""\ const int {self.reg_num} =3D insn->regno[{regno}] + HEX_REG_S= A0; @@ -593,6 +603,8 @@ def analyze_read(self, f, regno): """)) =20 class ModifierSource(Register, Single, OldSource): + def may_alias_gpr(self): + return True def decl_reg_num(self, f, regno): f.write(code_fmt(f"""\ const int {self.reg_num} =3D insn->regno[{regno}] + HEX_REG_M0; --=20 2.34.1