diff --git a/llvm/include/llvm/IR/IntrinsicsAArch64.td b/llvm/include/llvm/IR/IntrinsicsAArch64.td --- a/llvm/include/llvm/IR/IntrinsicsAArch64.td +++ b/llvm/include/llvm/IR/IntrinsicsAArch64.td @@ -2791,6 +2791,16 @@ : DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_aarch64_svcount_ty, llvm_i32_ty], [IntrNoMem, ImmArg>]>; + // While (predicate-as-counter) intrinsics + foreach cmp = ["ge", "gt", "hi", "hs", "le", "lo", "ls", "lt"] in { + foreach ty = ["c8", "c16", "c32", "c64"] in { + def int_aarch64_sve_while # cmp # _ # ty + : DefaultAttrsIntrinsic<[llvm_aarch64_svcount_ty], + [llvm_i64_ty, llvm_i64_ty, llvm_i32_ty], + [IntrNoMem, ImmArg>]>; + } + } + // // SME2 Intrinsics // diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -512,6 +512,12 @@ def : Pat<(vtd (op vt1:$Op1, (i32 4))), (inst $Op1, 1)>; } +multiclass SVE2p1_While_PN_Pat { + def : Pat<(vtd (op vt1:$Op1, vt1:$Op2, (i32 2))), (inst $Op1, $Op2, 0)>; + def : Pat<(vtd (op vt1:$Op1, vt1:$Op2, (i32 4))), (inst $Op1, $Op2, 1)>; +} + class SVE_3_Op_Imm_Pat @@ -9590,6 +9596,15 @@ def _H : sve2p1_int_while_rr_pn; def _S : sve2p1_int_while_rr_pn; def _D : sve2p1_int_while_rr_pn; + + defm : SVE2p1_While_PN_Pat("int_aarch64_sve_" # mnemonic # "_c8"), + i64, !cast(NAME # _B)>; + defm : SVE2p1_While_PN_Pat("int_aarch64_sve_" # mnemonic # "_c16"), + i64, !cast(NAME # _H)>; + defm : SVE2p1_While_PN_Pat("int_aarch64_sve_" # mnemonic # "_c32"), + i64, !cast(NAME # _S)>; + defm : SVE2p1_While_PN_Pat("int_aarch64_sve_" # mnemonic # "_c64"), + i64, !cast(NAME # _D)>; } diff --git a/llvm/test/CodeGen/AArch64/sve2p1-intrinsics-while-pn.ll b/llvm/test/CodeGen/AArch64/sve2p1-intrinsics-while-pn.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/sve2p1-intrinsics-while-pn.ll @@ -0,0 +1,717 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2p1 < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 < %s | FileCheck %s + + +; +; WHILEGE +; + +define target("aarch64.svcount") @whilege_c8_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilege_c8_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilege pn8.b, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilege.c8(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilege_c8_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilege_c8_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilege pn8.b, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilege.c8(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilege_c16_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilege_c16_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilege pn8.h, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilege.c16(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilege_c16_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilege_c16_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilege pn8.h, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilege.c16(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilege_c32_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilege_c32_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilege pn8.s, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilege.c32(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilege_c32_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilege_c32_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilege pn8.s, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilege.c32(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilege_c64_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilege_c64_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilege pn8.d, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilege.c64(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilege_c64_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilege_c64_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilege pn8.d, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilege.c64(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + + +; +; WHILEGT +; + +define target("aarch64.svcount") @whilegt_c8_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilegt_c8_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilegt pn8.b, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c8(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilegt_c8_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilegt_c8_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilegt pn8.b, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c8(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilegt_c16_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilegt_c16_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilegt pn8.h, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c16(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilegt_c16_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilegt_c16_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilegt pn8.h, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c16(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilegt_c32_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilegt_c32_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilegt pn8.s, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c32(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilegt_c32_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilegt_c32_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilegt pn8.s, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c32(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilegt_c64_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilegt_c64_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilegt pn8.d, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c64(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilegt_c64_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilegt_c64_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilegt pn8.d, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c64(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + + +; +; WHILEHI +; + +define target("aarch64.svcount") @whilehi_c8_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehi_c8_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehi pn8.b, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c8(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehi_c8_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehi_c8_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehi pn8.b, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c8(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehi_c16_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehi_c16_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehi pn8.h, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c16(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehi_c16_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehi_c16_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehi pn8.h, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c16(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehi_c32_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehi_c32_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehi pn8.s, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c32(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehi_c32_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehi_c32_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehi pn8.s, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c32(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehi_c64_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehi_c64_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehi pn8.d, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c64(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehi_c64_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehi_c64_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehi pn8.d, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c64(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + + +; +; WHILEHS +; + +define target("aarch64.svcount") @whilehs_c8_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehs_c8_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehs pn8.b, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c8(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehs_c8_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehs_c8_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehs pn8.b, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c8(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehs_c16_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehs_c16_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehs pn8.h, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c16(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehs_c16_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehs_c16_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehs pn8.h, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c16(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehs_c32_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehs_c32_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehs pn8.s, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c32(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehs_c32_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehs_c32_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehs pn8.s, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c32(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehs_c64_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehs_c64_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehs pn8.d, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c64(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilehs_c64_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilehs_c64_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilehs pn8.d, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c64(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + + +; +; WHILELE +; + +define target("aarch64.svcount") @whilele_c8_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilele_c8_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilele pn8.b, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilele.c8(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilele_c8_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilele_c8_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilele pn8.b, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilele.c8(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilele_c16_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilele_c16_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilele pn8.h, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilele.c16(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilele_c16_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilele_c16_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilele pn8.h, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilele.c16(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilele_c32_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilele_c32_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilele pn8.s, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilele.c32(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilele_c32_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilele_c32_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilele pn8.s, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilele.c32(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilele_c64_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilele_c64_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilele pn8.d, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilele.c64(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilele_c64_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilele_c64_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilele pn8.d, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilele.c64(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + + +; +; WHILELO +; + +define target("aarch64.svcount") @whilelo_c8_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelo_c8_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelo pn8.b, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c8(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelo_c8_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelo_c8_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelo pn8.b, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c8(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelo_c16_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelo_c16_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelo pn8.h, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c16(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelo_c16_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelo_c16_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelo pn8.h, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c16(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelo_c32_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelo_c32_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelo pn8.s, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c32(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelo_c32_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelo_c32_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelo pn8.s, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c32(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelo_c64_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelo_c64_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelo pn8.d, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c64(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelo_c64_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelo_c64_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelo pn8.d, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c64(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + + +; +; WHILELS +; + +define target("aarch64.svcount") @whilels_c8_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilels_c8_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilels pn8.b, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilels.c8(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilels_c8_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilels_c8_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilels pn8.b, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilels.c8(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilels_c16_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilels_c16_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilels pn8.h, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilels.c16(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilels_c16_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilels_c16_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilels pn8.h, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilels.c16(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilels_c32_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilels_c32_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilels pn8.s, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilels.c32(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilels_c32_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilels_c32_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilels pn8.s, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilels.c32(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilels_c64_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilels_c64_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilels pn8.d, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilels.c64(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilels_c64_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilels_c64_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilels pn8.d, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilels.c64(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + + +; +; WHILELT +; + +define target("aarch64.svcount") @whilelt_c8_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelt_c8_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelt pn8.b, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c8(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelt_c8_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelt_c8_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelt pn8.b, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c8(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelt_c16_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelt_c16_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelt pn8.h, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c16(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelt_c16_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelt_c16_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelt pn8.h, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c16(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelt_c32_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelt_c32_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelt pn8.s, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c32(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelt_c32_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelt_c32_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelt pn8.s, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c32(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelt_c64_vl2(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelt_c64_vl2: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelt pn8.d, x0, x1, vlx2 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c64(i64 %a, i64 %b, i32 2) + ret target("aarch64.svcount") %out +} + +define target("aarch64.svcount") @whilelt_c64_vl4(i64 %a, i64 %b) nounwind { +; CHECK-LABEL: whilelt_c64_vl4: +; CHECK: // %bb.0: +; CHECK-NEXT: whilelt pn8.d, x0, x1, vlx4 +; CHECK-NEXT: mov p0.b, p8.b +; CHECK-NEXT: ret + %out = call target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c64(i64 %a, i64 %b, i32 4) + ret target("aarch64.svcount") %out +} + + +declare target("aarch64.svcount") @llvm.aarch64.sve.whilege.c8(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilege.c16(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilege.c32(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilege.c64(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c8(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c16(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c32(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilegt.c64(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c8(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c16(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c32(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilehi.c64(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c8(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c16(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c32(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilehs.c64(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilele.c8(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilele.c16(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilele.c32(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilele.c64(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c8(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c16(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c32(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilelo.c64(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilels.c8(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilels.c16(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilels.c32(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilels.c64(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c8(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c16(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c32(i64, i64, i32) +declare target("aarch64.svcount") @llvm.aarch64.sve.whilelt.c64(i64, i64, i32)