281 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve,+bf16 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-LE3; RUN: llc -mtriple=aarch64_be-linux-gnu -mattr=+sve,+bf16 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-BE4 5; ST1B6 7define void @st1_nxv16i8(ptr %addr, i64 %off, <vscale x 16 x i8> %val) {8; CHECK-LABEL: st1_nxv16i8:9; CHECK: // %bb.0:10; CHECK-NEXT: ptrue p0.b11; CHECK-NEXT: st1b { z0.b }, p0, [x0, x1]12; CHECK-NEXT: ret13 %ptr = getelementptr inbounds i8, ptr %addr, i64 %off14 store <vscale x 16 x i8> %val, ptr %ptr15 ret void16}17 18define void @st1_nxv16i8_bitcast_from_i16(ptr %addr, i64 %off, <vscale x 8 x i16> %val) {19; CHECK-LE-LABEL: st1_nxv16i8_bitcast_from_i16:20; CHECK-LE: // %bb.0:21; CHECK-LE-NEXT: ptrue p0.b22; CHECK-LE-NEXT: st1b { z0.b }, p0, [x0, x1]23; CHECK-LE-NEXT: ret24;25; CHECK-BE-LABEL: st1_nxv16i8_bitcast_from_i16:26; CHECK-BE: // %bb.0:27; CHECK-BE-NEXT: ptrue p0.h28; CHECK-BE-NEXT: add x8, x0, x129; CHECK-BE-NEXT: st1h { z0.h }, p0, [x8]30; CHECK-BE-NEXT: ret31 %ptr = getelementptr inbounds i8, ptr %addr, i64 %off32 store <vscale x 8 x i16> %val, ptr %ptr33 ret void34}35 36define void @st1_nxv16i8_bitcast_from_i32(ptr %addr, i64 %off, <vscale x 4 x i32> %val) {37; CHECK-LE-LABEL: st1_nxv16i8_bitcast_from_i32:38; CHECK-LE: // %bb.0:39; CHECK-LE-NEXT: ptrue p0.b40; CHECK-LE-NEXT: st1b { z0.b }, p0, [x0, x1]41; CHECK-LE-NEXT: ret42;43; CHECK-BE-LABEL: st1_nxv16i8_bitcast_from_i32:44; CHECK-BE: // %bb.0:45; CHECK-BE-NEXT: ptrue p0.s46; CHECK-BE-NEXT: add x8, x0, x147; CHECK-BE-NEXT: st1w { z0.s }, p0, [x8]48; CHECK-BE-NEXT: ret49 %ptr = getelementptr inbounds i8, ptr %addr, i64 %off50 store <vscale x 4 x i32> %val, ptr %ptr51 ret void52}53 54define void @st1_nxv16i8_bitcast_from_i64(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {55; CHECK-LE-LABEL: st1_nxv16i8_bitcast_from_i64:56; CHECK-LE: // %bb.0:57; CHECK-LE-NEXT: ptrue p0.b58; CHECK-LE-NEXT: st1b { z0.b }, p0, [x0, x1]59; CHECK-LE-NEXT: ret60;61; CHECK-BE-LABEL: st1_nxv16i8_bitcast_from_i64:62; CHECK-BE: // %bb.0:63; CHECK-BE-NEXT: ptrue p0.d64; CHECK-BE-NEXT: add x8, x0, x165; CHECK-BE-NEXT: st1d { z0.d }, p0, [x8]66; CHECK-BE-NEXT: ret67 %ptr = getelementptr inbounds i8, ptr %addr, i64 %off68 store <vscale x 2 x i64> %val, ptr %ptr69 ret void70}71 72define void @st1_nxv8i16_trunc8(ptr %addr, i64 %off, <vscale x 8 x i16> %val) {73; CHECK-LABEL: st1_nxv8i16_trunc8:74; CHECK: // %bb.0:75; CHECK-NEXT: ptrue p0.h76; CHECK-NEXT: st1b { z0.h }, p0, [x0, x1]77; CHECK-NEXT: ret78 %ptr = getelementptr inbounds i8, ptr %addr, i64 %off79 %trunc = trunc <vscale x 8 x i16> %val to <vscale x 8 x i8>80 store <vscale x 8 x i8> %trunc, ptr %ptr81 ret void82}83 84define void @st1_nxv4i32_trunc8(ptr %addr, i64 %off, <vscale x 4 x i32> %val) {85; CHECK-LABEL: st1_nxv4i32_trunc8:86; CHECK: // %bb.0:87; CHECK-NEXT: ptrue p0.s88; CHECK-NEXT: st1b { z0.s }, p0, [x0, x1]89; CHECK-NEXT: ret90 %ptr = getelementptr inbounds i8, ptr %addr, i64 %off91 %trunc = trunc <vscale x 4 x i32> %val to <vscale x 4 x i8>92 store <vscale x 4 x i8> %trunc, ptr %ptr93 ret void94}95 96define void @st1_nxv2i64_trunc8(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {97; CHECK-LABEL: st1_nxv2i64_trunc8:98; CHECK: // %bb.0:99; CHECK-NEXT: ptrue p0.d100; CHECK-NEXT: st1b { z0.d }, p0, [x0, x1]101; CHECK-NEXT: ret102 %ptr = getelementptr inbounds i8, ptr %addr, i64 %off103 %trunc = trunc <vscale x 2 x i64> %val to <vscale x 2 x i8>104 store <vscale x 2 x i8> %trunc, ptr %ptr105 ret void106}107 108; ST1H109 110define void @st1_nxv8i16(ptr %addr, i64 %off, <vscale x 8 x i16> %val) {111; CHECK-LABEL: st1_nxv8i16:112; CHECK: // %bb.0:113; CHECK-NEXT: ptrue p0.h114; CHECK-NEXT: st1h { z0.h }, p0, [x0, x1, lsl #1]115; CHECK-NEXT: ret116 %ptr = getelementptr inbounds i16, ptr %addr, i64 %off117 store <vscale x 8 x i16> %val, ptr %ptr118 ret void119}120 121define void @st1_nxv4i32_trunc16(ptr %addr, i64 %off, <vscale x 4 x i32> %val) {122; CHECK-LABEL: st1_nxv4i32_trunc16:123; CHECK: // %bb.0:124; CHECK-NEXT: ptrue p0.s125; CHECK-NEXT: st1h { z0.s }, p0, [x0, x1, lsl #1]126; CHECK-NEXT: ret127 %ptr = getelementptr inbounds i16, ptr %addr, i64 %off128 %trunc = trunc <vscale x 4 x i32> %val to <vscale x 4 x i16>129 store <vscale x 4 x i16> %trunc, ptr %ptr130 ret void131}132 133define void @st1_nxv2i64_trunc16(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {134; CHECK-LABEL: st1_nxv2i64_trunc16:135; CHECK: // %bb.0:136; CHECK-NEXT: ptrue p0.d137; CHECK-NEXT: st1h { z0.d }, p0, [x0, x1, lsl #1]138; CHECK-NEXT: ret139 %ptr = getelementptr inbounds i16, ptr %addr, i64 %off140 %trunc = trunc <vscale x 2 x i64> %val to <vscale x 2 x i16>141 store <vscale x 2 x i16> %trunc, ptr %ptr142 ret void143}144 145define void @st1_nxv8f16(ptr %addr, i64 %off, <vscale x 8 x half> %val) {146; CHECK-LABEL: st1_nxv8f16:147; CHECK: // %bb.0:148; CHECK-NEXT: ptrue p0.h149; CHECK-NEXT: st1h { z0.h }, p0, [x0, x1, lsl #1]150; CHECK-NEXT: ret151 %ptr = getelementptr inbounds half, ptr %addr, i64 %off152 store <vscale x 8 x half> %val, ptr %ptr153 ret void154}155 156define void @st1_nxv8bf16(ptr %addr, i64 %off, <vscale x 8 x bfloat> %val) {157; CHECK-LABEL: st1_nxv8bf16:158; CHECK: // %bb.0:159; CHECK-NEXT: ptrue p0.h160; CHECK-NEXT: st1h { z0.h }, p0, [x0, x1, lsl #1]161; CHECK-NEXT: ret162 %ptr = getelementptr inbounds bfloat, ptr %addr, i64 %off163 store <vscale x 8 x bfloat> %val, ptr %ptr164 ret void165}166 167define void @st1_nxv4f16(ptr %addr, i64 %off, <vscale x 4 x half> %val) {168; CHECK-LABEL: st1_nxv4f16:169; CHECK: // %bb.0:170; CHECK-NEXT: ptrue p0.s171; CHECK-NEXT: st1h { z0.s }, p0, [x0, x1, lsl #1]172; CHECK-NEXT: ret173 %ptr = getelementptr inbounds half, ptr %addr, i64 %off174 store <vscale x 4 x half> %val, ptr %ptr175 ret void176}177 178define void @st1_nxv4bf16(ptr %addr, i64 %off, <vscale x 4 x bfloat> %val) {179; CHECK-LABEL: st1_nxv4bf16:180; CHECK: // %bb.0:181; CHECK-NEXT: ptrue p0.s182; CHECK-NEXT: st1h { z0.s }, p0, [x0, x1, lsl #1]183; CHECK-NEXT: ret184 %ptr = getelementptr inbounds bfloat, ptr %addr, i64 %off185 store <vscale x 4 x bfloat> %val, ptr %ptr186 ret void187}188 189define void @st1_nxv2f16(ptr %addr, i64 %off, <vscale x 2 x half> %val) {190; CHECK-LABEL: st1_nxv2f16:191; CHECK: // %bb.0:192; CHECK-NEXT: ptrue p0.d193; CHECK-NEXT: st1h { z0.d }, p0, [x0, x1, lsl #1]194; CHECK-NEXT: ret195 %ptr = getelementptr inbounds half, ptr %addr, i64 %off196 store <vscale x 2 x half> %val, ptr %ptr197 ret void198}199 200define void @st1_nxv2bf16(ptr %addr, i64 %off, <vscale x 2 x bfloat> %val) {201; CHECK-LABEL: st1_nxv2bf16:202; CHECK: // %bb.0:203; CHECK-NEXT: ptrue p0.d204; CHECK-NEXT: st1h { z0.d }, p0, [x0, x1, lsl #1]205; CHECK-NEXT: ret206 %ptr = getelementptr inbounds bfloat, ptr %addr, i64 %off207 store <vscale x 2 x bfloat> %val, ptr %ptr208 ret void209}210 211; ST1W212 213define void @st1_nxv4i32(ptr %addr, i64 %off, <vscale x 4 x i32> %val) {214; CHECK-LABEL: st1_nxv4i32:215; CHECK: // %bb.0:216; CHECK-NEXT: ptrue p0.s217; CHECK-NEXT: st1w { z0.s }, p0, [x0, x1, lsl #2]218; CHECK-NEXT: ret219 %ptr = getelementptr inbounds i32, ptr %addr, i64 %off220 store <vscale x 4 x i32> %val, ptr %ptr221 ret void222}223 224define void @st1_nxv2i64_trunc32(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {225; CHECK-LABEL: st1_nxv2i64_trunc32:226; CHECK: // %bb.0:227; CHECK-NEXT: ptrue p0.d228; CHECK-NEXT: st1w { z0.d }, p0, [x0, x1, lsl #2]229; CHECK-NEXT: ret230 %ptr = getelementptr inbounds i32, ptr %addr, i64 %off231 %trunc = trunc <vscale x 2 x i64> %val to <vscale x 2 x i32>232 store <vscale x 2 x i32> %trunc, ptr %ptr233 ret void234}235 236define void @st1_nxv4f32(ptr %addr, i64 %off, <vscale x 4 x float> %val) {237; CHECK-LABEL: st1_nxv4f32:238; CHECK: // %bb.0:239; CHECK-NEXT: ptrue p0.s240; CHECK-NEXT: st1w { z0.s }, p0, [x0, x1, lsl #2]241; CHECK-NEXT: ret242 %ptr = getelementptr inbounds float, ptr %addr, i64 %off243 store <vscale x 4 x float> %val, ptr %ptr244 ret void245}246 247define void @st1_nxv2f32(ptr %addr, i64 %off, <vscale x 2 x float> %val) {248; CHECK-LABEL: st1_nxv2f32:249; CHECK: // %bb.0:250; CHECK-NEXT: ptrue p0.d251; CHECK-NEXT: st1w { z0.d }, p0, [x0, x1, lsl #2]252; CHECK-NEXT: ret253 %ptr = getelementptr inbounds float, ptr %addr, i64 %off254 store <vscale x 2 x float> %val, ptr %ptr255 ret void256}257 258; ST1D259 260define void @st1_nxv2i64(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {261; CHECK-LABEL: st1_nxv2i64:262; CHECK: // %bb.0:263; CHECK-NEXT: ptrue p0.d264; CHECK-NEXT: st1d { z0.d }, p0, [x0, x1, lsl #3]265; CHECK-NEXT: ret266 %ptr = getelementptr inbounds i64, ptr %addr, i64 %off267 store <vscale x 2 x i64> %val, ptr %ptr268 ret void269}270 271define void @st1_nxv2f64(ptr %addr, i64 %off, <vscale x 2 x double> %val) {272; CHECK-LABEL: st1_nxv2f64:273; CHECK: // %bb.0:274; CHECK-NEXT: ptrue p0.d275; CHECK-NEXT: st1d { z0.d }, p0, [x0, x1, lsl #3]276; CHECK-NEXT: ret277 %ptr = getelementptr inbounds double, ptr %addr, i64 %off278 store <vscale x 2 x double> %val, ptr %ptr279 ret void280}281