From patchwork Mon Jun 26 18:58:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Robin Dapp X-Patchwork-Id: 113091 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp7690659vqr; Mon, 26 Jun 2023 12:00:40 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7JT02Dz3wD7B2RFqTI421fJqnJTF/MTxwHofco9CJ5aGum922TyhZ2HJvu/+7bmbYwy49U X-Received: by 2002:a17:907:86a0:b0:991:edf7:48e9 with SMTP id qa32-20020a17090786a000b00991edf748e9mr1781937ejc.7.1687806040061; Mon, 26 Jun 2023 12:00:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687806040; cv=none; d=google.com; s=arc-20160816; b=S9rmPBTOBwFpv8+Biy8l8uIR1YpESZDxQV8jrHAr3JnZM2xLSl0nhQiDlFAiOJdpFt y6OKcUgcinYj0WGZZaVn97XXUPIYa1G6fOFMayoDzTlS9rUFEIw2Ug5QfB/6BreLQ2/J szPTleJzOk6aILvPSNs8racxMSN2R0mNFrkwrV0HYM35x5QKwKRVJ6Uy8F3O2D29NpRB QU0+dxNB5WnH7ZWjopfilWu2vs1bNvNw1LYpEV88i5qxIX7J0gS2KLQt0qFQpMWDajf8 dHwIWKEManuFE3eoK6zYsT78sKU5eI8IDixQnGX7JRx8HgN6K1fRf6R7+G6u7tUPeJar Ov1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:to:subject:content-language:cc:user-agent :mime-version:date:message-id:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=kGxO67q/8ifB5p4MxBL9j1gvtkSkX0jPjvBWA0uTG7E=; fh=0vXgoIsEThH6Qba7saR4QWpKnBkTEEL72tevRHKcYxQ=; b=k6eHzeFV6LJHZI5Mm+wWDozkSdwEfjan0oONhALQqduErqu7R/AdRK77/jqVPgmQ8H OKNcogdThRyz/E9HeNzJ+hdVmQ5xtx0oCEDfnEmY+Md7wFaVOkg7QVANAxggK4pNUlme HjC/u/7sVrzSFacHtTMdJANJs2FW+UzMkw4PJCg+dINRf1qLt2mnUAEAnPIp3ES8qINa 6itCFlBwmMrqhCf6uHUv8yGdbglhGc9da89Zdi0eAIEnEXARDB5J7E+s56GbeSWj8a8N J5uvLx7/qPItOrLHkFFEgwLqYvRxnYBbf35zNnzwnJ+ifnv8dNFllB/U/O15FLiSHEGW OMTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=mL030Bld; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id c7-20020a170906340700b0098e05d1a61csi2603213ejb.99.2023.06.26.12.00.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Jun 2023 12:00:40 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=mL030Bld; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C7EC73856DDA for ; Mon, 26 Jun 2023 18:59:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C7EC73856DDA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1687805981; bh=kGxO67q/8ifB5p4MxBL9j1gvtkSkX0jPjvBWA0uTG7E=; h=Date:Cc:Subject:To:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=mL030BldABnu04UZa1HndelZESeNb6Xru4DGIwkLE6sQI4stGHmO82FPxHWDmAssR ldDGP2lKhYmHqqOO5mMNvIK71+ChRga943o96egwq8KNfir22EFAwqZwE9Q6032VL7 ESScpvZJeuwklBcMbYsSaLnKkJyhEclIRzp9ljR8= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by sourceware.org (Postfix) with ESMTPS id 8931E3857353 for ; Mon, 26 Jun 2023 18:58:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8931E3857353 Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-31297125334so3195585f8f.0 for ; Mon, 26 Jun 2023 11:58:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687805934; x=1690397934; h=content-transfer-encoding:to:subject:from:content-language:cc :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=kGxO67q/8ifB5p4MxBL9j1gvtkSkX0jPjvBWA0uTG7E=; b=POVrAOwYvf8v+tzsOUl94YyLb8iuDN5jfFtlWS+Af4tsnCffQKi+AYvHcI5vAuryeU e/3AQRj1kNA8VY8Hx1y65yuLU/rKrmjyr/Ac+pA0WBBxF5h35HiJNnA0TBx7aULKR1xD 9dxnk8JWHj4gN6mJNDX5MSJvkxO+10qgkRIHpKVJWtvEZp+N9hohvHpwwPPJLpQ9ACPn spFM4TUlwsPvDSNMfHIPjoj0eJIbJ2m+nchXc5YcX2oq5J1RrrQmrsXE5Cl3yEE19k5L GCNyE8xND6S4Fb/5hVtllgvTTqVeDCz70sTxLIj6kFaEUdM1PU0aTBZjWfv/Ijeji9iw G1Cg== X-Gm-Message-State: AC+VfDxs8oPQRxQYKXrIjStf82gZzLwJe4K/H057kxG2PuJ5yO+ttuSk q7s1iTa2+V1KC+UKhf2DHpFeaqeTytU= X-Received: by 2002:a05:6000:1112:b0:30f:c514:c119 with SMTP id z18-20020a056000111200b0030fc514c119mr27867538wrw.27.1687805933677; Mon, 26 Jun 2023 11:58:53 -0700 (PDT) Received: from [192.168.1.24] (ip-046-005-130-086.um12.pools.vodafone-ip.de. [46.5.130.86]) by smtp.gmail.com with ESMTPSA id v1-20020adfe281000000b00311299df211sm8171321wri.77.2023.06.26.11.58.52 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 26 Jun 2023 11:58:53 -0700 (PDT) Message-ID: <89b515c2-df12-156e-c116-02f711a911d5@gmail.com> Date: Mon, 26 Jun 2023 20:58:52 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Cc: rdapp.gcc@gmail.com Content-Language: en-US Subject: [PATCH] RISC-V: Add autovec FP widening/narrowing. To: gcc-patches , palmer , Kito Cheng , "juzhe.zhong@rivai.ai" , jeffreyalaw X-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_ASCII_DIVIDERS, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, 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.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Robin Dapp via Gcc-patches From: Robin Dapp Reply-To: Robin Dapp Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1769792905763055769?= X-GMAIL-MSGID: =?utf-8?q?1769792905763055769?= Hi, this patch adds FP widening and narrowing autovec expanders as well as tests. Conceptually similar to integer extension/truncation, we emulate _Float16 -> double by two vfwcvts and double -> _Float16 by two vfncvts. Optimizations to create widening operations will be added separately. Regards Robin gcc/ChangeLog: * config/riscv/autovec.md (extend2): New expander. (extend2): Dito. (trunc2): Dito. (trunc2): Dito. * config/riscv/vector-iterators.md: Add VQEXTF and HF to V_QUAD_TRUNC and v_quad_trunc. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/conversions/vfncvt-run.c: New test. * gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv32gcv.c: New test. * gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv64gcv.c: New test. * gcc.target/riscv/rvv/autovec/conversions/vfncvt-template.h: New test. * gcc.target/riscv/rvv/autovec/conversions/vfncvt-zvfh-run.c: New test. * gcc.target/riscv/rvv/autovec/conversions/vfwcvt-run.c: New test. * gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv32gcv.c: New test. * gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv64gcv.c: New test. * gcc.target/riscv/rvv/autovec/conversions/vfwcvt-template.h: New test. * gcc.target/riscv/rvv/autovec/conversions/vfwcvt-zvfh-run.c: New test. --- gcc/config/riscv/autovec.md | 90 ++++++++++++++++++- gcc/config/riscv/vector-iterators.md | 14 +++ .../rvv/autovec/conversions/vfncvt-run.c | 33 +++++++ .../rvv/autovec/conversions/vfncvt-rv32gcv.c | 7 ++ .../rvv/autovec/conversions/vfncvt-rv64gcv.c | 7 ++ .../rvv/autovec/conversions/vfncvt-template.h | 16 ++++ .../rvv/autovec/conversions/vfncvt-zvfh-run.c | 34 +++++++ .../rvv/autovec/conversions/vfwcvt-run.c | 33 +++++++ .../rvv/autovec/conversions/vfwcvt-rv32gcv.c | 6 ++ .../rvv/autovec/conversions/vfwcvt-rv64gcv.c | 6 ++ .../rvv/autovec/conversions/vfwcvt-template.h | 16 ++++ .../rvv/autovec/conversions/vfwcvt-zvfh-run.c | 34 +++++++ 12 files changed, 293 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-run.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv32gcv.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv64gcv.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-template.h create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-zvfh-run.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-run.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv32gcv.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv64gcv.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-template.h create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-zvfh-run.c diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md index aee4574b8e1..5cc48f966aa 100644 --- a/gcc/config/riscv/autovec.md +++ b/gcc/config/riscv/autovec.md @@ -162,12 +162,12 @@ (define_insn_and_split "3" riscv_vector::emit_vlmax_insn (code_for_pred_scalar (, mode), riscv_vector::RVV_BINOP, operands); DONE; -} +} [(set_attr "type" "vshift") (set_attr "mode" "")]) ;; ------------------------------------------------------------------------- -;; ---- [INT] Binary shifts by scalar. +;; ---- [INT] Binary shifts by vector. ;; ------------------------------------------------------------------------- ;; Includes: ;; - vsll.vv/vsra.vv/vsrl.vv @@ -416,7 +416,7 @@ (define_insn_and_split "trunc2" riscv_vector::emit_vlmax_insn (icode, riscv_vector::RVV_UNOP, operands); DONE; } - [(set_attr "type" "vshift") + [(set_attr "type" "vnshift") (set_attr "mode" "")]) ;; ------------------------------------------------------------------------- @@ -466,6 +466,90 @@ (define_expand "trunc2" DONE; }) +;; ------------------------------------------------------------------------- +;; ---- [FP] Widening. +;; ------------------------------------------------------------------------- +;; - vfwcvt.f.f.v +;; ------------------------------------------------------------------------- +(define_insn_and_split "extend2" + [(set (match_operand:VWEXTF_ZVFHMIN 0 "register_operand" "=&vr") + (float_extend:VWEXTF_ZVFHMIN + (match_operand: 1 "register_operand" " vr")))] + "TARGET_VECTOR && can_create_pseudo_p ()" + "#" + "&& 1" + [(const_int 0)] +{ + insn_code icode = code_for_pred_extend (mode); + riscv_vector::emit_vlmax_insn (icode, riscv_vector::RVV_UNOP, operands); + DONE; +} + [(set_attr "type" "vfwcvtftof") + (set_attr "mode" "")]) + +(define_expand "extend2" + [(set (match_operand:VQEXTF 0 "register_operand") + (float_extend:VQEXTF + (match_operand: 1 "register_operand")))] + "TARGET_VECTOR && TARGET_VECTOR_ELEN_FP_16" +{ + rtx dblw = gen_reg_rtx (mode); + insn_code icode = code_for_pred_extend (mode); + rtx ops1[] = {dblw, operands[1]}; + riscv_vector::emit_vlmax_insn (icode, riscv_vector::RVV_UNOP, ops1); + + icode = code_for_pred_extend (mode); + rtx ops2[] = {operands[0], dblw}; + riscv_vector::emit_vlmax_insn (icode, riscv_vector::RVV_UNOP, ops2); + DONE; +}) + +;; ------------------------------------------------------------------------- +;; ---- [FP] Narrowing. +;; ------------------------------------------------------------------------- +;; - vfncvt.f.f.w +;; ------------------------------------------------------------------------- +(define_insn_and_split "trunc2" + [(set (match_operand: 0 "register_operand" "=vr") + (truncate: + (match_operand:VWEXTF_ZVFHMIN 1 "register_operand" " vr")))] + "TARGET_VECTOR && can_create_pseudo_p ()" + "#" + "&& 1" + [(const_int 0)] +{ + insn_code icode = code_for_pred_trunc (mode); + riscv_vector::emit_vlmax_fp_insn (icode, riscv_vector::RVV_UNOP, operands); + DONE; +} + [(set_attr "type" "vfncvtftof") + (set_attr "mode" "")]) + +;; ------------------------------------------------------------------------- +;; Narrowing to a mode whose inner mode size is a quarter of mode's. +;; We emulate this with two consecutive vfncvts. +;; ------------------------------------------------------------------------- +(define_expand "trunc2" + [(set (match_operand: 0 "register_operand") + (truncate: + (match_operand:VQEXTF 1 "register_operand")))] + "TARGET_VECTOR && (TARGET_ZVFHMIN || TARGET_ZVFH)" +{ + rtx half = gen_reg_rtx (mode); + rtx opshalf[] = {half, operands[1]}; + + /* According to the RISC-V V Spec 13.19. we need to use + vfncvt.rod.f.f.w for all steps but the last. */ + insn_code icode = code_for_pred_rod_trunc (mode); + riscv_vector::emit_vlmax_insn (icode, riscv_vector::RVV_UNOP, opshalf); + + rtx ops[] = {operands[0], half}; + icode = code_for_pred_trunc (mode); + riscv_vector::emit_vlmax_fp_insn (icode, riscv_vector::RVV_UNOP, ops); + DONE; +}) + + ;; ========================================================================= ;; == Conversions ;; ========================================================================= diff --git a/gcc/config/riscv/vector-iterators.md b/gcc/config/riscv/vector-iterators.md index 73e0ed62d91..573a1884e66 100644 --- a/gcc/config/riscv/vector-iterators.md +++ b/gcc/config/riscv/vector-iterators.md @@ -583,6 +583,14 @@ (define_mode_iterator VQEXTI [ (VNx16DI "TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 128") ]) +(define_mode_iterator VQEXTF [ + (VNx1DF "TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN < 128") + (VNx2DF "TARGET_VECTOR_ELEN_FP_64") + (VNx4DF "TARGET_VECTOR_ELEN_FP_64") + (VNx8DF "TARGET_VECTOR_ELEN_FP_64") + (VNx16DF "TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 128") +]) + (define_mode_iterator VOEXTI [ (VNx1DI "TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN < 128") (VNx2DI "TARGET_VECTOR_ELEN_64") (VNx4DI "TARGET_VECTOR_ELEN_64") (VNx8DI "TARGET_VECTOR_ELEN_64") @@ -1341,6 +1349,9 @@ (define_mode_attr V_QUAD_TRUNC [ (VNx16SI "VNx16QI") (VNx32SI "VNx32QI") (VNx1DI "VNx1HI") (VNx2DI "VNx2HI") (VNx4DI "VNx4HI") (VNx8DI "VNx8HI") (VNx16DI "VNx16HI") + + (VNx1DF "VNx1HF") (VNx2DF "VNx2HF") (VNx4DF "VNx4HF") (VNx8DF "VNx8HF") + (VNx16DF "VNx16HF") ]) (define_mode_attr V_OCT_TRUNC [ @@ -1366,6 +1377,9 @@ (define_mode_attr v_quad_trunc [ (VNx16SI "vnx16qi") (VNx32SI "vnx32qi") (VNx1DI "vnx1hi") (VNx2DI "vnx2hi") (VNx4DI "vnx4hi") (VNx8DI "vnx8hi") (VNx16DI "vnx16hi") + + (VNx1DF "vnx1hf") (VNx2DF "vnx2hf") (VNx4DF "vnx4hf") (VNx8DF "vnx8hf") + (VNx16DF "vnx16hf") ]) (define_mode_attr v_oct_trunc [ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-run.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-run.c new file mode 100644 index 00000000000..65d2826c8a1 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-run.c @@ -0,0 +1,33 @@ +/* { dg-do run { target { riscv_vector } } } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model --param=riscv-autovec-preference=fixed-vlmax" } */ + +#include "vfncvt-template.h" + +#include + +#define SZ 512 +#define EPS 1e-4 + +#define RUN(TYPE1,TYPE2) \ + TYPE1 src##TYPE1##TYPE2[SZ]; \ + TYPE2 dst##TYPE1##TYPE2[SZ]; \ + for (int i = 0; i < SZ; i++) \ + { \ + src##TYPE1##TYPE2[i] = (i & 1) ? -i : i; \ + src##TYPE1##TYPE2[i] *= 3.141592; \ + dst##TYPE1##TYPE2[i] = -1; \ + } \ + vfncvt_##TYPE1##TYPE2 (dst##TYPE1##TYPE2, \ + src##TYPE1##TYPE2, SZ); \ + for (int i = 0; i < SZ; i++) \ + assert (__builtin_fabs (dst##TYPE1##TYPE2[i] \ + - ((i & 1) ? -i : i) * 3.141592) < EPS); \ + + +#define RUN_ALL() \ + RUN(double, float) \ + +int main () +{ + RUN_ALL() +} diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv32gcv.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv32gcv.c new file mode 100644 index 00000000000..10fe75d2754 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv32gcv.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=fixed-vlmax" } */ + +#include "vfncvt-template.h" + +/* { dg-final { scan-assembler-times {\tvfncvt\.f\.f\.w} 3 } } */ +/* { dg-final { scan-assembler-times {\tvfncvt\.rod\.f\.f\.w} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv64gcv.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv64gcv.c new file mode 100644 index 00000000000..fd40fa242e4 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-rv64gcv.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv64gcv_zvfh -mabi=lp64d --param=riscv-autovec-preference=fixed-vlmax" } */ + +#include "vfncvt-template.h" + +/* { dg-final { scan-assembler-times {\tvfncvt\.f\.f\.w} 3 } } */ +/* { dg-final { scan-assembler-times {\tvfncvt\.rod\.f\.f\.w} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-template.h new file mode 100644 index 00000000000..d31c89a255f --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-template.h @@ -0,0 +1,16 @@ +#include + +#define TEST(TYPE1, TYPE2) \ + __attribute__((noipa)) \ + void vfncvt_##TYPE1##TYPE2 (TYPE2 *dst, TYPE1 *a, int n) \ + { \ + for (int i = 0; i < n; i++) \ + dst[i] = (TYPE1)a[i]; \ + } + +#define TEST_ALL() \ + TEST(float, _Float16) \ + TEST(double, _Float16) \ + TEST(double, float) \ + +TEST_ALL() diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-zvfh-run.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-zvfh-run.c new file mode 100644 index 00000000000..38e0d84b4e2 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfncvt-zvfh-run.c @@ -0,0 +1,34 @@ +/* { dg-do run { target { riscv_vector && riscv_zvfh_hw } } } */ +/* { dg-additional-options "-std=c99 -march=rv64gcv_zvfh -mabi=lp64d -fno-vect-cost-model --param=riscv-autovec-preference=scalable" } */ + +#include "vfncvt-template.h" + +#include + +#define SZ 512 +#define EPS 1e-4 + +#define RUN(TYPE1,TYPE2) \ + TYPE1 src##TYPE1##TYPE2[SZ]; \ + TYPE2 dst##TYPE1##TYPE2[SZ]; \ + for (int i = 0; i < SZ; i++) \ + { \ + src##TYPE1##TYPE2[i] = (i & 1) ? -i : i; \ + src##TYPE1##TYPE2[i] *= 0.0003141592; \ + dst##TYPE1##TYPE2[i] = -1; \ + } \ + vfncvt_##TYPE1##TYPE2 (dst##TYPE1##TYPE2, \ + src##TYPE1##TYPE2, SZ); \ + for (int i = 0; i < SZ; i++) \ + assert (__builtin_fabs (dst##TYPE1##TYPE2[i] \ + - ((i & 1) ? -i : i) * 0.0003141592) < EPS); \ + + +#define RUN_ALL() \ + RUN(float, _Float16) \ + RUN(double, _Float16) \ + +int main () +{ + RUN_ALL() +} diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-run.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-run.c new file mode 100644 index 00000000000..9594909c4ee --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-run.c @@ -0,0 +1,33 @@ +/* { dg-do run { target { riscv_vector } } } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model --param=riscv-autovec-preference=fixed-vlmax" } */ + +#include "vfwcvt-template.h" + +#include + +#define SZ 512 +#define EPS 1e-4 + +#define RUN(TYPE1,TYPE2) \ + TYPE1 src##TYPE1##TYPE2[SZ]; \ + TYPE2 dst##TYPE1##TYPE2[SZ]; \ + for (int i = 0; i < SZ; i++) \ + { \ + src##TYPE1##TYPE2[i] = (i & 1) ? -i : i; \ + src##TYPE1##TYPE2[i] *= 3.141592; \ + dst##TYPE1##TYPE2[i] = -1; \ + } \ + vfwcvt_##TYPE1##TYPE2 (dst##TYPE1##TYPE2, \ + src##TYPE1##TYPE2, SZ); \ + for (int i = 0; i < SZ; i++) \ + assert (__builtin_fabs (dst##TYPE1##TYPE2[i] \ + - ((i & 1) ? -i : i) * 3.141592) < EPS); \ + + +#define RUN_ALL() \ + RUN(float, double) \ + +int main () +{ + RUN_ALL() +} diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv32gcv.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv32gcv.c new file mode 100644 index 00000000000..006bdb24c41 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv32gcv.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=fixed-vlmax" } */ + +#include "vfwcvt-template.h" + +/* { dg-final { scan-assembler-times {\tvfwcvt\.f\.f\.v} 4 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv64gcv.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv64gcv.c new file mode 100644 index 00000000000..7ec710702c9 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-rv64gcv.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv64gcv_zvfh -mabi=lp64d --param=riscv-autovec-preference=fixed-vlmax" } */ + +#include "vfwcvt-template.h" + +/* { dg-final { scan-assembler-times {\tvfwcvt\.f\.f\.v} 4 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-template.h new file mode 100644 index 00000000000..881bbe10521 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-template.h @@ -0,0 +1,16 @@ +#include + +#define TEST(TYPE1, TYPE2) \ + __attribute__((noipa)) \ + void vfwcvt_##TYPE1##TYPE2 (TYPE2 *dst, TYPE1 *a, int n) \ + { \ + for (int i = 0; i < n; i++) \ + dst[i] = (TYPE1)a[i]; \ + } + +#define TEST_ALL() \ + TEST(_Float16, float) \ + TEST(_Float16, double) \ + TEST(float, double) \ + +TEST_ALL() diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-zvfh-run.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-zvfh-run.c new file mode 100644 index 00000000000..77d653e256d --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vfwcvt-zvfh-run.c @@ -0,0 +1,34 @@ +/* { dg-do run { target { riscv_vector && riscv_zvfh_hw } } } */ +/* { dg-additional-options "-std=c99 -march=rv64gcv_zvfh -mabi=lp64d -fno-vect-cost-model --param=riscv-autovec-preference=scalable" } */ + +#include "vfwcvt-template.h" + +#include + +#define SZ 512 +#define EPS 1e-4 + +#define RUN(TYPE1,TYPE2) \ + TYPE1 src##TYPE1##TYPE2[SZ]; \ + TYPE2 dst##TYPE1##TYPE2[SZ]; \ + for (int i = 0; i < SZ; i++) \ + { \ + src##TYPE1##TYPE2[i] = (i & 1) ? -i : i; \ + src##TYPE1##TYPE2[i] *= 0.0003141592; \ + dst##TYPE1##TYPE2[i] = -1; \ + } \ + vfwcvt_##TYPE1##TYPE2 (dst##TYPE1##TYPE2, \ + src##TYPE1##TYPE2, SZ); \ + for (int i = 0; i < SZ; i++) \ + assert (__builtin_fabs (dst##TYPE1##TYPE2[i] \ + - ((i & 1) ? -i : i) * 0.0003141592) < EPS); \ + + +#define RUN_ALL() \ + RUN(_Float16, float) \ + RUN(_Float16, double) \ + +int main () +{ + RUN_ALL() +}