https://gcc.gnu.org/g:61400b669688848dc764d946a4d16fb51a27e286

commit r15-6617-g61400b669688848dc764d946a4d16fb51a27e286
Author: Deng Jianbo <dengjia...@loongson.cn>
Date:   Tue Dec 31 19:33:23 2024 +0800

    LoongArch: Optimize initializing fp resgister to zero
    
    In LoongArch, currently uses instruction movgr2fr.{d|w} to move zero
    from fixed-point register to floating-pointer regsiter for initializing
    fp register to zero. When LSX or LASX is enabled, we can use instruction
    vxor.v which has lower latency than instruction movgr2fr.{d|w} to set fp
    register to zero directly.
    
    gcc/ChangeLog:
    
            * config/loongarch/loongarch.cc (loongarch_output_move):
            Optimize instructions for initializing fp regsiter to zero.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/loongarch/mov-zero-1.c: New test.
            * gcc.target/loongarch/mov-zero-2.c: New test.

Diff:
---
 gcc/config/loongarch/loongarch.cc               |  2 ++
 gcc/testsuite/gcc.target/loongarch/mov-zero-1.c | 15 +++++++++++++++
 gcc/testsuite/gcc.target/loongarch/mov-zero-2.c | 15 +++++++++++++++
 3 files changed, 32 insertions(+)

diff --git a/gcc/config/loongarch/loongarch.cc 
b/gcc/config/loongarch/loongarch.cc
index 89237c377e77..d506354c48a0 100644
--- a/gcc/config/loongarch/loongarch.cc
+++ b/gcc/config/loongarch/loongarch.cc
@@ -4772,6 +4772,8 @@ loongarch_output_move (rtx dest, rtx src)
                      gcc_unreachable ();
                    }
                }
+             if (ISA_HAS_LSX && src == CONST0_RTX (GET_MODE (src)))
+               return "vxor.v\t%w0,%w0,%w0";
 
              return dbl_p ? "movgr2fr.d\t%0,%z1" : "movgr2fr.w\t%0,%z1";
            }
diff --git a/gcc/testsuite/gcc.target/loongarch/mov-zero-1.c 
b/gcc/testsuite/gcc.target/loongarch/mov-zero-1.c
new file mode 100644
index 000000000000..4744f2f2fdb9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/mov-zero-1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mlsx" } */
+/* { dg-final { scan-assembler-times "vxor\\.v" 2 } } */
+
+double
+get_double_zero ()
+{
+  return 0;
+}
+
+float
+get_float_zero ()
+{
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/loongarch/mov-zero-2.c 
b/gcc/testsuite/gcc.target/loongarch/mov-zero-2.c
new file mode 100644
index 000000000000..6cb48052d0b4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/mov-zero-2.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mno-lsx" } */
+/* { dg-final { scan-assembler-times "movgr2fr" 2 } } */
+
+double
+get_double_zero ()
+{
+  return 0;
+}
+
+float
+get_float_zero ()
+{
+  return 0;
+}

Reply via email to