]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
LoongArch: Implement vector cbranch optab for LSX and LASX
authorJiahao Xu <xujiahao@loongson.cn>
Wed, 25 Dec 2024 09:59:36 +0000 (17:59 +0800)
committerLulu Cheng <chenglulu@loongson.cn>
Tue, 31 Dec 2024 09:36:03 +0000 (17:36 +0800)
In order to support vectorization of loops with multiple exits, this
patch adds the implementation of the conditional branch optab for
LoongArch LSX/LASX instructions.

This patch causes the gen-vect-{2,25}.c tests to fail.  This is because
the support for vectorizing loops with multiple exits has vectorized
the loop checking the results.  The failure is due to an issue in the
test case's own implementation.

gcc/ChangeLog:

* config/loongarch/simd.md (cbranch<mode>4): New expander.

gcc/testsuite/ChangeLog:

* lib/target-supports.exp (check_effective_target_vect_early_break_hw,
check_effective_target_vect_early_break): Support LoongArch LSX.
* gcc.target/loongarch/vector/lasx/lasx-vseteqz.c: New test.
* gcc.target/loongarch/vector/lsx/lsx-vseteqz.c: New test.

Co-authored-by: Deng Jianbo <dengjianbo@loongson.cn>
gcc/config/loongarch/simd.md
gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-vseteqz.c [new file with mode: 0644]
gcc/testsuite/gcc.target/loongarch/vector/lsx/lsx-vseteqz.c [new file with mode: 0644]
gcc/testsuite/lib/target-supports.exp

index fc3d98a43402f3ec4dfd7e34ba647e97477a0fd1..4d0069027535b71f25c608081757880f8558d6f9 100644 (file)
   DONE;
 })
 
+;; cbranch
+(define_expand "cbranch<mode>4"
+ [(set (pc)
+       (if_then_else
+         (match_operator 0 "equality_operator"
+           [(match_operand:IVEC 1 "register_operand")
+            (match_operand:IVEC 2 "reg_or_vector_same_val_operand")])
+         (label_ref (match_operand 3 ""))
+         (pc)))]
+ ""
+{
+  RTX_CODE code = GET_CODE (operands[0]);
+  rtx tmp = operands[1];
+  rtx const0 = CONST0_RTX (SImode);
+
+  /* If comparing against a non-zero vector we have to do a comparison first
+    so we can have a != 0 comparison with the result.  */
+  if (operands[2] != CONST0_RTX (<MODE>mode))
+    {
+      tmp = gen_reg_rtx (<MODE>mode);
+      emit_insn (gen_xor<mode>3 (tmp, operands[1], operands[2]));
+    }
+
+  if (code == NE)
+    emit_jump_insn (gen_<simd_isa>_<x>bnz_v_b (operands[3], tmp, const0));
+  else
+    emit_jump_insn (gen_<simd_isa>_<x>bz_v_b (operands[3], tmp, const0));
+  DONE;
+})
+
 ; The LoongArch SX Instructions.
 (include "lsx.md")
 
diff --git a/gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-vseteqz.c b/gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-vseteqz.c
new file mode 100644 (file)
index 0000000..1f69a80
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -mlasx" } */
+/* { dg-final { scan-assembler "\txvset.*.v\t" } } */
+/* { dg-final { scan-assembler  "bcnez" } } */
+
+int
+foo (int N)
+{
+  for (int i = 0; i <= N; i++)
+    if (i * i == N)
+      return i;
+  return -1;
+}
+
diff --git a/gcc/testsuite/gcc.target/loongarch/vector/lsx/lsx-vseteqz.c b/gcc/testsuite/gcc.target/loongarch/vector/lsx/lsx-vseteqz.c
new file mode 100644 (file)
index 0000000..2536bb7
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -mlsx" } */
+/* { dg-final { scan-assembler "\tvset.*.v\t" } } */
+/* { dg-final { scan-assembler  "bcnez" } } */
+
+int
+foo (int N)
+{
+  for (int i = 0; i <= N; i++)
+    if (i * i == N)
+      return i;
+
+  return -1;
+}
+
index a16e9534ccddcc100c2356279d7d830750d7948e..30ee528d230816227fd40249ef424e24b4c16142 100644 (file)
@@ -4431,6 +4431,7 @@ proc check_effective_target_vect_early_break { } {
        || [check_effective_target_sse4]
        || [istarget amdgcn-*-*]
        || [check_effective_target_riscv_v]
+       || [check_effective_target_loongarch_sx]
        }}]
 }
 
@@ -4447,6 +4448,7 @@ proc check_effective_target_vect_early_break_hw { } {
        || [check_sse4_hw_available]
        || [istarget amdgcn-*-*]
        || [check_effective_target_riscv_v_ok]
+       || [check_effective_target_loongarch_sx_hw]
        }}]
 }