; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve -asm-verbose=0 < %s | FileCheck %s ; ; Masked Loads ; define @masked_load_nxv2i64(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv2i64: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv2i64(ptr %a, i32 8, %mask, poison) ret %load } define @masked_load_nxv4i32(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv4i32: ; CHECK-NEXT: ld1w { z0.s }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv4i32(ptr %a, i32 4, %mask, poison) ret %load } define @masked_load_nxv8i16(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv8i16: ; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv8i16(ptr %a, i32 2, %mask, poison) ret %load } define @masked_load_nxv16i8(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv16i8: ; CHECK-NEXT: ld1b { z0.b }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv16i8(ptr %a, i32 1, %mask, poison) ret %load } define @masked_load_nxv2f64(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv2f64: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv2f64(ptr %a, i32 8, %mask, poison) ret %load } define @masked_load_nxv2f32(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv2f32: ; CHECK-NEXT: ld1w { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv2f32(ptr %a, i32 4, %mask, poison) ret %load } define @masked_load_nxv2f16(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv2f16: ; CHECK-NEXT: ld1h { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv2f16(ptr %a, i32 2, %mask, poison) ret %load } define @masked_load_nxv2bf16(ptr %a, %mask) nounwind #0 { ; CHECK-LABEL: masked_load_nxv2bf16: ; CHECK-NEXT: ld1h { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv2bf16(ptr %a, i32 2, %mask, poison) ret %load } define @masked_load_nxv4f32(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv4f32: ; CHECK-NEXT: ld1w { z0.s }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv4f32(ptr %a, i32 4, %mask, poison) ret %load } define @masked_load_nxv4f16(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv4f16: ; CHECK-NEXT: ld1h { z0.s }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv4f16(ptr %a, i32 2, %mask, poison) ret %load } define @masked_load_nxv4bf16(ptr %a, %mask) nounwind #0 { ; CHECK-LABEL: masked_load_nxv4bf16: ; CHECK-NEXT: ld1h { z0.s }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv4bf16(ptr %a, i32 2, %mask, poison) ret %load } define @masked_load_nxv8f16(ptr %a, %mask) nounwind { ; CHECK-LABEL: masked_load_nxv8f16: ; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv8f16(ptr %a, i32 2, %mask, poison) ret %load } define @masked_load_nxv8bf16(ptr %a, %mask) nounwind #0 { ; CHECK-LABEL: masked_load_nxv8bf16: ; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0] ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv8bf16(ptr %a, i32 2, %mask, poison) ret %load } define @masked_load_passthru(ptr %a, %mask, %passthru) nounwind { ; CHECK-LABEL: masked_load_passthru: ; CHECK-NEXT: ld1w { z1.s }, p0/z, [x0] ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret %load = call @llvm.masked.load.nxv4i32(ptr %a, i32 4, %mask, %passthru) ret %load } ; Masked load requires promotion define @masked_load_nxv2i16(ptr noalias %in, %mask) { ; CHECK-LABEL: masked_load_nxv2i16 ; CHECK: ld1h { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %wide.load = call @llvm.masked.load.nxv2i16(ptr %in, i32 2, %mask, poison) ret %wide.load } ; ; Masked Stores ; define void @masked_store_nxv2i64(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv2i64: ; CHECK-NEXT: st1d { z0.d }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv2i64( %val, ptr %a, i32 8, %mask) ret void } define void @masked_store_nxv4i32(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv4i32: ; CHECK-NEXT: st1w { z0.s }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv4i32( %val, ptr %a, i32 4, %mask) ret void } define void @masked_store_nxv8i16(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv8i16: ; CHECK-NEXT: st1h { z0.h }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv8i16( %val, ptr %a, i32 2, %mask) ret void } define void @masked_store_nxv16i8(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv16i8: ; CHECK-NEXT: st1b { z0.b }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv16i8( %val, ptr %a, i32 1, %mask) ret void } define void @masked_store_nxv2f64(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv2f64: ; CHECK-NEXT: st1d { z0.d }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv2f64( %val, ptr %a, i32 8, %mask) ret void } define void @masked_store_nxv2f32(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv2f32: ; CHECK-NEXT: st1w { z0.d }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv2f32( %val, ptr %a, i32 4, %mask) ret void } define void @masked_store_nxv2f16(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv2f16: ; CHECK-NEXT: st1h { z0.d }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv2f16( %val, ptr %a, i32 4, %mask) ret void } define void @masked_store_nxv4f32(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv4f32: ; CHECK-NEXT: st1w { z0.s }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv4f32( %val, ptr %a, i32 4, %mask) ret void } define void @masked_store_nxv4f16(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv4f16: ; CHECK-NEXT: st1h { z0.s }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv4f16( %val, ptr %a, i32 2, %mask) ret void } define void @masked_store_nxv8f16(ptr %a, %val, %mask) nounwind { ; CHECK-LABEL: masked_store_nxv8f16: ; CHECK-NEXT: st1h { z0.h }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv8f16( %val, ptr %a, i32 2, %mask) ret void } define void @masked_store_nxv2bf16(ptr %a, %val, %mask) nounwind #0 { ; CHECK-LABEL: masked_store_nxv2bf16: ; CHECK-NEXT: st1h { z0.d }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv2bf16( %val, ptr %a, i32 2, %mask) ret void } define void @masked_store_nxv4bf16(ptr %a, %val, %mask) nounwind #0 { ; CHECK-LABEL: masked_store_nxv4bf16: ; CHECK-NEXT: st1h { z0.s }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv4bf16( %val, ptr %a, i32 2, %mask) ret void } define void @masked_store_nxv8bf16(ptr %a, %val, %mask) nounwind #0 { ; CHECK-LABEL: masked_store_nxv8bf16: ; CHECK-NEXT: st1h { z0.h }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv8bf16( %val, ptr %a, i32 2, %mask) ret void } ; ; Masked load store of pointer data type ; ; Pointer of integer type define @masked.load.nxv2p0i8(ptr %vector_ptr, %mask) nounwind { ; CHECK-LABEL: masked.load.nxv2p0i8: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %v = call @llvm.masked.load.nxv2p0.p0(ptr %vector_ptr, i32 8, %mask, poison) ret %v } define @masked.load.nxv2p0i16(ptr %vector_ptr, %mask) nounwind { ; CHECK-LABEL: masked.load.nxv2p0i16: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %v = call @llvm.masked.load.nxv2p0.p0(ptr %vector_ptr, i32 8, %mask, poison) ret %v } define @masked.load.nxv2p0i32(ptr %vector_ptr, %mask) nounwind { ; CHECK-LABEL: masked.load.nxv2p0i32: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %v = call @llvm.masked.load.nxv2p0.p0(ptr %vector_ptr, i32 8, %mask, poison) ret %v } define @masked.load.nxv2p0i64(ptr %vector_ptr, %mask) nounwind { ; CHECK-LABEL: masked.load.nxv2p0i64: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %v = call @llvm.masked.load.nxv2p0.p0(ptr %vector_ptr, i32 8, %mask, poison) ret %v } ; Pointer of floating-point type define @masked.load.nxv2p0bf16(ptr %vector_ptr, %mask) nounwind #0 { ; CHECK-LABEL: masked.load.nxv2p0bf16: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %v = call @llvm.masked.load.nxv2p0.p0(ptr %vector_ptr, i32 8, %mask, poison) ret %v } define @masked.load.nxv2p0f16(ptr %vector_ptr, %mask) nounwind { ; CHECK-LABEL: masked.load.nxv2p0f16: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %v = call @llvm.masked.load.nxv2p0.p0(ptr %vector_ptr, i32 8, %mask, poison) ret %v } define @masked.load.nxv2p0f32(ptr %vector_ptr, %mask) nounwind { ; CHECK-LABEL: masked.load.nxv2p0f32: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %v = call @llvm.masked.load.nxv2p0.p0(ptr %vector_ptr, i32 8, %mask, poison) ret %v } define @masked.load.nxv2p0f64(ptr %vector_ptr, %mask) nounwind { ; CHECK-LABEL: masked.load.nxv2p0f64: ; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] ; CHECK-NEXT: ret %v = call @llvm.masked.load.nxv2p0.p0(ptr %vector_ptr, i32 8, %mask, poison) ret %v } ; Pointer of array type define void @masked.store.nxv2p0a64i16( %data, ptr %vector_ptr, %mask) nounwind { ; CHECK-LABEL: masked.store.nxv2p0a64i16: ; CHECK-NEXT: st1d { z0.d }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv2p0.p0( %data, ptr %vector_ptr, i32 8, %mask) ret void } ; Pointer of struct type %struct = type { ptr, i32 } define void @masked.store.nxv2p0s_struct( %data, ptr %vector_ptr, %mask) nounwind { ; CHECK-LABEL: masked.store.nxv2p0s_struct: ; CHECK-NEXT: st1d { z0.d }, p0, [x0] ; CHECK-NEXT: ret call void @llvm.masked.store.nxv2p0.p0( %data, ptr %vector_ptr, i32 8, %mask) ret void } declare @llvm.masked.load.nxv2i64(ptr, i32, , ) declare @llvm.masked.load.nxv4i32(ptr, i32, , ) declare @llvm.masked.load.nxv2i16(ptr, i32, , ) declare @llvm.masked.load.nxv8i16(ptr, i32, , ) declare @llvm.masked.load.nxv16i8(ptr, i32, , ) declare @llvm.masked.load.nxv2f64(ptr, i32, , ) declare @llvm.masked.load.nxv2f32(ptr, i32, , ) declare @llvm.masked.load.nxv2f16(ptr, i32, , ) declare @llvm.masked.load.nxv4f32(ptr, i32, , ) declare @llvm.masked.load.nxv4f16(ptr, i32, , ) declare @llvm.masked.load.nxv8f16(ptr, i32, , ) declare @llvm.masked.load.nxv2bf16(ptr, i32, , ) declare @llvm.masked.load.nxv4bf16(ptr, i32, , ) declare @llvm.masked.load.nxv8bf16(ptr, i32, , ) declare void @llvm.masked.store.nxv2i64(, ptr, i32, ) declare void @llvm.masked.store.nxv4i32(, ptr, i32, ) declare void @llvm.masked.store.nxv8i16(, ptr, i32, ) declare void @llvm.masked.store.nxv16i8(, ptr, i32, ) declare void @llvm.masked.store.nxv2f64(, ptr, i32, ) declare void @llvm.masked.store.nxv2f32(, ptr, i32, ) declare void @llvm.masked.store.nxv2f16(, ptr, i32, ) declare void @llvm.masked.store.nxv4f32(, ptr, i32, ) declare void @llvm.masked.store.nxv4f16(, ptr, i32, ) declare void @llvm.masked.store.nxv8f16(, ptr, i32, ) declare void @llvm.masked.store.nxv2bf16(, ptr, i32, ) declare void @llvm.masked.store.nxv4bf16(, ptr, i32, ) declare void @llvm.masked.store.nxv8bf16(, ptr, i32, ) declare @llvm.masked.load.nxv2p0.p0(ptr, i32 immarg, , ) declare void @llvm.masked.store.nxv2p0.p0(, ptr, i32 immarg, ) ; +bf16 is required for the bfloat version. attributes #0 = { "target-features"="+sve,+bf16" }