247 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s3; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme -force-streaming < %s | FileCheck %s4 5;6; ST1B7;8 9define void @st1b_upper_bound(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %a) {10; CHECK-LABEL: st1b_upper_bound:11; CHECK: // %bb.0:12; CHECK-NEXT: st1b { z0.b }, p0, [x0, #7, mul vl]13; CHECK-NEXT: ret14 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 715 %base_scalar = bitcast ptr %base to ptr16 call void @llvm.aarch64.sve.st1.nxv16i8(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %base_scalar)17 ret void18}19 20define void @st1b_inbound(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %a) {21; CHECK-LABEL: st1b_inbound:22; CHECK: // %bb.0:23; CHECK-NEXT: st1b { z0.b }, p0, [x0, #1, mul vl]24; CHECK-NEXT: ret25 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 126 %base_scalar = bitcast ptr %base to ptr27 call void @llvm.aarch64.sve.st1.nxv16i8(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %base_scalar)28 ret void29}30 31define void @st1b_lower_bound(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %a) {32; CHECK-LABEL: st1b_lower_bound:33; CHECK: // %bb.0:34; CHECK-NEXT: st1b { z0.b }, p0, [x0, #-8, mul vl]35; CHECK-NEXT: ret36 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 -837 %base_scalar = bitcast ptr %base to ptr38 call void @llvm.aarch64.sve.st1.nxv16i8(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %base_scalar)39 ret void40}41 42define void @st1b_out_of_upper_bound(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %a) {43; CHECK-LABEL: st1b_out_of_upper_bound:44; CHECK: // %bb.0:45; CHECK-NEXT: rdvl x8, #846; CHECK-NEXT: st1b { z0.b }, p0, [x0, x8]47; CHECK-NEXT: ret48 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 849 %base_scalar = bitcast ptr %base to ptr50 call void @llvm.aarch64.sve.st1.nxv16i8(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %base_scalar)51 ret void52}53 54define void @st1b_out_of_lower_bound(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %a) {55; CHECK-LABEL: st1b_out_of_lower_bound:56; CHECK: // %bb.0:57; CHECK-NEXT: rdvl x8, #-958; CHECK-NEXT: st1b { z0.b }, p0, [x0, x8]59; CHECK-NEXT: ret60 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 -961 %base_scalar = bitcast ptr %base to ptr62 call void @llvm.aarch64.sve.st1.nxv16i8(<vscale x 16 x i8> %data, <vscale x 16 x i1> %pg, ptr %base_scalar)63 ret void64}65 66define void @st1b_s_inbound(<vscale x 4 x i32> %data, <vscale x 4 x i1> %pg, ptr %a) {67; CHECK-LABEL: st1b_s_inbound:68; CHECK: // %bb.0:69; CHECK-NEXT: st1b { z0.s }, p0, [x0, #7, mul vl]70; CHECK-NEXT: ret71 %base = getelementptr <vscale x 4 x i8>, ptr %a, i64 772 %base_scalar = bitcast ptr %base to ptr73 %trunc = trunc <vscale x 4 x i32> %data to <vscale x 4 x i8>74 call void @llvm.aarch64.sve.st1.nxv4i8(<vscale x 4 x i8> %trunc, <vscale x 4 x i1> %pg, ptr %base_scalar)75 ret void76}77 78define void @st1b_h_inbound(<vscale x 8 x i16> %data, <vscale x 8 x i1> %pg, ptr %a) {79; CHECK-LABEL: st1b_h_inbound:80; CHECK: // %bb.0:81; CHECK-NEXT: st1b { z0.h }, p0, [x0, #1, mul vl]82; CHECK-NEXT: ret83 %base = getelementptr <vscale x 8 x i8>, ptr %a, i64 184 %base_scalar = bitcast ptr %base to ptr85 %trunc = trunc <vscale x 8 x i16> %data to <vscale x 8 x i8>86 call void @llvm.aarch64.sve.st1.nxv8i8(<vscale x 8 x i8> %trunc, <vscale x 8 x i1> %pg, ptr %base_scalar)87 ret void88}89 90define void @st1b_d_inbound(<vscale x 2 x i64> %data, <vscale x 2 x i1> %pg, ptr %a) {91; CHECK-LABEL: st1b_d_inbound:92; CHECK: // %bb.0:93; CHECK-NEXT: st1b { z0.d }, p0, [x0, #-7, mul vl]94; CHECK-NEXT: ret95 %base = getelementptr <vscale x 2 x i8>, ptr %a, i64 -796 %base_scalar = bitcast ptr %base to ptr97 %trunc = trunc <vscale x 2 x i64> %data to <vscale x 2 x i8>98 call void @llvm.aarch64.sve.st1.nxv2i8(<vscale x 2 x i8> %trunc, <vscale x 2 x i1> %pg, ptr %base_scalar)99 ret void100}101 102;103; ST1H104;105 106define void @st1h_inbound(<vscale x 8 x i16> %data, <vscale x 8 x i1> %pg, ptr %a) {107; CHECK-LABEL: st1h_inbound:108; CHECK: // %bb.0:109; CHECK-NEXT: st1h { z0.h }, p0, [x0, #-1, mul vl]110; CHECK-NEXT: ret111 %base = getelementptr <vscale x 8 x i16>, ptr %a, i64 -1112 %base_scalar = bitcast ptr %base to ptr113 call void @llvm.aarch64.sve.st1.nxv8i16(<vscale x 8 x i16> %data, <vscale x 8 x i1> %pg, ptr %base_scalar)114 ret void115}116 117define void @st1h_f16_inbound(<vscale x 8 x half> %data, <vscale x 8 x i1> %pg, ptr %a) {118; CHECK-LABEL: st1h_f16_inbound:119; CHECK: // %bb.0:120; CHECK-NEXT: st1h { z0.h }, p0, [x0, #-5, mul vl]121; CHECK-NEXT: ret122 %base = getelementptr <vscale x 8 x half>, ptr %a, i64 -5123 %base_scalar = bitcast ptr %base to ptr124 call void @llvm.aarch64.sve.st1.nxv8f16(<vscale x 8 x half> %data, <vscale x 8 x i1> %pg, ptr %base_scalar)125 ret void126}127 128define void @st1h_bf16_inbound(<vscale x 8 x bfloat> %data, <vscale x 8 x i1> %pg, ptr %a) #0 {129; CHECK-LABEL: st1h_bf16_inbound:130; CHECK: // %bb.0:131; CHECK-NEXT: st1h { z0.h }, p0, [x0, #-5, mul vl]132; CHECK-NEXT: ret133 %base = getelementptr <vscale x 8 x bfloat>, ptr %a, i64 -5134 %base_scalar = bitcast ptr %base to ptr135 call void @llvm.aarch64.sve.st1.nxv8bf16(<vscale x 8 x bfloat> %data, <vscale x 8 x i1> %pg, ptr %base_scalar)136 ret void137}138 139define void @st1h_s_inbound(<vscale x 4 x i32> %data, <vscale x 4 x i1> %pg, ptr %a) {140; CHECK-LABEL: st1h_s_inbound:141; CHECK: // %bb.0:142; CHECK-NEXT: st1h { z0.s }, p0, [x0, #2, mul vl]143; CHECK-NEXT: ret144 %base = getelementptr <vscale x 4 x i16>, ptr %a, i64 2145 %base_scalar = bitcast ptr %base to ptr146 %trunc = trunc <vscale x 4 x i32> %data to <vscale x 4 x i16>147 call void @llvm.aarch64.sve.st1.nxv4i16(<vscale x 4 x i16> %trunc, <vscale x 4 x i1> %pg, ptr %base_scalar)148 ret void149}150 151define void @st1h_d_inbound(<vscale x 2 x i64> %data, <vscale x 2 x i1> %pg, ptr %a) {152; CHECK-LABEL: st1h_d_inbound:153; CHECK: // %bb.0:154; CHECK-NEXT: st1h { z0.d }, p0, [x0, #-4, mul vl]155; CHECK-NEXT: ret156 %base = getelementptr <vscale x 2 x i16>, ptr %a, i64 -4157 %base_scalar = bitcast ptr %base to ptr158 %trunc = trunc <vscale x 2 x i64> %data to <vscale x 2 x i16>159 call void @llvm.aarch64.sve.st1.nxv2i16(<vscale x 2 x i16> %trunc, <vscale x 2 x i1> %pg, ptr %base_scalar)160 ret void161}162 163;164; ST1W165;166 167define void @st1w_inbound(<vscale x 4 x i32> %data, <vscale x 4 x i1> %pg, ptr %a) {168; CHECK-LABEL: st1w_inbound:169; CHECK: // %bb.0:170; CHECK-NEXT: st1w { z0.s }, p0, [x0, #6, mul vl]171; CHECK-NEXT: ret172 %base = getelementptr <vscale x 4 x i32>, ptr %a, i64 6173 %base_scalar = bitcast ptr %base to ptr174 call void @llvm.aarch64.sve.st1.nxv4i32(<vscale x 4 x i32> %data, <vscale x 4 x i1> %pg, ptr %base_scalar)175 ret void176}177 178define void @st1w_f32_inbound(<vscale x 4 x float> %data, <vscale x 4 x i1> %pg, ptr %a) {179; CHECK-LABEL: st1w_f32_inbound:180; CHECK: // %bb.0:181; CHECK-NEXT: st1w { z0.s }, p0, [x0, #-1, mul vl]182; CHECK-NEXT: ret183 %base = getelementptr <vscale x 4 x float>, ptr %a, i64 -1184 %base_scalar = bitcast ptr %base to ptr185 call void @llvm.aarch64.sve.st1.nxv4f32(<vscale x 4 x float> %data, <vscale x 4 x i1> %pg, ptr %base_scalar)186 ret void187}188 189define void @st1w_d_inbound(<vscale x 2 x i64> %data, <vscale x 2 x i1> %pg, ptr %a) {190; CHECK-LABEL: st1w_d_inbound:191; CHECK: // %bb.0:192; CHECK-NEXT: st1w { z0.d }, p0, [x0, #1, mul vl]193; CHECK-NEXT: ret194 %base = getelementptr <vscale x 2 x i32>, ptr %a, i64 1195 %base_scalar = bitcast ptr %base to ptr196 %trunc = trunc <vscale x 2 x i64> %data to <vscale x 2 x i32>197 call void @llvm.aarch64.sve.st1.nxv2i32(<vscale x 2 x i32> %trunc, <vscale x 2 x i1> %pg, ptr %base_scalar)198 ret void199}200 201;202; ST1D203;204 205define void @st1d_inbound(<vscale x 2 x i64> %data, <vscale x 2 x i1> %pg, ptr %a) {206; CHECK-LABEL: st1d_inbound:207; CHECK: // %bb.0:208; CHECK-NEXT: st1d { z0.d }, p0, [x0, #5, mul vl]209; CHECK-NEXT: ret210 %base = getelementptr <vscale x 2 x i64>, ptr %a, i64 5211 %base_scalar = bitcast ptr %base to ptr212 call void @llvm.aarch64.sve.st1.nxv2i64(<vscale x 2 x i64> %data, <vscale x 2 x i1> %pg, ptr %base_scalar)213 ret void214}215 216define void @st1d_f64_inbound(<vscale x 2 x double> %data, <vscale x 2 x i1> %pg, ptr %a) {217; CHECK-LABEL: st1d_f64_inbound:218; CHECK: // %bb.0:219; CHECK-NEXT: st1d { z0.d }, p0, [x0, #-8, mul vl]220; CHECK-NEXT: ret221 %base = getelementptr <vscale x 2 x double>, ptr %a, i64 -8222 %base_scalar = bitcast ptr %base to ptr223 call void @llvm.aarch64.sve.st1.nxv2f64(<vscale x 2 x double> %data, <vscale x 2 x i1> %pg, ptr %base_scalar)224 ret void225}226 227declare void @llvm.aarch64.sve.st1.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i1>, ptr)228 229declare void @llvm.aarch64.sve.st1.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i1>, ptr)230declare void @llvm.aarch64.sve.st1.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i1>, ptr)231declare void @llvm.aarch64.sve.st1.nxv8f16(<vscale x 8 x half>, <vscale x 8 x i1>, ptr)232declare void @llvm.aarch64.sve.st1.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x i1>, ptr)233 234declare void @llvm.aarch64.sve.st1.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i1>, ptr)235declare void @llvm.aarch64.sve.st1.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i1>, ptr)236declare void @llvm.aarch64.sve.st1.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i1>, ptr)237declare void @llvm.aarch64.sve.st1.nxv4f32(<vscale x 4 x float>, <vscale x 4 x i1>, ptr)238 239declare void @llvm.aarch64.sve.st1.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i1>, ptr)240declare void @llvm.aarch64.sve.st1.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i1>, ptr)241declare void @llvm.aarch64.sve.st1.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i1>, ptr)242declare void @llvm.aarch64.sve.st1.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i1>, ptr)243declare void @llvm.aarch64.sve.st1.nxv2f64(<vscale x 2 x double>, <vscale x 2 x i1>, ptr)244 245; +bf16 is required for the bfloat version.246attributes #0 = { "target-features"="+bf16" }247