[llvm] [AArch64] Enable using SVE2 bit-sel instructions with Neon types. (PR #146906)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 3 07:58:00 PDT 2025
================
@@ -0,0 +1,325 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=NEON
+; RUN: llc -mtriple=aarch64-unknown-linux-gnu -mattr=+sve2 < %s | FileCheck %s --check-prefix=SVE2
+
+; Test SVE2 BSL/NBSL/BSL1N/BSL2N code generation for:
+; #define BSL(x,y,z) ( ((x) & (z)) | ( (y) & ~(z)))
+; #define NBSL(x,y,z) (~(((x) & (z)) | ( (y) & ~(z))))
+; #define BSL1N(x,y,z) ( (~(x) & (z)) | ( (y) & ~(z)))
+; #define BSL2N(x,y,z) ( ((x) & (z)) | (~(y) & ~(z)))
+;
+; See also llvm/test/CodeGen/AArch64/sve2-bsl.ll.
+
+; Test basic codegen.
+
+define <1 x i64> @bsl_v1i64(<1 x i64> %0, <1 x i64> %1, <1 x i64> %2) {
+; NEON-LABEL: bsl_v1i64:
+; NEON: // %bb.0:
+; NEON-NEXT: bif v0.8b, v1.8b, v2.8b
+; NEON-NEXT: ret
+;
+; SVE2-LABEL: bsl_v1i64:
+; SVE2: // %bb.0:
+; SVE2-NEXT: bif v0.8b, v1.8b, v2.8b
+; SVE2-NEXT: ret
+ %4 = and <1 x i64> %2, %0
+ %5 = xor <1 x i64> %2, splat (i64 -1)
+ %6 = and <1 x i64> %1, %5
+ %7 = or <1 x i64> %4, %6
+ ret <1 x i64> %7
+}
+
+define <1 x i64> @nbsl_v1i64(<1 x i64> %0, <1 x i64> %1, <1 x i64> %2) {
+; NEON-LABEL: nbsl_v1i64:
+; NEON: // %bb.0:
+; NEON-NEXT: bif v0.8b, v1.8b, v2.8b
+; NEON-NEXT: mvn v0.8b, v0.8b
+; NEON-NEXT: ret
+;
+; SVE2-LABEL: nbsl_v1i64:
+; SVE2: // %bb.0:
+; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0
+; SVE2-NEXT: // kill: def $d2 killed $d2 def $z2
+; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1
+; SVE2-NEXT: nbsl z0.d, z0.d, z1.d, z2.d
+; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0
+; SVE2-NEXT: ret
+ %4 = and <1 x i64> %2, %0
+ %5 = xor <1 x i64> %2, splat (i64 -1)
+ %6 = and <1 x i64> %1, %5
+ %7 = or <1 x i64> %4, %6
+ %8 = xor <1 x i64> %7, splat (i64 -1)
+ ret <1 x i64> %8
+}
+
+define <1 x i64> @bsl1n_v1i64(<1 x i64> %0, <1 x i64> %1, <1 x i64> %2) {
+; NEON-LABEL: bsl1n_v1i64:
+; NEON: // %bb.0:
+; NEON-NEXT: mvn v0.8b, v0.8b
+; NEON-NEXT: bif v0.8b, v1.8b, v2.8b
+; NEON-NEXT: ret
+;
+; SVE2-LABEL: bsl1n_v1i64:
+; SVE2: // %bb.0:
+; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0
+; SVE2-NEXT: // kill: def $d2 killed $d2 def $z2
+; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1
+; SVE2-NEXT: bsl1n z0.d, z0.d, z1.d, z2.d
+; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0
+; SVE2-NEXT: ret
+ %4 = xor <1 x i64> %0, splat (i64 -1)
+ %5 = and <1 x i64> %2, %4
+ %6 = xor <1 x i64> %2, splat (i64 -1)
+ %7 = and <1 x i64> %1, %6
+ %8 = or <1 x i64> %5, %7
+ ret <1 x i64> %8
+}
+
+define <1 x i64> @bsl2n_v1i64(<1 x i64> %0, <1 x i64> %1, <1 x i64> %2) {
+; NEON-LABEL: bsl2n_v1i64:
+; NEON: // %bb.0:
+; NEON-NEXT: and v0.8b, v2.8b, v0.8b
+; NEON-NEXT: orr v1.8b, v2.8b, v1.8b
+; NEON-NEXT: orn v0.8b, v0.8b, v1.8b
+; NEON-NEXT: ret
+;
+; SVE2-LABEL: bsl2n_v1i64:
+; SVE2: // %bb.0:
+; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0
+; SVE2-NEXT: // kill: def $d2 killed $d2 def $z2
+; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1
+; SVE2-NEXT: bsl2n z0.d, z0.d, z1.d, z2.d
+; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0
+; SVE2-NEXT: ret
+ %4 = and <1 x i64> %2, %0
+ %5 = or <1 x i64> %2, %1
+ %6 = xor <1 x i64> %5, splat (i64 -1)
+ %7 = or <1 x i64> %4, %6
+ ret <1 x i64> %7
+}
+
+define <2 x i64> @bsl_v2i64(<2 x i64> %0, <2 x i64> %1, <2 x i64> %2) {
+; NEON-LABEL: bsl_v2i64:
+; NEON: // %bb.0:
+; NEON-NEXT: bif v0.16b, v1.16b, v2.16b
+; NEON-NEXT: ret
+;
+; SVE2-LABEL: bsl_v2i64:
+; SVE2: // %bb.0:
+; SVE2-NEXT: bif v0.16b, v1.16b, v2.16b
+; SVE2-NEXT: ret
+ %4 = and <2 x i64> %2, %0
+ %5 = xor <2 x i64> %2, splat (i64 -1)
+ %6 = and <2 x i64> %1, %5
+ %7 = or <2 x i64> %4, %6
+ ret <2 x i64> %7
+}
+
+define <2 x i64> @nbsl_v2i64(<2 x i64> %0, <2 x i64> %1, <2 x i64> %2) {
----------------
david-arm wrote:
Is it worth having at least one test in this file for fixed-width vectors that aren't 64 or 128 bits, i.e. <4 x i8> or <2 x i16>? I'd expect in this case they'd just get promoted to <4 x i16> or <2 x i32>.
https://github.com/llvm/llvm-project/pull/146906
More information about the llvm-commits
mailing list