diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index 7dd6d49bf2022..f6ea15ef164a1 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -4339,11 +4339,11 @@ let Predicates = [HasSVE2p2orSME2p2] in { defm LASTP_XPP : sve_int_pcount_pred_tmp<0b010, "lastp">; // SVE reverse within elements, zeroing predicate - defm RBIT_ZPzZ : sve_int_perm_rev_rbit_z<"rbit">; - defm REVB_ZPzZ : sve_int_perm_rev_revb_z<"revb">; - defm REVH_ZPzZ : sve_int_perm_rev_revh_z<"revh">; - def REVW_ZPzZ : sve_int_perm_rev_z<0b11, 0b0110, "revw", ZPR64>; - def REVD_ZPzZ : sve_int_perm_rev_z<0b00, 0b1110, "revd", ZPR128>; + defm RBIT_ZPzZ : sve_int_perm_rev_rbit_z<"rbit", AArch64rbit_mt>; + defm REVB_ZPzZ : sve_int_perm_rev_revb_z<"revb", AArch64revb_mt>; + defm REVH_ZPzZ : sve_int_perm_rev_revh_z<"revh", AArch64revh_mt>; + defm REVW_ZPzZ : sve_int_perm_rev_revw_z<"revw", AArch64revw_mt>; + defm REVD_ZPzZ : sve_int_perm_rev_revd_z<"revd", AArch64revd_mt>; } // End HasSME2p2orSVE2p2 //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index 0ef862fc1a27c..597458283644e 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -7621,22 +7621,54 @@ class sve_int_perm_rev_z sz, bits<4> opc, string asm, let hasSideEffects = 0; } -multiclass sve_int_perm_rev_rbit_z { +multiclass sve_int_perm_rev_rbit_z { def _B : sve_int_perm_rev_z<0b00, 0b0111, asm, ZPR8>; def _H : sve_int_perm_rev_z<0b01, 0b0111, asm, ZPR16>; def _S : sve_int_perm_rev_z<0b10, 0b0111, asm, ZPR32>; def _D : sve_int_perm_rev_z<0b11, 0b0111, asm, ZPR64>; + + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _B)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _H)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _S)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _D)>; } -multiclass sve_int_perm_rev_revb_z { +multiclass sve_int_perm_rev_revb_z { def _H : sve_int_perm_rev_z<0b01, 0b0100, asm, ZPR16>; def _S : sve_int_perm_rev_z<0b10, 0b0100, asm, ZPR32>; def _D : sve_int_perm_rev_z<0b11, 0b0100, asm, ZPR64>; + + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _H)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _S)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _D)>; } -multiclass sve_int_perm_rev_revh_z { +multiclass sve_int_perm_rev_revh_z { def _S : sve_int_perm_rev_z<0b10, 0b0101, asm, ZPR32>; def _D : sve_int_perm_rev_z<0b11, 0b0101, asm, ZPR64>; + + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _S)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _D)>; +} + +multiclass sve_int_perm_rev_revw_z { + def _D : sve_int_perm_rev_z<0b11, 0b0110, asm, ZPR64>; + + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME # _D)>; +} + +multiclass sve_int_perm_rev_revd_z { + def NAME : sve_int_perm_rev_z<0b00, 0b1110, asm, ZPR128>; + + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + defm : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; } class sve_int_perm_cpy_r sz8_64, string asm, ZPRRegOp zprty, diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll new file mode 100644 index 0000000000000..d7a51c8cf8062 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll @@ -0,0 +1,1502 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve2p1 < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svrbit_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: rbit z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: rbit z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: rbit z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: rbit z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevb_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svrevb_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svrevb_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevb_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrevb_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrevb_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevb_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevb_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevb_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevh_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevh_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrevh_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrevh_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revh z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevh_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevh_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevh_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevh_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revh z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevw_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevw_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revw z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revw z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevw_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevw_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revw z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revw z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevw_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevw_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revw z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revw z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_bf16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_bf16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_bf16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_bf16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_bf16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_bf16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_bf16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_bf16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_bf16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_nxv16i8_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrbit_nxv16i8_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: rbit z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_nxv16i8_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.b +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_nxv16i8_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrbit_nxv16i8_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: rbit z0.b, p0/m, z2.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_nxv16i8_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.b +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z2.b +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( %x, %pg, %y) + ret %0 +} + +define @test_svrbit_nxv8i16_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrbit_nxv8i16_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: rbit z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_nxv8i16_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_nxv8i16_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrbit_nxv8i16_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: rbit z0.h, p0/m, z2.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_nxv8i16_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z2.h +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( %x, %pg, %y) + ret %0 +} + +define @test_svrbit_nxv4i32_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrbit_nxv4i32_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: rbit z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_nxv4i32_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_nxv4i32_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrbit_nxv4i32_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: rbit z0.s, p0/m, z2.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_nxv4i32_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z2.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( %x, %pg, %y) + ret %0 +} + +define @test_svrbit_nxv2i64_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrbit_nxv2i64_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: rbit z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_nxv2i64_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrbit_nxv2i64_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrbit_nxv2i64_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: rbit z0.d, p0/m, z2.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_nxv2i64_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z2.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( %x, %pg, %y) + ret %0 +} + +define @test_svrevb_nxv8i16_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevb_nxv8i16_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: revb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_nxv8i16_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: revb z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svrevb_nxv8i16_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevb_nxv8i16_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: revb z0.h, p0/m, z2.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_nxv8i16_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: revb z0.h, p0/z, z2.h +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( %x, %pg, %y) + ret %0 +} + +define @test_svrevb_nxv4i32_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevb_nxv4i32_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: revb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_nxv4i32_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: revb z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrevb_nxv4i32_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevb_nxv4i32_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: revb z0.s, p0/m, z2.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_nxv4i32_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: revb z0.s, p0/z, z2.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( %x, %pg, %y) + ret %0 +} + +define @test_svrevb_nxv2i64_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevb_nxv2i64_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_nxv2i64_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revb z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevb_nxv2i64_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevb_nxv2i64_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revb z0.d, p0/m, z2.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_nxv2i64_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revb z0.d, p0/z, z2.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( %x, %pg, %y) + ret %0 +} + +define @test_svrevh_nxv4i32_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevh_nxv4i32_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: revh z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_nxv4i32_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: revh z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrevh_nxv4i32_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevh_nxv4i32_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: revh z0.s, p0/m, z2.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_nxv4i32_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: revh z0.s, p0/z, z2.s +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( %x, %pg, %y) + ret %0 +} + +define @test_svrevh_nxv2i64_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevh_nxv2i64_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revh z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_nxv2i64_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revh z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevh_nxv2i64_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevh_nxv2i64_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revh z0.d, p0/m, z2.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_nxv2i64_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revh z0.d, p0/z, z2.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( %x, %pg, %y) + ret %0 +} + +define @test_svrevw_nxv2i64_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevw_nxv2i64_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revw z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_nxv2i64_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revw z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevw_nxv2i64_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevw_nxv2i64_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revw z0.d, p0/m, z2.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_nxv2i64_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revw z0.d, p0/z, z2.d +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( %x, %pg, %y) + ret %0 +} + +define @test_svrevd_nxv16i8_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevd_nxv16i8_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv16i8_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.b +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_nxv16i8_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevd_nxv16i8_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: revd z0.q, p0/m, z2.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv16i8_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.b +; CHECK-2p2-NEXT: revd z0.q, p0/z, z2.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( %x, %pg, %y) + ret %0 +} + +define @test_svrevd_nxv8i16_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevd_nxv8i16_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv8i16_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_nxv8i16_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevd_nxv8i16_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: revd z0.q, p0/m, z2.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv8i16_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: revd z0.q, p0/z, z2.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( %x, %pg, %y) + ret %0 +} + +define @test_svrevd_nxv4i32_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevd_nxv4i32_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv4i32_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_nxv4i32_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevd_nxv4i32_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: revd z0.q, p0/m, z2.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv4i32_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: revd z0.q, p0/z, z2.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( %x, %pg, %y) + ret %0 +} + +define @test_svrevd_nxv2i64_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevd_nxv2i64_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv2i64_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_nxv2i64_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevd_nxv2i64_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revd z0.q, p0/m, z2.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv2i64_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revd z0.q, p0/z, z2.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( %x, %pg, %y) + ret %0 +} + +define @test_svrevd_nxv8f16_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevd_nxv8f16_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv8f16_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_nxv8f16_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevd_nxv8f16_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: revd z0.q, p0/m, z2.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv8f16_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: revd z0.q, p0/z, z2.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( %x, %pg, %y) + ret %0 +} + +define @test_svrevd_nxv8bf16_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevd_nxv8bf16_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv8bf16_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_nxv8bf16_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevd_nxv8bf16_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: revd z0.q, p0/m, z2.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv8bf16_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.h +; CHECK-2p2-NEXT: revd z0.q, p0/z, z2.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv8i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( %x, %pg, %y) + ret %0 +} + +define @test_svrevd_nxv4f32_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevd_nxv4f32_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv4f32_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_nxv4f32_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevd_nxv4f32_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: revd z0.q, p0/m, z2.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv4f32_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.s +; CHECK-2p2-NEXT: revd z0.q, p0/z, z2.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv4i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( %x, %pg, %y) + ret %0 +} + +define @test_svrevd_nxv2f64_ptrue_u(double %z0, %x) { +; CHECK-LABEL: test_svrevd_nxv2f64_ptrue_u: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv2f64_ptrue_u: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( poison, %pg, %x) + ret %0 +} + +define @test_svrevd_nxv2f64_ptrue(double %z0, %x, %y) { +; CHECK-LABEL: test_svrevd_nxv2f64_ptrue: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: revd z0.q, p0/m, z2.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_nxv2f64_ptrue: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ptrue p0.d +; CHECK-2p2-NEXT: revd z0.q, p0/z, z2.q +; CHECK-2p2-NEXT: ret +entry: + %pg = call @llvm.aarch64.sve.ptrue.nxv2i1(i32 31) + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( %x, %pg, %y) + ret %0 +}