From patchwork Wed May 8 00:38:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Zeng X-Patchwork-Id: 1932740 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 4VYx3d3YRqz1ymg for ; Wed, 8 May 2024 10:34:21 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9DDFD3849ADC for ; Wed, 8 May 2024 00:34:19 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from zg8tmja5ljk3lje4ms43mwaa.icoremail.net (zg8tmja5ljk3lje4ms43mwaa.icoremail.net [209.97.181.73]) by sourceware.org (Postfix) with ESMTP id 9539D385843B for ; Wed, 8 May 2024 00:32:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9539D385843B Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=eswincomputing.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=eswincomputing.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 9539D385843B Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=209.97.181.73 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715128376; cv=none; b=eRubXrZfw0eEtsBL7oAvhvIgn2flABYpgOzuFUSr6u/Au45ehb8bHDvZuMY7rhHJON1VflahUOSHRsgnZIL05aNPI/BJpoOzWK0K6T1Y4y3r7muoqeR6kM0eNyJ26NZ47Rac8Wlb+GElV2JFXqAGdpV9hPjKO33+XZJ2b0gt1Is= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715128376; c=relaxed/simple; bh=js9NYXp9tz+EBxD+W9fDv9SwAEtKT94/ZiK53OXiRrc=; h=From:To:Subject:Date:Message-Id; b=JOK8Qtr5avJNQMvNfOfo0yS5DSXBfMtXiCF/Bf3wuAn8PYcVYV4O07cZ8pZ3vkxyw2RqOoecz0QRAcXoHuXSSEihBVgc30knws7pQPuPe19dZLNOnaju2B0etOTH0dO8vBc+9PzTQ6mSxAFwPZf7ETZ/wa8HmU0zncx4F0Ul5kk= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from localhost.localdomain (unknown [10.12.130.38]) by app2 (Coremail) with SMTP id TQJkCgC3ybvExzpmq1oKAA--.10794S5; Wed, 08 May 2024 08:31:07 +0800 (CST) From: Xiao Zeng To: gcc-patches@gcc.gnu.org Cc: jeffreyalaw@gmail.com, research_trasio@irq.a4lg.com, kito.cheng@gmail.com, palmer@dabbelt.com, zhengyu@eswincomputing.com, Xiao Zeng Subject: [PATCH v1 1/1] RISC-V: Nan-box the result of movbf on soft-bf16 Date: Wed, 8 May 2024 08:38:09 +0800 Message-Id: <20240508003809.24556-2-zengxiao@eswincomputing.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240508003809.24556-1-zengxiao@eswincomputing.com> References: <20240508003809.24556-1-zengxiao@eswincomputing.com> X-CM-TRANSID: TQJkCgC3ybvExzpmq1oKAA--.10794S5 X-Coremail-Antispam: 1UD129KBjvJXoWxtw15Ww18JFyDtw15Ww1DAwb_yoW7Xr43pa yUGayakr4rAF9xJw1fKa4fJr13Z3Z7G3yUu393Jr4jya9xJFWUG3ZIkw1avrW5WFZ8Zr43 uFZYkF9Ikw4xX3DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBI14x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jr4l82xGYIkIc2 x26xkF7I0E14v26r1I6r4UM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Xr0_Ar1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26F4UJVW0owA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_GcCE3s1l e2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI 8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwAC jcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc2xSY4AK6svPMxAIw28Icx kI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2Iq xVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwIxGrwCI42 IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY 6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aV CY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbec_DUUUUU== X-CM-SenderInfo: p2hqw5xldrqvxvzl0uprps33xlqjhudrp/ X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_NUMSUBJECT, KAM_SHORT, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP 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 1 This patch implements the Nan-box of bf16. 2 Please refer to the Nan-box implementation of hf16 in: 3 The discussion about Nan-box can be found on the website: 4 Below test are passed for this patch * The riscv fully regression test. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_legitimize_move): Expand movbf with Nan-boxing value. * config/riscv/riscv.md (*movbf_softfloat_boxing): New pattern. gcc/testsuite/ChangeLog: * gcc.target/riscv/_Bfloat16-nanboxing.c: New test. --- gcc/config/riscv/riscv.cc | 51 ++++++++++--------- gcc/config/riscv/riscv.md | 12 ++++- .../gcc.target/riscv/_Bfloat16-nanboxing.c | 38 ++++++++++++++ 3 files changed, 76 insertions(+), 25 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/_Bfloat16-nanboxing.c diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 545e68566dc..be2cb245733 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -3120,35 +3120,38 @@ riscv_legitimize_move (machine_mode mode, rtx dest, rtx src) } /* In order to fit NaN boxing, expand - (set FP_REG (reg:HF src)) + (set FP_REG (reg:HF/BF src)) to (set (reg:SI/DI mask) (const_int -65536) - (set (reg:SI/DI temp) (zero_extend:SI/DI (subreg:HI (reg:HF src) 0))) + (set (reg:SI/DI temp) (zero_extend:SI/DI (subreg:HI (reg:HF/BF src) 0))) (set (reg:SI/DI temp) (ior:SI/DI (reg:SI/DI mask) (reg:SI/DI temp))) - (set (reg:HF dest) (unspec:HF [ (reg:SI/DI temp) ] UNSPEC_FMV_SFP16_X)) + (set (reg:HF/BF dest) (unspec:HF/BF[ (reg:SI/DI temp) ] + UNSPEC_FMV_SFP16_X/UNSPEC_FMV_SBF16_X)) */ - if (TARGET_HARD_FLOAT - && !TARGET_ZFHMIN && mode == HFmode - && REG_P (dest) && FP_REG_P (REGNO (dest)) - && REG_P (src) && !FP_REG_P (REGNO (src)) - && can_create_pseudo_p ()) - { - rtx mask = force_reg (word_mode, gen_int_mode (-65536, word_mode)); - rtx temp = gen_reg_rtx (word_mode); - emit_insn (gen_extend_insn (temp, - simplify_gen_subreg (HImode, src, mode, 0), - word_mode, HImode, 1)); - if (word_mode == SImode) - emit_insn (gen_iorsi3 (temp, mask, temp)); - else - emit_insn (gen_iordi3 (temp, mask, temp)); - - riscv_emit_move (dest, gen_rtx_UNSPEC (HFmode, gen_rtvec (1, temp), - UNSPEC_FMV_SFP16_X)); - - return true; - } + if (TARGET_HARD_FLOAT + && ((!TARGET_ZFHMIN && mode == HFmode) + || (!TARGET_ZFBFMIN && mode == BFmode)) + && REG_P (dest) && FP_REG_P (REGNO (dest)) && REG_P (src) + && !FP_REG_P (REGNO (src)) && can_create_pseudo_p ()) + { + rtx mask = force_reg (word_mode, gen_int_mode (-65536, word_mode)); + rtx temp = gen_reg_rtx (word_mode); + emit_insn (gen_extend_insn (temp, + simplify_gen_subreg (HImode, src, mode, 0), + word_mode, HImode, 1)); + if (word_mode == SImode) + emit_insn (gen_iorsi3 (temp, mask, temp)); + else + emit_insn (gen_iordi3 (temp, mask, temp)); + + riscv_emit_move (dest, + gen_rtx_UNSPEC (mode, gen_rtvec (1, temp), + mode == HFmode ? UNSPEC_FMV_SFP16_X + : UNSPEC_FMV_SBF16_X)); + + return true; + } /* We need to deal with constants that would be legitimate immediate_operands but aren't legitimate move_operands. */ diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index 24558682eb8..236293e2fcd 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -86,8 +86,9 @@ ;; String unspecs UNSPEC_STRLEN - ;; Workaround for HFmode without hardware extension + ;; Workaround for HFmode and BFmode without hardware extension UNSPEC_FMV_SFP16_X + UNSPEC_FMV_SBF16_X ;; XTheadFmv moves UNSPEC_XTHEADFMV @@ -1926,6 +1927,15 @@ [(set_attr "type" "fmove") (set_attr "mode" "SF")]) +(define_insn "*movbf_softfloat_boxing" + [(set (match_operand:BF 0 "register_operand" "=f") + (unspec:BF [(match_operand:X 1 "register_operand" " r")] + UNSPEC_FMV_SBF16_X))] + "!TARGET_ZFBFMIN" + "fmv.w.x\t%0,%1" + [(set_attr "type" "fmove") + (set_attr "mode" "SF")]) + ;; ;; .................... ;; diff --git a/gcc/testsuite/gcc.target/riscv/_Bfloat16-nanboxing.c b/gcc/testsuite/gcc.target/riscv/_Bfloat16-nanboxing.c new file mode 100644 index 00000000000..11a73d22234 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/_Bfloat16-nanboxing.c @@ -0,0 +1,38 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64ifd -mabi=lp64d -mcmodel=medlow -O" } */ + +_Bfloat16 gvar = 9.87654; +union U +{ + unsigned short i16; + _Bfloat16 f16; +}; + +_Bfloat16 +test1 (unsigned short input) +{ + union U tmp; + tmp.i16 = input; + return tmp.f16; +} + +_Bfloat16 +test2 () +{ + return 1.234f; +} + +_Bfloat16 +test3 () +{ + return gvar; +} + +_Bfloat16 +test () +{ + return 0.0f; +} + +/* { dg-final { scan-assembler-times "li\[ \t\]" 4 } } */ +/* { dg-final { scan-assembler-times "fmv\.w\.x\[ \t\]" 4 } } */