From 30757714d0fc1d9cd81815a81ab51bad011aa87d Mon Sep 17 00:00:00 2001 From: Momchil Velikov Date: Tue, 19 Nov 2024 14:23:44 +0000 Subject: [PATCH 1/2] [AArch64] Generate zeroing forms of certain SVE2.2 instructions (10/11) --- .../lib/Target/AArch64/AArch64SVEInstrInfo.td | 10 +- llvm/lib/Target/AArch64/SVEInstrFormats.td | 38 +- .../test/CodeGen/AArch64/zeroing-forms-rev.ll | 1480 +++++++++++++++++ 3 files changed, 1520 insertions(+), 8 deletions(-) create mode 100644 llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll 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..a7d22ceb78a60 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>; + + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _B)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _S)>; + def : 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>; + + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _S)>; + def : 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>; + + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _S)>; + def : 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>; + + def : 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>; + + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : 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..b7c2b1fcd9984 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll @@ -0,0 +1,1480 @@ +; 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_u8_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_u8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u8_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( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u8_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( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u8_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_u8_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_u16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_u16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u16_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( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u16_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( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u16_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_u16_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_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u32_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( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u32_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( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u32_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_u32_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_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u64_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_u64_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_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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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_u16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_u16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u16_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u16_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u16_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_u16_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_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u32_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u32_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u32_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_u32_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_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u64_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_u64_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_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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevh_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u32_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u32_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_u32_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_u32_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_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevh_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_u64_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_u64_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_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( undef, %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( undef, %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( undef, %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( undef, %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_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevw_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revw z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevw_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevw_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revw z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevw_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevw_u64_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_u64_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_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( undef, %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( undef, %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_u8_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_u8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u8_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u8_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u8_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_u8_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_u16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_u16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u16_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u16_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u16_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_u16_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_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u32_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u32_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u32_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_u32_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_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u64_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( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u64_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_u64_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_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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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( undef, %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 +} From 3cb1299aeaca313a176bce194bb410616d4becb0 Mon Sep 17 00:00:00 2001 From: Momchil Velikov Date: Fri, 20 Dec 2024 18:01:48 +0000 Subject: [PATCH 2/2] [fixup] Rebase, update tests, add tests for the new all-true patterns, change undef to poison --- llvm/lib/Target/AArch64/SVEInstrFormats.td | 36 +- .../test/CodeGen/AArch64/zeroing-forms-rev.ll | 1404 +++++++++-------- 2 files changed, 731 insertions(+), 709 deletions(-) diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index a7d22ceb78a60..597458283644e 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -7627,10 +7627,10 @@ multiclass sve_int_perm_rev_rbit_z { def _S : sve_int_perm_rev_z<0b10, 0b0111, asm, ZPR32>; def _D : sve_int_perm_rev_z<0b11, 0b0111, asm, ZPR64>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _B)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _H)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _S)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _D)>; + 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 { @@ -7638,37 +7638,37 @@ multiclass sve_int_perm_rev_revb_z { def _S : sve_int_perm_rev_z<0b10, 0b0100, asm, ZPR32>; def _D : sve_int_perm_rev_z<0b11, 0b0100, asm, ZPR64>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _H)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _S)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _D)>; + 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 { def _S : sve_int_perm_rev_z<0b10, 0b0101, asm, ZPR32>; def _D : sve_int_perm_rev_z<0b11, 0b0101, asm, ZPR64>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _S)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _D)>; + 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>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _D)>; + 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>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; - def : 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)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; - def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; - def : 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 index b7c2b1fcd9984..d7a51c8cf8062 100644 --- a/llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll @@ -7,190 +7,6 @@ target triple = "aarch64-linux" -define @test_svrbit_u8_x_1( %pg, %x) { -; CHECK-LABEL: test_svrbit_u8_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: rbit z0.b, p0/m, z0.b -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrbit_u8_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( undef, %pg, %x) - ret %0 -} - -define @test_svrbit_u8_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrbit_u8_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: rbit z0.b, p0/m, z1.b -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrbit_u8_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( undef, %pg, %x) - ret %0 -} - -define @test_svrbit_u8_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrbit_u8_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_u8_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_u16_x_1( %pg, %x) { -; CHECK-LABEL: test_svrbit_u16_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: rbit z0.h, p0/m, z0.h -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrbit_u16_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( undef, %pg, %x) - ret %0 -} - -define @test_svrbit_u16_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrbit_u16_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: rbit z0.h, p0/m, z1.h -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrbit_u16_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( undef, %pg, %x) - ret %0 -} - -define @test_svrbit_u16_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrbit_u16_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_u16_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_u32_x_1( %pg, %x) { -; CHECK-LABEL: test_svrbit_u32_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: rbit z0.s, p0/m, z0.s -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrbit_u32_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( undef, %pg, %x) - ret %0 -} - -define @test_svrbit_u32_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrbit_u32_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: rbit z0.s, p0/m, z1.s -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrbit_u32_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( undef, %pg, %x) - ret %0 -} - -define @test_svrbit_u32_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrbit_u32_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_u32_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_u64_x_1( %pg, %x) { -; CHECK-LABEL: test_svrbit_u64_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: rbit z0.d, p0/m, z0.d -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrbit_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrbit_u64_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrbit_u64_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: rbit z0.d, p0/m, z1.d -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrbit_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrbit_u64_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrbit_u64_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_u64_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_svrbit_s8_x_1( %pg, %x) { ; CHECK-LABEL: test_svrbit_s8_x_1: ; CHECK: // %bb.0: // %entry @@ -202,7 +18,7 @@ define @test_svrbit_s8_x_1( %pg, @llvm.aarch64.sve.rbit.nxv16i8( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( poison, %pg, %x) ret %0 } @@ -217,7 +33,7 @@ define @test_svrbit_s8_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: rbit z0.b, p0/z, z1.b ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( poison, %pg, %x) ret %0 } @@ -248,7 +64,7 @@ define @test_svrbit_s16_x_1( %pg, @llvm.aarch64.sve.rbit.nxv8i16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( poison, %pg, %x) ret %0 } @@ -263,7 +79,7 @@ define @test_svrbit_s16_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: rbit z0.h, p0/z, z1.h ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( poison, %pg, %x) ret %0 } @@ -294,7 +110,7 @@ define @test_svrbit_s32_x_1( %pg, @llvm.aarch64.sve.rbit.nxv4i32( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( poison, %pg, %x) ret %0 } @@ -309,7 +125,7 @@ define @test_svrbit_s32_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: rbit z0.s, p0/z, z1.s ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( poison, %pg, %x) ret %0 } @@ -340,7 +156,7 @@ define @test_svrbit_s64_x_1( %pg, @llvm.aarch64.sve.rbit.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( poison, %pg, %x) ret %0 } @@ -355,7 +171,7 @@ define @test_svrbit_s64_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: rbit z0.d, p0/z, z1.d ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( poison, %pg, %x) ret %0 } @@ -375,144 +191,6 @@ entry: ret %0 } -define @test_svrevb_u16_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevb_u16_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revb z0.h, p0/m, z0.h -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevb_u16_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevb_u16_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevb_u16_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revb z0.h, p0/m, z1.h -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevb_u16_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevb_u16_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevb_u16_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_u16_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_u32_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevb_u32_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revb z0.s, p0/m, z0.s -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevb_u32_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevb_u32_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevb_u32_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revb z0.s, p0/m, z1.s -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevb_u32_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevb_u32_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevb_u32_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_u32_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_u64_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevb_u64_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revb z0.d, p0/m, z0.d -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevb_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevb_u64_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevb_u64_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revb z0.d, p0/m, z1.d -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevb_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevb_u64_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevb_u64_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_u64_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_svrevb_s16_x_1( %pg, %x) { ; CHECK-LABEL: test_svrevb_s16_x_1: ; CHECK: // %bb.0: // %entry @@ -524,7 +202,7 @@ define @test_svrevb_s16_x_1( %pg, @llvm.aarch64.sve.revb.nxv8i16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( poison, %pg, %x) ret %0 } @@ -539,7 +217,7 @@ define @test_svrevb_s16_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: revb z0.h, p0/z, z1.h ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( poison, %pg, %x) ret %0 } @@ -570,7 +248,7 @@ define @test_svrevb_s32_x_1( %pg, @llvm.aarch64.sve.revb.nxv4i32( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( poison, %pg, %x) ret %0 } @@ -585,7 +263,7 @@ define @test_svrevb_s32_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: revb z0.s, p0/z, z1.s ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( poison, %pg, %x) ret %0 } @@ -616,7 +294,7 @@ define @test_svrevb_s64_x_1( %pg, @llvm.aarch64.sve.revb.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( poison, %pg, %x) ret %0 } @@ -631,7 +309,7 @@ define @test_svrevb_s64_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: revb z0.d, p0/z, z1.d ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( poison, %pg, %x) ret %0 } @@ -651,44 +329,44 @@ entry: ret %0 } -define @test_svrevh_u32_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevh_u32_x_1: +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_u32_x_1: +; 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( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( poison, %pg, %x) ret %0 } -define @test_svrevh_u32_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevh_u32_x_2: +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_u32_x_2: +; 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( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( poison, %pg, %x) ret %0 } -define @test_svrevh_u32_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevh_u32_z: +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_u32_z: +; 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 @@ -697,100 +375,8 @@ entry: ret %0 } -define @test_svrevh_u64_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevh_u64_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revh z0.d, p0/m, z0.d -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevh_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevh_u64_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevh_u64_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revh z0.d, p0/m, z1.d -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevh_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevh_u64_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevh_u64_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_u64_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_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( undef, %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( undef, %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: +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 @@ -800,7 +386,7 @@ define @test_svrevh_s64_x_1( %pg, @llvm.aarch64.sve.revh.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( poison, %pg, %x) ret %0 } @@ -815,7 +401,7 @@ define @test_svrevh_s64_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: revh z0.d, p0/z, z1.d ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( poison, %pg, %x) ret %0 } @@ -835,52 +421,6 @@ entry: ret %0 } -define @test_svrevw_u64_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevw_u64_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revw z0.d, p0/m, z0.d -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevw_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevw_u64_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevw_u64_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revw z0.d, p0/m, z1.d -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevw_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevw_u64_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevw_u64_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_u64_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_svrevw_s64_x_1( %pg, %x) { ; CHECK-LABEL: test_svrevw_s64_x_1: ; CHECK: // %bb.0: // %entry @@ -892,7 +432,7 @@ define @test_svrevw_s64_x_1( %pg, @llvm.aarch64.sve.revw.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( poison, %pg, %x) ret %0 } @@ -907,7 +447,7 @@ define @test_svrevw_s64_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: revw z0.d, p0/z, z1.d ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( poison, %pg, %x) ret %0 } @@ -927,190 +467,6 @@ entry: ret %0 } -define @test_svrevd_u8_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevd_u8_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revd z0.q, p0/m, z0.q -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevd_u8_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevd_u8_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevd_u8_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revd z0.q, p0/m, z1.q -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevd_u8_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevd_u8_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevd_u8_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_u8_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_u16_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevd_u16_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revd z0.q, p0/m, z0.q -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevd_u16_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevd_u16_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevd_u16_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revd z0.q, p0/m, z1.q -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevd_u16_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevd_u16_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevd_u16_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_u16_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_u32_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevd_u32_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revd z0.q, p0/m, z0.q -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevd_u32_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevd_u32_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevd_u32_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revd z0.q, p0/m, z1.q -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevd_u32_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevd_u32_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevd_u32_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_u32_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_u64_x_1( %pg, %x) { -; CHECK-LABEL: test_svrevd_u64_x_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revd z0.q, p0/m, z0.q -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevd_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevd_u64_x_2( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevd_u64_x_2: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: revd z0.q, p0/m, z1.q -; CHECK-NEXT: ret -; -; CHECK-2p2-LABEL: test_svrevd_u64_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( undef, %pg, %x) - ret %0 -} - -define @test_svrevd_u64_z( %pg, double %z0, %x) { -; CHECK-LABEL: test_svrevd_u64_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_u64_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_s8_x_1( %pg, %x) { ; CHECK-LABEL: test_svrevd_s8_x_1: ; CHECK: // %bb.0: // %entry @@ -1122,7 +478,7 @@ define @test_svrevd_s8_x_1( %pg, @llvm.aarch64.sve.revd.nxv16i8( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( poison, %pg, %x) ret %0 } @@ -1137,7 +493,7 @@ define @test_svrevd_s8_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( poison, %pg, %x) ret %0 } @@ -1168,7 +524,7 @@ define @test_svrevd_s16_x_1( %pg, @llvm.aarch64.sve.revd.nxv8i16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( poison, %pg, %x) ret %0 } @@ -1183,7 +539,7 @@ define @test_svrevd_s16_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( poison, %pg, %x) ret %0 } @@ -1214,7 +570,7 @@ define @test_svrevd_s32_x_1( %pg, @llvm.aarch64.sve.revd.nxv4i32( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( poison, %pg, %x) ret %0 } @@ -1229,7 +585,7 @@ define @test_svrevd_s32_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( poison, %pg, %x) ret %0 } @@ -1260,7 +616,7 @@ define @test_svrevd_s64_x_1( %pg, @llvm.aarch64.sve.revd.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( poison, %pg, %x) ret %0 } @@ -1275,7 +631,7 @@ define @test_svrevd_s64_x_2( %pg, double %z0 ; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( poison, %pg, %x) ret %0 } @@ -1306,7 +662,7 @@ define @test_svrevd_f16_x_1( %pg, @llvm.aarch64.sve.revd.nxv8f16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( poison, %pg, %x) ret %0 } @@ -1321,7 +677,7 @@ define @test_svrevd_f16_x_2( %pg, double %z ; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( poison, %pg, %x) ret %0 } @@ -1352,7 +708,7 @@ define @test_svrevd_bf16_x_1( %pg, @llvm.aarch64.sve.revd.nxv8bf16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( poison, %pg, %x) ret %0 } @@ -1367,7 +723,7 @@ define @test_svrevd_bf16_x_2( %pg, double ; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( poison, %pg, %x) ret %0 } @@ -1398,7 +754,7 @@ define @test_svrevd_f32_x_1( %pg, @llvm.aarch64.sve.revd.nxv4f32( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( poison, %pg, %x) ret %0 } @@ -1413,7 +769,7 @@ define @test_svrevd_f32_x_2( %pg, double % ; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( poison, %pg, %x) ret %0 } @@ -1444,7 +800,7 @@ define @test_svrevd_f64_x_1( %pg, @llvm.aarch64.sve.revd.nxv2f64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( poison, %pg, %x) ret %0 } @@ -1459,7 +815,7 @@ define @test_svrevd_f64_x_2( %pg, double ; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q ; CHECK-2p2-NEXT: ret entry: - %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( undef, %pg, %x) + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( poison, %pg, %x) ret %0 } @@ -1478,3 +834,669 @@ 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 +}