142 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 4; ST1B5 6define void @st1b_lower_bound(<vscale x 16 x i8> %data, ptr %a) {7; CHECK-LABEL: st1b_lower_bound:8; CHECK: // %bb.0:9; CHECK-NEXT: str z0, [x0, #-8, mul vl]10; CHECK-NEXT: ret11 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 -812 store <vscale x 16 x i8> %data, ptr %base13 ret void14}15 16define void @st1b_inbound(<vscale x 16 x i8> %data, ptr %a) {17; CHECK-LABEL: st1b_inbound:18; CHECK: // %bb.0:19; CHECK-NEXT: str z0, [x0, #1, mul vl]20; CHECK-NEXT: ret21 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 122 store <vscale x 16 x i8> %data, ptr %base23 ret void24}25 26define void @st1b_upper_bound(<vscale x 16 x i8> %data, ptr %a) {27; CHECK-LABEL: st1b_upper_bound:28; CHECK: // %bb.0:29; CHECK-NEXT: str z0, [x0, #7, mul vl]30; CHECK-NEXT: ret31 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 732 store <vscale x 16 x i8> %data, ptr %base33 ret void34}35 36define void @st1b_out_of_upper_bound(<vscale x 16 x i8> %data, ptr %a) {37; CHECK-LABEL: st1b_out_of_upper_bound:38; CHECK: // %bb.0:39; CHECK-NEXT: str z0, [x0, #8, mul vl]40; CHECK-NEXT: ret41 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 842 store <vscale x 16 x i8> %data, ptr %base43 ret void44}45 46define void @st1b_out_of_lower_bound(<vscale x 16 x i8> %data, ptr %a) {47; CHECK-LABEL: st1b_out_of_lower_bound:48; CHECK: // %bb.0:49; CHECK-NEXT: str z0, [x0, #-9, mul vl]50; CHECK-NEXT: ret51 %base = getelementptr <vscale x 16 x i8>, ptr %a, i64 -952 store <vscale x 16 x i8> %data, ptr %base53 ret void54}55 56; ST1H57 58define void @st1h_inbound(<vscale x 8 x i16> %data, ptr %a) {59; CHECK-LABEL: st1h_inbound:60; CHECK: // %bb.0:61; CHECK-NEXT: str z0, [x0, #-6, mul vl]62; CHECK-NEXT: ret63 %base = getelementptr <vscale x 8 x i16>, ptr %a, i64 -664 store <vscale x 8 x i16> %data, ptr %base65 ret void66}67 68; ST1W69 70define void @st1w_inbound(<vscale x 4 x i32> %data, ptr %a) {71; CHECK-LABEL: st1w_inbound:72; CHECK: // %bb.0:73; CHECK-NEXT: str z0, [x0, #2, mul vl]74; CHECK-NEXT: ret75 %base = getelementptr <vscale x 4 x i32>, ptr %a, i64 276 store <vscale x 4 x i32> %data, ptr %base77 ret void78}79 80; ST1D81 82define void @st1d_inbound(<vscale x 2 x i64> %data, ptr %a) {83; CHECK-LABEL: st1d_inbound:84; CHECK: // %bb.0:85; CHECK-NEXT: str z0, [x0, #5, mul vl]86; CHECK-NEXT: ret87 %base = getelementptr <vscale x 2 x i64>, ptr %a, i64 588 store <vscale x 2 x i64> %data, ptr %base89 ret void90}91 92 93; Splat stores of unpacked FP scalable vectors94 95define void @store_nxv2f32(ptr %out) {96; CHECK-LABEL: store_nxv2f32:97; CHECK: // %bb.0:98; CHECK-NEXT: fmov z0.s, #1.0000000099; CHECK-NEXT: ptrue p0.d100; CHECK-NEXT: st1w { z0.d }, p0, [x0]101; CHECK-NEXT: ret102 store <vscale x 2 x float> splat(float 1.0), ptr %out103 ret void104}105 106define void @store_nxv4f16(ptr %out) {107; CHECK-LABEL: store_nxv4f16:108; CHECK: // %bb.0:109; CHECK-NEXT: fmov z0.h, #1.00000000110; CHECK-NEXT: ptrue p0.s111; CHECK-NEXT: st1h { z0.s }, p0, [x0]112; CHECK-NEXT: ret113 store <vscale x 4 x half> splat(half 1.0), ptr %out114 ret void115}116 117; Splat stores of unusual FP scalable vector types118 119define void @store_nxv6f32(ptr %out) {120; CHECK-LABEL: store_nxv6f32:121; CHECK: // %bb.0:122; CHECK-NEXT: fmov z0.s, #1.00000000123; CHECK-NEXT: ptrue p0.d124; CHECK-NEXT: st1w { z0.d }, p0, [x0, #2, mul vl]125; CHECK-NEXT: str z0, [x0]126; CHECK-NEXT: ret127 store <vscale x 6 x float> splat(float 1.0), ptr %out128 ret void129}130 131define void @store_nxv12f16(ptr %out) {132; CHECK-LABEL: store_nxv12f16:133; CHECK: // %bb.0:134; CHECK-NEXT: fmov z0.h, #1.00000000135; CHECK-NEXT: ptrue p0.s136; CHECK-NEXT: st1h { z0.s }, p0, [x0, #2, mul vl]137; CHECK-NEXT: str z0, [x0]138; CHECK-NEXT: ret139 store <vscale x 12 x half> splat(half 1.0), ptr %out140 ret void141}142