; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mattr=+sve < %s | FileCheck %s target triple = "aarch64-unknown-linux-gnu" ; ; AND ; define @and_i8( %pg, %a, %b) { ; CHECK-LABEL: and_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.and.u.nxv16i8( %pg, %a, %b) ret %out } define @and_i16( %pg, %a, %b) { ; CHECK-LABEL: and_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.and.u.nxv8i16( %pg, %a, %b) ret %out } define @and_i32( %pg, %a, %b) { ; CHECK-LABEL: and_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.and.u.nxv4i32( %pg, %a, %b) ret %out } define @and_i64( %pg, %a, %b) { ; CHECK-LABEL: and_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.and.u.nxv2i64( %pg, %a, %b) ret %out } ; ; AND (immediate) ; define @and_imm_i8( %pg, %a) { ; CHECK-LABEL: and_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.b, z0.b, #0x3 ; CHECK-NEXT: ret %imm = insertelement undef, i8 3, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.and.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @and_imm_i16( %pg, %a) { ; CHECK-LABEL: and_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.h, z0.h, #0x4 ; CHECK-NEXT: ret %imm = insertelement undef, i16 4, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.and.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @and_imm_i32( %pg, %a) { ; CHECK-LABEL: and_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.s, z0.s, #0x10 ; CHECK-NEXT: ret %imm = insertelement undef, i32 16, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.and.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @and_imm_i64( %pg, %a) { ; CHECK-LABEL: and_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.d, z0.d, #0x20 ; CHECK-NEXT: ret %imm = insertelement undef, i64 32, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.and.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; EOR ; define @eor_i8( %pg, %a, %b) { ; CHECK-LABEL: eor_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: eor z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.eor.u.nxv16i8( %pg, %a, %b) ret %out } define @eor_i16( %pg, %a, %b) { ; CHECK-LABEL: eor_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: eor z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.eor.u.nxv8i16( %pg, %a, %b) ret %out } define @eor_i32( %pg, %a, %b) { ; CHECK-LABEL: eor_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: eor z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.eor.u.nxv4i32( %pg, %a, %b) ret %out } define @eor_i64( %pg, %a, %b) { ; CHECK-LABEL: eor_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: eor z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.eor.u.nxv2i64( %pg, %a, %b) ret %out } ; ; EOR (immediate) ; define @eor_imm_i8( %pg, %a) { ; CHECK-LABEL: eor_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: eor z0.b, z0.b, #0x7 ; CHECK-NEXT: ret %imm = insertelement undef, i8 7, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.eor.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @eor_imm_i16( %pg, %a) { ; CHECK-LABEL: eor_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: eor z0.h, z0.h, #0x8 ; CHECK-NEXT: ret %imm = insertelement undef, i16 8, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.eor.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @eor_imm_i32( %pg, %a) { ; CHECK-LABEL: eor_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: eor z0.s, z0.s, #0x10 ; CHECK-NEXT: ret %imm = insertelement undef, i32 16, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.eor.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @eor_imm_i64( %pg, %a) { ; CHECK-LABEL: eor_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: eor z0.d, z0.d, #0x20 ; CHECK-NEXT: ret %imm = insertelement undef, i64 32, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.eor.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; ORR ; define @orr_i8( %pg, %a, %b) { ; CHECK-LABEL: orr_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: orr z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.orr.u.nxv16i8( %pg, %a, %b) ret %out } define @orr_i16( %pg, %a, %b) { ; CHECK-LABEL: orr_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: orr z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.orr.u.nxv8i16( %pg, %a, %b) ret %out } define @orr_i32( %pg, %a, %b) { ; CHECK-LABEL: orr_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: orr z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.orr.u.nxv4i32( %pg, %a, %b) ret %out } define @orr_i64( %pg, %a, %b) { ; CHECK-LABEL: orr_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: orr z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.orr.u.nxv2i64( %pg, %a, %b) ret %out } ; ; ORR (immediate) ; define @orr_imm_i8( %pg, %a) { ; CHECK-LABEL: orr_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: orr z0.b, z0.b, #0x8 ; CHECK-NEXT: ret %imm = insertelement undef, i8 8, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.orr.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @orr_imm_i16( %pg, %a) { ; CHECK-LABEL: orr_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: orr z0.h, z0.h, #0xc ; CHECK-NEXT: ret %imm = insertelement undef, i16 12, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.orr.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @orr_imm_i32( %pg, %a) { ; CHECK-LABEL: orr_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: orr z0.s, z0.s, #0x10 ; CHECK-NEXT: ret %imm = insertelement undef, i32 16, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.orr.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @orr_imm_i64( %pg, %a) { ; CHECK-LABEL: orr_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: orr z0.d, z0.d, #0x20 ; CHECK-NEXT: ret %imm = insertelement undef, i64 32, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.orr.u.nxv2i64( %pg, %a, %imm.splat) ret %out } ; ; BIC ; define @bic_i8( %pg, %a, %b) { ; CHECK-LABEL: bic_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: bic z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.bic.u.nxv16i8( %pg, %a, %b) ret %out } define @bic_i16( %pg, %a, %b) { ; CHECK-LABEL: bic_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: bic z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.bic.u.nxv8i16( %pg, %a, %b) ret %out } define @bic_i32( %pg, %a, %b) { ; CHECK-LABEL: bic_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: bic z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.bic.u.nxv4i32( %pg, %a, %b) ret %out } define @bic_i64( %pg, %a, %b) { ; CHECK-LABEL: bic_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: bic z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.bic.u.nxv2i64( %pg, %a, %b) ret %out } ; ; BIC (immediate) ; define @bic_imm_i8( %pg, %a) { ; CHECK-LABEL: bic_imm_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.b, z0.b, #0xf8 ; CHECK-NEXT: ret %imm = insertelement undef, i8 7, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.bic.u.nxv16i8( %pg, %a, %imm.splat) ret %out } define @bic_imm_i16( %pg, %a) { ; CHECK-LABEL: bic_imm_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.h, z0.h, #0xfff7 ; CHECK-NEXT: ret %imm = insertelement undef, i16 8, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.bic.u.nxv8i16( %pg, %a, %imm.splat) ret %out } define @bic_imm_i32( %pg, %a) { ; CHECK-LABEL: bic_imm_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.s, z0.s, #0xffffffef ; CHECK-NEXT: ret %imm = insertelement undef, i32 16, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.bic.u.nxv4i32( %pg, %a, %imm.splat) ret %out } define @bic_imm_i64( %pg, %a) { ; CHECK-LABEL: bic_imm_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: and z0.d, z0.d, #0xffffffffffffffdf ; CHECK-NEXT: ret %imm = insertelement undef, i64 32, i32 0 %imm.splat = shufflevector %imm, undef, zeroinitializer %out = call @llvm.aarch64.sve.bic.u.nxv2i64( %pg, %a, %imm.splat) ret %out } declare @llvm.aarch64.sve.and.u.nxv16i8(, , ) declare @llvm.aarch64.sve.and.u.nxv8i16(, , ) declare @llvm.aarch64.sve.and.u.nxv4i32(, , ) declare @llvm.aarch64.sve.and.u.nxv2i64(, , ) declare @llvm.aarch64.sve.eor.u.nxv16i8(, , ) declare @llvm.aarch64.sve.eor.u.nxv8i16(, , ) declare @llvm.aarch64.sve.eor.u.nxv4i32(, , ) declare @llvm.aarch64.sve.eor.u.nxv2i64(, , ) declare @llvm.aarch64.sve.orr.u.nxv16i8(, , ) declare @llvm.aarch64.sve.orr.u.nxv8i16(, , ) declare @llvm.aarch64.sve.orr.u.nxv4i32(, , ) declare @llvm.aarch64.sve.orr.u.nxv2i64(, , ) declare @llvm.aarch64.sve.bic.u.nxv16i8(, , ) declare @llvm.aarch64.sve.bic.u.nxv8i16(, , ) declare @llvm.aarch64.sve.bic.u.nxv4i32(, , ) declare @llvm.aarch64.sve.bic.u.nxv2i64(, , )