llvmbot wrote:
@llvm/pr-subscribers-llvm-ir
@llvm/pr-subscribers-clang
Author: Hassnaa Hamdi (hassnaaHamdi)
Changes
According to specifications in
[ARM-software/acle/pull/309](https://github.com/ARM-software/acle/pull/309)
Add following intrinsics:
```
// svmax single,multi
svbfloat16x2_t svmax_single_bf16_x2(svbfloat16x2_t zdn, svbfloat16_t zm)
svbfloat16x4_t svmax_single_bf16_x4(svbfloat16x4_t zdn, svbfloat16_t zm)
svbfloat16x2_t svmax_bf16_x2(svbfloat16x2_t zdn, svbfloat16x2_t zm)
svbfloat16x4_t svmax_bf16_x4(svbfloat16x4_t zdn, svbfloat16x4_t zm)
```
```
// svmin single,multi
svbfloat16x2_t svmin_single_bf16_x2(svbfloat16x2_t zdn, svbfloat16_t zm)
svbfloat16x4_t svmin_single_bf16_x4(svbfloat16x4_t zdn, svbfloat16_t zm)
svbfloat16x2_t svmin_bf16_x2(svbfloat16x2_t zdn, svbfloat16x2_t zm)
svbfloat16x4_t svmin_bf16_x4(svbfloat16x4_t zdn, svbfloat16x4_t zm)
```
```
// svmaxnm single,multi
svbfloat16x2_t svmaxnm_single_bf16_x2(svbfloat16x2_t zdn, svbfloat16_t zm)
svbfloat16x4_t svmaxnm_single_bf16_x4(svbfloat16x4_t zdn, svbfloat16_t zm)
svbfloat16x2_t svmaxnm_bf16_x2(svbfloat16x2_t zdn, svbfloat16x2_t zm)
svbfloat16x4_t svmaxnm_bf16_x4(svbfloat16x4_t zdn, svbfloat16x4_t zm)
```
```
// svminnm single,multi
svbfloat16x2_t svminnm_single_bf16_x2(svbfloat16x2_t zdn, svbfloat16_t zm)
svbfloat16x4_t svminnm_single_bf16_x4(svbfloat16x4_t zdn, svbfloat16_t zm)
svbfloat16x2_t svminnm_bf16_x2(svbfloat16x2_t zdn, svbfloat16x2_t zm)
svbfloat16x4_t svminnm_bf16_x4(svbfloat16x4_t zdn, svbfloat16x4_t zm)
```
- Variations other than bfloat16 had been already supported.
---
Patch is 124.44 KiB, truncated to 20.00 KiB below, full version:
https://github.com/llvm/llvm-project/pull/90105.diff
9 Files Affected:
- (modified) clang/include/clang/Basic/arm_sve.td (+28)
- (modified) clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_max.c
(+145-5)
- (modified) clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_maxnm.c
(+145-5)
- (modified) clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_min.c
(+145-5)
- (modified) clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_minnm.c
(+145-5)
- (modified) llvm/include/llvm/IR/IntrinsicsAArch64.td (+2-2)
- (modified) llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp (+113-1)
- (modified) llvm/test/CodeGen/AArch64/sme2-intrinsics-max.ll (+125-1)
- (modified) llvm/test/CodeGen/AArch64/sme2-intrinsics-min.ll (+126-1)
``diff
diff --git a/clang/include/clang/Basic/arm_sve.td
b/clang/include/clang/Basic/arm_sve.td
index 6cc249837d3f3d..884ca6a3363421 100644
--- a/clang/include/clang/Basic/arm_sve.td
+++ b/clang/include/clang/Basic/arm_sve.td
@@ -2111,6 +2111,20 @@ let TargetGuard = "sme2" in {
defm MIN_MULTI_X4 : MinMaxIntr<"min", "","x4", "444">;
}
+multiclass BFMinMaxIntr {
+ def SVBF # NAME # _SINGLE_X2 : SInst<"sv" # name # "[_single_{d}_x2]",
"22d", "b", MergeNone, "aarch64_sve_bf" # name # "_single_x2", [IsStreaming],
[]>;
+ def SVBF # NAME # _SINGLE_X4 : SInst<"sv" # name # "[_single_{d}_x4]",
"44d", "b", MergeNone, "aarch64_sve_bf" # name # "_single_x4", [IsStreaming],
[]>;
+
+ def SVBF # NAME # _MULTI_X2 : SInst<"sv" # name # "[_{d}_x2]", "222", "b",
MergeNone, "aarch64_sve_bf" # name # "_x2", [IsStreaming], []>;
+ def SVBF # NAME # _MULTI_X4 : SInst<"sv" # name # "[_{d}_x4]", "444", "b",
MergeNone, "aarch64_sve_bf" # name # "_x4", [IsStreaming], []>;
+}
+
+let TargetGuard = "sme2,b16b16" in {
+// == BFMIN / BFMAX ==
+ defm SVMIN : BFMinMaxIntr<"min">;
+ defm SVMAX : BFMinMaxIntr<"max">;
+}
+
multiclass SInstMinMaxByVector {
def NAME # _SINGLE_X2 : SInst<"sv" # name # "nm[_single_{d}_x2]", "22d",
"hfd", MergeNone, "aarch64_sve_f" # name # "nm_single_x2", [IsStreaming], []>;
def NAME # _SINGLE_X4 : SInst<"sv" # name # "nm[_single_{d}_x4]", "44d",
"hfd", MergeNone, "aarch64_sve_f" # name # "nm_single_x4", [IsStreaming], []>;
@@ -2125,6 +2139,20 @@ let TargetGuard = "sme2" in {
defm SVMAXNM : SInstMinMaxByVector<"max">;
}
+multiclass SInstBFMinMaxByVector {
+ def SVBF # NAME # _SINGLE_X2 : SInst<"sv" # name # "[_single_{d}_x2]",
"22d", "b", MergeNone, "aarch64_sve_bf" # name # "_single_x2", [IsStreaming],
[]>;
+ def SVBF # NAME # _SINGLE_X4 : SInst<"sv" # name # "[_single_{d}_x4]",
"44d", "b", MergeNone, "aarch64_sve_bf" # name # "_single_x4", [IsStreaming],
[]>;
+
+ def SVBF # NAME # _MULTI_X2 : SInst<"sv" # name # "[_{d}_x2]", "222", "b",
MergeNone, "aarch64_sve_bf" # name # "_x2", [IsStreaming], []>;
+ def SVBF # NAME # _MULTI_X4 : SInst<"sv" # name # "[_{d}_x4]", "444", "b",
MergeNone, "aarch64_sve_bf" # name # "_x4", [IsStreaming], []>;
+}
+
+let TargetGuard = "sme2,b16b16" in {
+// == BFMINNM / BFMAXNM ==
+ defm SVMINNM : SInstBFMinMaxByVector<"minnm">;
+ defm SVMAXNM : SInstBFMinMaxByVector<"maxnm">;
+}
+
let TargetGuard = "sme2" in {
// FRINTA / FRINTM / FRINTN / FRINTP
def SVRINTA_X2 : SInst<"svrinta[_{d}_x2]", "22", "f", MergeNone,
"aarch64_sve_frinta_x2", [IsStreaming],