107 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve -aarch64-enable-mgather-combine=0 < %s | FileCheck %s3; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve -aarch64-enable-mgather-combine=1 < %s | FileCheck %s4 5define <vscale x 2 x i64> @masked_gather_nxv2i16(ptr %base, <vscale x 2 x i64> %offsets, <vscale x 2 x i1> %mask) {6; CHECK-LABEL: masked_gather_nxv2i16:7; CHECK: // %bb.0:8; CHECK-NEXT: ld1h { z0.d }, p0/z, [x0, z0.d, lsl #1]9; CHECK-NEXT: ret10 %ptrs = getelementptr i16, ptr %base, <vscale x 2 x i64> %offsets11 %vals = call <vscale x 2 x i16> @llvm.masked.gather.nxv2i16(<vscale x 2 x ptr> %ptrs, i32 2, <vscale x 2 x i1> %mask, <vscale x 2 x i16> poison)12 %vals.zext = zext <vscale x 2 x i16> %vals to <vscale x 2 x i64>13 ret <vscale x 2 x i64> %vals.zext14}15 16define <vscale x 2 x i64> @masked_gather_nxv2i32(ptr %base, <vscale x 2 x i64> %offsets, <vscale x 2 x i1> %mask) {17; CHECK-LABEL: masked_gather_nxv2i32:18; CHECK: // %bb.0:19; CHECK-NEXT: ld1w { z0.d }, p0/z, [x0, z0.d, lsl #2]20; CHECK-NEXT: ret21 %ptrs = getelementptr i32, ptr %base, <vscale x 2 x i64> %offsets22 %vals = call <vscale x 2 x i32> @llvm.masked.gather.nxv2i32(<vscale x 2 x ptr> %ptrs, i32 4, <vscale x 2 x i1> %mask, <vscale x 2 x i32> poison)23 %vals.zext = zext <vscale x 2 x i32> %vals to <vscale x 2 x i64>24 ret <vscale x 2 x i64> %vals.zext25}26 27define <vscale x 2 x i64> @masked_gather_nxv2i64(ptr %base, <vscale x 2 x i64> %offsets, <vscale x 2 x i1> %mask) {28; CHECK-LABEL: masked_gather_nxv2i64:29; CHECK: // %bb.0:30; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0, z0.d, lsl #3]31; CHECK-NEXT: ret32 %ptrs = getelementptr i64, ptr %base, <vscale x 2 x i64> %offsets33 %vals = call <vscale x 2 x i64> @llvm.masked.gather.nxv2i64(<vscale x 2 x ptr> %ptrs, i32 8, <vscale x 2 x i1> %mask, <vscale x 2 x i64> poison)34 ret <vscale x 2 x i64> %vals35}36 37define <vscale x 2 x half> @masked_gather_nxv2f16(ptr %base, <vscale x 2 x i64> %offsets, <vscale x 2 x i1> %mask) {38; CHECK-LABEL: masked_gather_nxv2f16:39; CHECK: // %bb.0:40; CHECK-NEXT: ld1h { z0.d }, p0/z, [x0, z0.d, lsl #1]41; CHECK-NEXT: ret42 %ptrs = getelementptr half, ptr %base, <vscale x 2 x i64> %offsets43 %vals = call <vscale x 2 x half> @llvm.masked.gather.nxv2f16(<vscale x 2 x ptr> %ptrs, i32 2, <vscale x 2 x i1> %mask, <vscale x 2 x half> poison)44 ret <vscale x 2 x half> %vals45}46 47define <vscale x 2 x bfloat> @masked_gather_nxv2bf16(ptr %base, <vscale x 2 x i64> %offsets, <vscale x 2 x i1> %mask) #0 {48; CHECK-LABEL: masked_gather_nxv2bf16:49; CHECK: // %bb.0:50; CHECK-NEXT: ld1h { z0.d }, p0/z, [x0, z0.d, lsl #1]51; CHECK-NEXT: ret52 %ptrs = getelementptr bfloat, ptr %base, <vscale x 2 x i64> %offsets53 %vals = call <vscale x 2 x bfloat> @llvm.masked.gather.nxv2bf16(<vscale x 2 x ptr> %ptrs, i32 2, <vscale x 2 x i1> %mask, <vscale x 2 x bfloat> poison)54 ret <vscale x 2 x bfloat> %vals55}56 57define <vscale x 2 x float> @masked_gather_nxv2f32(ptr %base, <vscale x 2 x i64> %offsets, <vscale x 2 x i1> %mask) {58; CHECK-LABEL: masked_gather_nxv2f32:59; CHECK: // %bb.0:60; CHECK-NEXT: ld1w { z0.d }, p0/z, [x0, z0.d, lsl #2]61; CHECK-NEXT: ret62 %ptrs = getelementptr float, ptr %base, <vscale x 2 x i64> %offsets63 %vals = call <vscale x 2 x float> @llvm.masked.gather.nxv2f32(<vscale x 2 x ptr> %ptrs, i32 4, <vscale x 2 x i1> %mask, <vscale x 2 x float> poison)64 ret <vscale x 2 x float> %vals65}66 67define <vscale x 2 x double> @masked_gather_nxv2f64(ptr %base, <vscale x 2 x i64> %offsets, <vscale x 2 x i1> %mask) {68; CHECK-LABEL: masked_gather_nxv2f64:69; CHECK: // %bb.0:70; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0, z0.d, lsl #3]71; CHECK-NEXT: ret72 %ptrs = getelementptr double, ptr %base, <vscale x 2 x i64> %offsets73 %vals.sext = call <vscale x 2 x double> @llvm.masked.gather.nxv2f64(<vscale x 2 x ptr> %ptrs, i32 8, <vscale x 2 x i1> %mask, <vscale x 2 x double> poison)74 ret <vscale x 2 x double> %vals.sext75}76 77define <vscale x 2 x i64> @masked_sgather_nxv2i16(ptr %base, <vscale x 2 x i64> %offsets, <vscale x 2 x i1> %mask) {78; CHECK-LABEL: masked_sgather_nxv2i16:79; CHECK: // %bb.0:80; CHECK-NEXT: ld1sh { z0.d }, p0/z, [x0, z0.d, lsl #1]81; CHECK-NEXT: ret82 %ptrs = getelementptr i16, ptr %base, <vscale x 2 x i64> %offsets83 %vals = call <vscale x 2 x i16> @llvm.masked.gather.nxv2i16(<vscale x 2 x ptr> %ptrs, i32 2, <vscale x 2 x i1> %mask, <vscale x 2 x i16> poison)84 %vals.sext = sext <vscale x 2 x i16> %vals to <vscale x 2 x i64>85 ret <vscale x 2 x i64> %vals.sext86}87 88define <vscale x 2 x i64> @masked_sgather_nxv2i32(ptr %base, <vscale x 2 x i64> %offsets, <vscale x 2 x i1> %mask) {89; CHECK-LABEL: masked_sgather_nxv2i32:90; CHECK: // %bb.0:91; CHECK-NEXT: ld1sw { z0.d }, p0/z, [x0, z0.d, lsl #2]92; CHECK-NEXT: ret93 %ptrs = getelementptr i32, ptr %base, <vscale x 2 x i64> %offsets94 %vals = call <vscale x 2 x i32> @llvm.masked.gather.nxv2i32(<vscale x 2 x ptr> %ptrs, i32 4, <vscale x 2 x i1> %mask, <vscale x 2 x i32> poison)95 %vals.sext = sext <vscale x 2 x i32> %vals to <vscale x 2 x i64>96 ret <vscale x 2 x i64> %vals.sext97}98 99declare <vscale x 2 x i16> @llvm.masked.gather.nxv2i16(<vscale x 2 x ptr>, i32, <vscale x 2 x i1>, <vscale x 2 x i16>)100declare <vscale x 2 x i32> @llvm.masked.gather.nxv2i32(<vscale x 2 x ptr>, i32, <vscale x 2 x i1>, <vscale x 2 x i32>)101declare <vscale x 2 x i64> @llvm.masked.gather.nxv2i64(<vscale x 2 x ptr>, i32, <vscale x 2 x i1>, <vscale x 2 x i64>)102declare <vscale x 2 x half> @llvm.masked.gather.nxv2f16(<vscale x 2 x ptr>, i32, <vscale x 2 x i1>, <vscale x 2 x half>)103declare <vscale x 2 x bfloat> @llvm.masked.gather.nxv2bf16(<vscale x 2 x ptr>, i32, <vscale x 2 x i1>, <vscale x 2 x bfloat>)104declare <vscale x 2 x float> @llvm.masked.gather.nxv2f32(<vscale x 2 x ptr>, i32, <vscale x 2 x i1>, <vscale x 2 x float>)105declare <vscale x 2 x double> @llvm.masked.gather.nxv2f64(<vscale x 2 x ptr>, i32, <vscale x 2 x i1>, <vscale x 2 x double>)106attributes #0 = { "target-features"="+sve,+bf16" }107