From patchwork Fri Mar 1 06:27:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Demin Han X-Patchwork-Id: 1906554 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TmJ9S4yXxz1yXC for ; Fri, 1 Mar 2024 17:30:04 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9A990385841D for ; Fri, 1 Mar 2024 06:30:02 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from CHN02-SH0-obe.outbound.protection.partner.outlook.cn (mail-sh0chn02on2102.outbound.protection.partner.outlook.cn [139.219.146.102]) by sourceware.org (Postfix) with ESMTPS id B6D153858C35 for ; Fri, 1 Mar 2024 06:28:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B6D153858C35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=starfivetech.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=starfivetech.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org B6D153858C35 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=139.219.146.102 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1709274490; cv=pass; b=sZ/tvoSf0gAE3Jw/FePuVccQVfs/4m9ruj+jNBR5J2TgeWQCiCMXaxVAy1Z0NpMWNAduDGDtn66rJusq4FRMrJQYdHmqKF5ZAijSSdAoL4b1i2LtvSgY97G0mTkiiDdMqJlntQIAweUuizTSvCOEFrXrbg+ZE0YlEfd3pqPmkCs= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1709274490; c=relaxed/simple; bh=HZXcJ6H8E4qUtrI0o6kvTH8aJwAMKtQxMJB1WrJ4KiA=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=fXjlHyi7EneInXGC0ykLEuMQnr4qkN1HUOKrOW68G9AZTag5Tp9m/+sthDolLOQDwJlj6XNtB6WtHTcsp29Wn22YcM51VvG+K/k4yPtzCtodoSEP55o1ueFVbXtXwXTNAFdZPtRU65fpKwlYaK6sAZFLO5hDYp5nzsUKhz1sfO4= ARC-Authentication-Results: i=2; server2.sourceware.org ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=f3h+7/UF5tgnVrirWZv6yI15Owv8RV4uTYnGeYMNWnFajTo6mj/GKEzGV7hnSSACkk8dIoZet9O1pM70K8jxBCWZcpr7P+VaM/Badirl9ONDEV6UznTxDdSjtzcIqA/ECYKEJEaHIL+aukgLla1/SXqUR8DWSJlgEzG6JWWoP99p4A4+qD9EhzzY7FVJWIDZQ6bxoxBf1X++qn1iA8kyV/pNMN/70f6pahPGRCgtG0M3tZE/bvn2Dq3+EuV1FpVFpKtruQcPA2+srQtLGrYs8ZFJ/K8rhvQJvavhTszwO7+39dDwR6DuEsJabrCXnO9rXooTTrkN6GSbj6h/CMH4lQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qDfpiMMRi6G5N3ORQCaus80aTZuKiMj/Qy6iROf7ZOQ=; b=GIhZwnaMfDl1wqZ+CJ5hMH4D45zhTKw9KRjcSXcrUUFfC5hMRhnEXb+7+/GJi0wnDtVfua98Sf8Y/2Cl3O8lMpD4QtjCodFCnDQJEySkg259+fU17NPzmulqFIYkiri7x+ph5FMonP4VjM7uLtitylXypWzlyEdNPH87peoSgggsS/pG4PPNUYQJLUSxFHNpBVp7sdthjV74LYYqrvq0MsC+IH7QCQFJwgYlhbraDhUUy1/qQCUTRxpK8cqW+tIDyxAH+2l2Jc326spc6JF0zojFj4C5gOPZvSFHX5fCiUuv9tjRfXOl7LXV9t6DDBK39aR02H6JiMWmWNEMKsK4DQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=starfivetech.com; dmarc=pass action=none header.from=starfivetech.com; dkim=pass header.d=starfivetech.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=starfivetech.com; Received: from ZQ0PR01MB1063.CHNPR01.prod.partner.outlook.cn (2406:e500:c550:d::13) by ZQ0PR01MB1080.CHNPR01.prod.partner.outlook.cn (2406:e500:c550:d::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7270.47; Fri, 1 Mar 2024 06:27:50 +0000 Received: from ZQ0PR01MB1063.CHNPR01.prod.partner.outlook.cn ([fe80::21d1:48e1:7ca0:1d76]) by ZQ0PR01MB1063.CHNPR01.prod.partner.outlook.cn ([fe80::21d1:48e1:7ca0:1d76%4]) with mapi id 15.20.7270.047; Fri, 1 Mar 2024 06:27:50 +0000 From: "demin.han" To: gcc-patches@gcc.gnu.org Cc: juzhe.zhong@rivai.ai, kito.cheng@gmail.com, pan2.li@intel.com, jeffreyalaw@gmail.com Subject: [PATCH 3/5] RISC-V: Support vmfxx.vf for autovec comparison of vec and imm Date: Fri, 1 Mar 2024 14:27:09 +0800 Message-ID: <20240301062711.207137-4-demin.han@starfivetech.com> X-Mailer: git-send-email 2.43.2 In-Reply-To: <20240301062711.207137-1-demin.han@starfivetech.com> References: <20240301062711.207137-1-demin.han@starfivetech.com> X-ClientProxiedBy: BJSPR01CA0023.CHNPR01.prod.partner.outlook.cn (2406:e500:c211:c::35) To ZQ0PR01MB1063.CHNPR01.prod.partner.outlook.cn (2406:e500:c550:d::13) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: ZQ0PR01MB1063:EE_|ZQ0PR01MB1080:EE_ X-MS-Office365-Filtering-Correlation-Id: c8bd0f30-bacc-4399-abcd-08dc39b8b82f X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: eg40foBzzvUXq7367SrSTk4vTRZsx2M6NAlyhLiOscr3S9E0+Wqeav3xwUnyT0odzA0Rh6AztWusvtDwMv05sItVMUgvxzka3pIL8FxnX7/CPcbbUZepDWBiiXUnwhPFTpbO+VZNLuc17EN7OZ0aJAk2cVg7MqbFa9uz6C5xMvzzeXJoim8ffF9sfLNtlQUFzYNg0q7WSj3fUzEEXekEqCM485yiU8JwLPKXIs62FtkmsGy+OGDBVMYtvVr/xFxcVw839g7j1Nd8Ili3NZinwuWkwMhJut3ABn7XuPUVNp/aJG7MnvGjVPZ8PYs5G+r2/Il3TdY69u26BIJTecydhVqCmO3qlg4mN27dgUDcHMNIHdP5NUite/wJIOcwK9SvRkeSpX7tfRr3smDINwryDbedZRy5fEegFLHAgquvVd4AqGaNePapvruhTGLvW35UkiKQCPtLIltUdBNmh/49RXveVGzKhaNM6wsow5iYGpKGqREvGswwWQz2TscPCbf7GCf3AuT89nP2pgUmO8Kur4rtVsTYUcDHOVT1qjX4wlp79LfWAN8sYuZVTDPQIvaAQLNiney4NezZUnq+c25ERo4oUp68pNlUTo8sDCqA+yf7bfD8oZiyo+fJgGIJ6uci X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:ZQ0PR01MB1063.CHNPR01.prod.partner.outlook.cn; PTR:; CAT:NONE; SFS:(13230031)(41320700004)(38350700005); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: DAd7qNPU2QsAy+SQLF3yTDYwG3D4mV0AsrlG7AUy5dGNRjW9NpqC8yYehW/L+2mhlQoyZ3eb2do3gD669OJ3hMbkcdAfopZdDPgxR1gaND0aF8CGMJjp1GFTV+vS+p8/9evu8PGATLIr90igDlKq5S54Y48pRjE11x3U0/61pMZzKzu3twu7Kp3AAlXAsxEueGrQ27bXtnJuZ4ojgW6v+g0aVA2HvVKZN3qkg0SCb++nR188rZQ9l9N76XyL1bBp7jWtVC/bfzsl/vaFfLuONyx6H76NceDQwI2QQtgBFN/N1rYWTcYlSQNCXyayU43X2fw+73X282fZK6Rw58AWjBcOCtu+zWKArX+F7qZGBm7kgzVe3QcG9bwEqXTHxSojKcrhb8eXADCruc2QMhUWwwDz2jm27ZSAidu29wQSEXS5n5w8smUfJRdhq/w/DRTIZSug2smNF3Xgks1MwFtOKuHuNk8VTPq5S6NTeRspJwo48QQyfJiVa8pNsolUgc+lzlYjqAGxgh/HKq62ApFwPllgtZXT5TShxDIkkFX5lhfAwKb/tgx0VU0K7k2zSNkbxN0/dvZGnT6DWbKzT3KP6gig1HT9Pik1jbunCESsruxk51ZHd/o25PzxP2dwvvIf57M0WIKh4OGjvzeTkoFjhOVs848TMG/RwArq1MY9vY4rmYlvnfLr6FvI4ph044kQsdKKXNDkONYt9NMsQZwt5l6chQRjh+i7lcOIFHCR7BMkoiTbP0jFp9okk5L8ts3+GCaNnYfNTXUYTQnR31pQnZFyNgdB+SJvD+h7ni0kQR5ov61OcvoNk53n5D3t4abcCR2oAuMHgXxcDx3Qn+hLJtpsdaRuUNKMrKTny00qzxmtwj0BYIGvIE+FXvduHvyzcTRivYIUEIebGgybghjr/rGxbzfuPbmTk0d3RSl8AUkzqvF6MFFmtunoOc/Q15W7c8NuT159Hn69rpy+Csv0oVW75Bb1RjruWavczw2iV+L/yLWa3/QeAwBrgvh4smMEc1agg5+3+zwu5edFt4QoL8RIq9Dq6vGB6o4LxHoRnkVbGe/prkiW/jQLGevgE5I5ahPVyEynDOmzpJ7OSvqEm3H+88iqgKzkhk+10LqzeIo/4cgcHE68YHFSPyblUs9KKOYMrxmwv+ikkaUwWpsQq9MuRAFW3xhHOELjN2AQip8DUR3/Fhl/bYTkjKlq0a+kuLO9d+uCZb4StthDKUMxeUhAZcZN9AMycbfHSVCbDYLcyzsFgnxSmofLDHD6n1Mr05vE9EshVd7HIOltW2p7pZK8Q99Fz+uX56nppPoF6+APgIfWjgg+0hHES0eGGCS5EFBhQveUpKAJ2qaCq2mwjDonDP380g1WORrEfMGfr+Fetl5WjLWOiklfRA59544icncJAEJ/8CdNDB+AuQrzW5mkpmOtwviQUe9UmLE+kFi0PNO5utlVeil3u0wlX6oZeKciwXphV15gatgA/fVZjCjz8HtjcNpG+0MT/QxqDfNdp11y9iMXpb6KmfQyoEERxeko59Dhw8wqOQxKYBU61qzZGt6LlUjt2ud+Lo2+hzu+CWNLhs4mLf+z6oYHKHwmwc14h12lThHFHcrL0vqW5A== X-OriginatorOrg: starfivetech.com X-MS-Exchange-CrossTenant-Network-Message-Id: c8bd0f30-bacc-4399-abcd-08dc39b8b82f X-MS-Exchange-CrossTenant-AuthSource: ZQ0PR01MB1063.CHNPR01.prod.partner.outlook.cn X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Mar 2024 06:27:50.8260 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 06fe3fa3-1221-43d3-861b-5a4ee687a85c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: v3PaFreIZs9Gu1cW4S+6gCApjhNzZbiBjeBn/VH85a4PXFNNe1kk6b+dNL4BnNEZn7wke5SOLF7DDr+334uTyTggMfMjIsGNGp9knwrpxnA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: ZQ0PR01MB1080 X-Spam-Status: No, score=-13.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Currently, following instructions generated in autovector: flw vsetvli vfmv.v.f ... vmfxx.vv Two issues: 1. Additional vsetvl and vfmv instructions 2. Occupy one vector register and may results in smaller lmul We expect: flw ... vmfxx.vf Tested on RV32 and RV64 gcc/ChangeLog: * config/riscv/autovec.md: Accept imm * config/riscv/riscv-v.cc (get_cmp_insn_code): Select scalar pattern (expand_vec_cmp): Ditto * config/riscv/riscv.cc (riscv_const_insns): Exclude float mode gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/cmp/vcond-1.c: Add new tests Signed-off-by: demin.han Signed-off-by: demin.han > --- gcc/config/riscv/autovec.md | 2 +- gcc/config/riscv/riscv-v.cc | 23 +++++++++---- gcc/config/riscv/riscv.cc | 2 +- .../riscv/rvv/autovec/cmp/vcond-1.c | 34 +++++++++++++++++++ 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md index 3b32369f68c..6cfb0800c45 100644 --- a/gcc/config/riscv/autovec.md +++ b/gcc/config/riscv/autovec.md @@ -690,7 +690,7 @@ (define_expand "vec_cmp" [(set (match_operand: 0 "register_operand") (match_operator: 1 "comparison_operator" [(match_operand:V_VLSF 2 "register_operand") - (match_operand:V_VLSF 3 "register_operand")]))] + (match_operand:V_VLSF 3 "nonmemory_operand")]))] "TARGET_VECTOR" { riscv_vector::expand_vec_cmp_float (operands[0], GET_CODE (operands[1]), diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc index 14e75b9a117..2a188ac78e0 100644 --- a/gcc/config/riscv/riscv-v.cc +++ b/gcc/config/riscv/riscv-v.cc @@ -2610,9 +2610,15 @@ expand_vec_init (rtx target, rtx vals) /* Get insn code for corresponding comparison. */ static insn_code -get_cmp_insn_code (rtx_code code, machine_mode mode) +get_cmp_insn_code (rtx_code code, machine_mode mode, bool scalar_p) { insn_code icode; + if (FLOAT_MODE_P (mode)) + { + icode = !scalar_p ? code_for_pred_cmp (mode) + : code_for_pred_cmp_scalar (mode); + return icode; + } switch (code) { case EQ: @@ -2628,10 +2634,7 @@ get_cmp_insn_code (rtx_code code, machine_mode mode) case LTU: case GE: case GEU: - if (FLOAT_MODE_P (mode)) - icode = code_for_pred_cmp (mode); - else - icode = code_for_pred_ltge (mode); + icode = code_for_pred_ltge (mode); break; default: gcc_unreachable (); @@ -2757,7 +2760,6 @@ expand_vec_cmp (rtx target, rtx_code code, rtx op0, rtx op1, rtx mask, { machine_mode mask_mode = GET_MODE (target); machine_mode data_mode = GET_MODE (op0); - insn_code icode = get_cmp_insn_code (code, data_mode); if (code == LTGT) { @@ -2765,12 +2767,19 @@ expand_vec_cmp (rtx target, rtx_code code, rtx op0, rtx op1, rtx mask, rtx gt = gen_reg_rtx (mask_mode); expand_vec_cmp (lt, LT, op0, op1, mask, maskoff); expand_vec_cmp (gt, GT, op0, op1, mask, maskoff); - icode = code_for_pred (IOR, mask_mode); + insn_code icode = code_for_pred (IOR, mask_mode); rtx ops[] = {target, lt, gt}; emit_vlmax_insn (icode, BINARY_MASK_OP, ops); return; } + rtx elt; + machine_mode scalar_mode = GET_MODE_INNER (GET_MODE (op1)); + bool scalar_p = const_vec_duplicate_p (op1, &elt) && FLOAT_MODE_P (data_mode); + if (scalar_p) + op1 = force_reg (scalar_mode, elt); + insn_code icode = get_cmp_insn_code (code, data_mode, scalar_p); + rtx cmp = gen_rtx_fmt_ee (code, mask_mode, op0, op1); if (!mask && !maskoff) { diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 4100abc9dd1..1ffe4865c19 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -1760,7 +1760,7 @@ riscv_const_insns (rtx x) register vec_duplicate into vmv.v.x. */ scalar_mode smode = GET_MODE_INNER (GET_MODE (x)); if (maybe_gt (GET_MODE_SIZE (smode), UNITS_PER_WORD) - && !immediate_operand (elt, Pmode)) + && !FLOAT_MODE_P (smode) && !immediate_operand (elt, Pmode)) return 0; /* Constants from -16 to 15 can be loaded with vmv.v.i. The Wc0, Wc1 constraints are already covered by the diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/vcond-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/vcond-1.c index 99a230d1c8a..7f6738518ee 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/vcond-1.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/vcond-1.c @@ -141,6 +141,34 @@ TEST_VAR_ALL (DEF_VCOND_VAR) TEST_IMM_ALL (DEF_VCOND_IMM) +#define TEST_COND_IMM_FLOAT(T, COND, IMM, SUFFIX) \ + T (float, float, COND, IMM, SUFFIX##_float_float) \ + T (double, double, COND, IMM, SUFFIX##_double_double) + +#define TEST_IMM_FLOAT_ALL(T) \ + TEST_COND_IMM_FLOAT (T, >, 0.0, _gt) \ + TEST_COND_IMM_FLOAT (T, <, 0.0, _lt) \ + TEST_COND_IMM_FLOAT (T, >=, 0.0, _ge) \ + TEST_COND_IMM_FLOAT (T, <=, 0.0, _le) \ + TEST_COND_IMM_FLOAT (T, ==, 0.0, _eq) \ + TEST_COND_IMM_FLOAT (T, !=, 0.0, _ne) \ + \ + TEST_COND_IMM_FLOAT (T, >, 1.0, _gt1) \ + TEST_COND_IMM_FLOAT (T, <, 1.0, _lt1) \ + TEST_COND_IMM_FLOAT (T, >=, 1.0, _ge1) \ + TEST_COND_IMM_FLOAT (T, <=, 1.0, _le1) \ + TEST_COND_IMM_FLOAT (T, ==, 1.0, _eq1) \ + TEST_COND_IMM_FLOAT (T, !=, 1.0, _ne1) \ + \ + TEST_COND_IMM_FLOAT (T, >, -1.0, _gt2) \ + TEST_COND_IMM_FLOAT (T, <, -1.0, _lt2) \ + TEST_COND_IMM_FLOAT (T, >=, -1.0, _ge2) \ + TEST_COND_IMM_FLOAT (T, <=, -1.0, _le2) \ + TEST_COND_IMM_FLOAT (T, ==, -1.0, _eq2) \ + TEST_COND_IMM_FLOAT (T, !=, -1.0, _ne2) + +TEST_IMM_FLOAT_ALL (DEF_VCOND_IMM) + /* { dg-final { scan-assembler-times {\tvmseq\.vi} 42 } } */ /* { dg-final { scan-assembler-times {\tvmsne\.vi} 42 } } */ /* { dg-final { scan-assembler-times {\tvmsgt\.vi} 30 } } */ @@ -155,3 +183,9 @@ TEST_IMM_ALL (DEF_VCOND_IMM) /* { dg-final { scan-assembler-times {\tvmslt} 38 } } */ /* { dg-final { scan-assembler-times {\tvmsge} 38 } } */ /* { dg-final { scan-assembler-times {\tvmsle} 82 } } */ +/* { dg-final { scan-assembler-times {\tvmfgt.vf} 6 } } */ +/* { dg-final { scan-assembler-times {\tvmflt.vf} 6 } } */ +/* { dg-final { scan-assembler-times {\tvmfge.vf} 6 } } */ +/* { dg-final { scan-assembler-times {\tvmfle.vf} 6 } } */ +/* { dg-final { scan-assembler-times {\tvmfeq.vf} 6 } } */ +/* { dg-final { scan-assembler-times {\tvmfne.vf} 6 } } */