428 lines · plain
1; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve -mattr=+bf16 < %s | FileCheck %s2 3; This file checks that unpredicated load/store instructions to locals4; use the right instructions and offsets.5 6; Data fills7 8define void @fill_nxv16i8() {9; CHECK-LABEL: fill_nxv16i810; CHECK-DAG: ldr z{{[01]}}, [sp]11; CHECK-DAG: ldr z{{[01]}}, [sp, #1, mul vl]12 %local0 = alloca <vscale x 16 x i8>13 %local1 = alloca <vscale x 16 x i8>14 load volatile <vscale x 16 x i8>, ptr %local015 load volatile <vscale x 16 x i8>, ptr %local116 ret void17}18 19define void @fill_nxv8i8() {20; CHECK-LABEL: fill_nxv8i821; CHECK-DAG: ld1b { z{{[01]}}.h }, p0/z, [sp]22; CHECK-DAG: ld1b { z{{[01]}}.h }, p0/z, [sp, #1, mul vl]23 %local0 = alloca <vscale x 8 x i8>24 %local1 = alloca <vscale x 8 x i8>25 load volatile <vscale x 8 x i8>, ptr %local026 load volatile <vscale x 8 x i8>, ptr %local127 ret void28}29 30define <vscale x 8 x i16> @fill_signed_nxv8i8() {31; CHECK-LABEL: fill_signed_nxv8i832; CHECK-DAG: ld1sb { z{{[01]}}.h }, p0/z, [sp]33; CHECK-DAG: ld1sb { z{{[01]}}.h }, p0/z, [sp, #1, mul vl]34 %local0 = alloca <vscale x 8 x i8>35 %local1 = alloca <vscale x 8 x i8>36 %a = load volatile <vscale x 8 x i8>, ptr %local037 %a_ext = sext <vscale x 8 x i8> %a to <vscale x 8 x i16>38 %b = load volatile <vscale x 8 x i8>, ptr %local139 %b_ext = sext <vscale x 8 x i8> %b to <vscale x 8 x i16>40 %sum = add <vscale x 8 x i16> %a_ext, %b_ext41 ret <vscale x 8 x i16> %sum42}43 44define void @fill_nxv4i8() {45; CHECK-LABEL: fill_nxv4i846; CHECK-DAG: ld1b { z{{[01]}}.s }, p0/z, [sp, #3, mul vl]47; CHECK-DAG: ld1b { z{{[01]}}.s }, p0/z, [sp, #2, mul vl]48 %local0 = alloca <vscale x 4 x i8>49 %local1 = alloca <vscale x 4 x i8>50 load volatile <vscale x 4 x i8>, ptr %local051 load volatile <vscale x 4 x i8>, ptr %local152 ret void53}54 55define <vscale x 4 x i32> @fill_signed_nxv4i8() {56; CHECK-LABEL: fill_signed_nxv4i857; CHECK-DAG: ld1sb { z{{[01]}}.s }, p0/z, [sp, #3, mul vl]58; CHECK-DAG: ld1sb { z{{[01]}}.s }, p0/z, [sp, #2, mul vl]59 %local0 = alloca <vscale x 4 x i8>60 %local1 = alloca <vscale x 4 x i8>61 %a = load volatile <vscale x 4 x i8>, ptr %local062 %a_ext = sext <vscale x 4 x i8> %a to <vscale x 4 x i32>63 %b = load volatile <vscale x 4 x i8>, ptr %local164 %b_ext = sext <vscale x 4 x i8> %b to <vscale x 4 x i32>65 %sum = add <vscale x 4 x i32> %a_ext, %b_ext66 ret <vscale x 4 x i32> %sum67}68 69define void @fill_nxv2i8() {70; CHECK-LABEL: fill_nxv2i871; CHECK-DAG: ld1b { z{{[01]}}.d }, p0/z, [sp, #7, mul vl]72; CHECK-DAG: ld1b { z{{[01]}}.d }, p0/z, [sp, #6, mul vl]73 %local0 = alloca <vscale x 2 x i8>74 %local1 = alloca <vscale x 2 x i8>75 load volatile <vscale x 2 x i8>, ptr %local076 load volatile <vscale x 2 x i8>, ptr %local177 ret void78}79 80define <vscale x 2 x i64> @fill_signed_nxv2i8() {81; CHECK-LABEL: fill_signed_nxv2i882; CHECK-DAG: ld1sb { z{{[01]}}.d }, p0/z, [sp, #7, mul vl]83; CHECK-DAG: ld1sb { z{{[01]}}.d }, p0/z, [sp, #6, mul vl]84 %local0 = alloca <vscale x 2 x i8>85 %local1 = alloca <vscale x 2 x i8>86 %a = load volatile <vscale x 2 x i8>, ptr %local087 %a_ext = sext <vscale x 2 x i8> %a to <vscale x 2 x i64>88 %b = load volatile <vscale x 2 x i8>, ptr %local189 %b_ext = sext <vscale x 2 x i8> %b to <vscale x 2 x i64>90 %sum = add <vscale x 2 x i64> %a_ext, %b_ext91 ret <vscale x 2 x i64> %sum92}93 94define void @fill_nxv8i16() {95; CHECK-LABEL: fill_nxv8i1696; CHECK-DAG: ldr z{{[01]}}, [sp]97; CHECK-DAG: ldr z{{[01]}}, [sp, #1, mul vl]98 %local0 = alloca <vscale x 8 x i16>99 %local1 = alloca <vscale x 8 x i16>100 load volatile <vscale x 8 x i16>, ptr %local0101 load volatile <vscale x 8 x i16>, ptr %local1102 ret void103}104 105define void @fill_nxv4i16() {106; CHECK-LABEL: fill_nxv4i16107; CHECK-DAG: ld1h { z{{[01]}}.s }, p0/z, [sp]108; CHECK-DAG: ld1h { z{{[01]}}.s }, p0/z, [sp, #1, mul vl]109 %local0 = alloca <vscale x 4 x i16>110 %local1 = alloca <vscale x 4 x i16>111 load volatile <vscale x 4 x i16>, ptr %local0112 load volatile <vscale x 4 x i16>, ptr %local1113 ret void114}115 116define <vscale x 4 x i32> @fill_signed_nxv4i16() {117; CHECK-LABEL: fill_signed_nxv4i16118; CHECK-DAG: ld1sh { z{{[01]}}.s }, p0/z, [sp]119; CHECK-DAG: ld1sh { z{{[01]}}.s }, p0/z, [sp, #1, mul vl]120 %local0 = alloca <vscale x 4 x i16>121 %local1 = alloca <vscale x 4 x i16>122 %a = load volatile <vscale x 4 x i16>, ptr %local0123 %a_ext = sext <vscale x 4 x i16> %a to <vscale x 4 x i32>124 %b = load volatile <vscale x 4 x i16>, ptr %local1125 %b_ext = sext <vscale x 4 x i16> %b to <vscale x 4 x i32>126 %sum = add <vscale x 4 x i32> %a_ext, %b_ext127 ret <vscale x 4 x i32> %sum128}129 130define void @fill_nxv2i16() {131; CHECK-LABEL: fill_nxv2i16132; CHECK-DAG: ld1h { z{{[01]}}.d }, p0/z, [sp, #3, mul vl]133; CHECK-DAG: ld1h { z{{[01]}}.d }, p0/z, [sp, #2, mul vl]134 %local0 = alloca <vscale x 2 x i16>135 %local1 = alloca <vscale x 2 x i16>136 load volatile <vscale x 2 x i16>, ptr %local0137 load volatile <vscale x 2 x i16>, ptr %local1138 ret void139}140 141define <vscale x 2 x i64> @fill_signed_nxv2i16() {142; CHECK-LABEL: fill_signed_nxv2i16143; CHECK-DAG: ld1sh { z{{[01]}}.d }, p0/z, [sp, #3, mul vl]144; CHECK-DAG: ld1sh { z{{[01]}}.d }, p0/z, [sp, #2, mul vl]145 %local0 = alloca <vscale x 2 x i16>146 %local1 = alloca <vscale x 2 x i16>147 %a = load volatile <vscale x 2 x i16>, ptr %local0148 %a_ext = sext <vscale x 2 x i16> %a to <vscale x 2 x i64>149 %b = load volatile <vscale x 2 x i16>, ptr %local1150 %b_ext = sext <vscale x 2 x i16> %b to <vscale x 2 x i64>151 %sum = add <vscale x 2 x i64> %a_ext, %b_ext152 ret <vscale x 2 x i64> %sum153}154 155define void @fill_nxv4i32() {156; CHECK-LABEL: fill_nxv4i32157; CHECK-DAG: ldr z{{[01]}}, [sp]158; CHECK-DAG: ldr z{{[01]}}, [sp, #1, mul vl]159 %local0 = alloca <vscale x 4 x i32>160 %local1 = alloca <vscale x 4 x i32>161 load volatile <vscale x 4 x i32>, ptr %local0162 load volatile <vscale x 4 x i32>, ptr %local1163 ret void164}165 166define void @fill_nxv2i32() {167; CHECK-LABEL: fill_nxv2i32168; CHECK-DAG: ld1w { z{{[01]}}.d }, p0/z, [sp]169; CHECK-DAG: ld1w { z{{[01]}}.d }, p0/z, [sp, #1, mul vl]170 %local0 = alloca <vscale x 2 x i32>171 %local1 = alloca <vscale x 2 x i32>172 load volatile <vscale x 2 x i32>, ptr %local0173 load volatile <vscale x 2 x i32>, ptr %local1174 ret void175}176 177define <vscale x 2 x i64> @fill_signed_nxv2i32() {178; CHECK-LABEL: fill_signed_nxv2i32179; CHECK-DAG: ld1sw { z{{[01]}}.d }, p0/z, [sp]180; CHECK-DAG: ld1sw { z{{[01]}}.d }, p0/z, [sp, #1, mul vl]181 %local0 = alloca <vscale x 2 x i32>182 %local1 = alloca <vscale x 2 x i32>183 %a = load volatile <vscale x 2 x i32>, ptr %local0184 %a_ext = sext <vscale x 2 x i32> %a to <vscale x 2 x i64>185 %b = load volatile <vscale x 2 x i32>, ptr %local1186 %b_ext = sext <vscale x 2 x i32> %b to <vscale x 2 x i64>187 %sum = add <vscale x 2 x i64> %a_ext, %b_ext188 ret <vscale x 2 x i64> %sum189}190 191define void @fill_nxv2i64() {192; CHECK-LABEL: fill_nxv2i64193; CHECK-DAG: ldr z{{[01]}}, [sp]194; CHECK-DAG: ldr z{{[01]}}, [sp, #1, mul vl]195 %local0 = alloca <vscale x 2 x i64>196 %local1 = alloca <vscale x 2 x i64>197 load volatile <vscale x 2 x i64>, ptr %local0198 load volatile <vscale x 2 x i64>, ptr %local1199 ret void200}201 202define void @fill_nxv8bf16() {203; CHECK-LABEL: fill_nxv8bf16204; CHECK-DAG: ldr z{{[01]}}, [sp]205; CHECK-DAG: ldr z{{[01]}}, [sp, #1, mul vl]206 %local0 = alloca <vscale x 8 x bfloat>207 %local1 = alloca <vscale x 8 x bfloat>208 load volatile <vscale x 8 x bfloat>, ptr %local0209 load volatile <vscale x 8 x bfloat>, ptr %local1210 ret void211}212 213define void @fill_nxv8f16() {214; CHECK-LABEL: fill_nxv8f16215; CHECK-DAG: ldr z{{[01]}}, [sp]216; CHECK-DAG: ldr z{{[01]}}, [sp, #1, mul vl]217 %local0 = alloca <vscale x 8 x half>218 %local1 = alloca <vscale x 8 x half>219 load volatile <vscale x 8 x half>, ptr %local0220 load volatile <vscale x 8 x half>, ptr %local1221 ret void222}223 224define void @fill_nxv4f32() {225; CHECK-LABEL: fill_nxv4f32226; CHECK-DAG: ldr z{{[01]}}, [sp]227; CHECK-DAG: ldr z{{[01]}}, [sp, #1, mul vl]228 %local0 = alloca <vscale x 4 x float>229 %local1 = alloca <vscale x 4 x float>230 load volatile <vscale x 4 x float>, ptr %local0231 load volatile <vscale x 4 x float>, ptr %local1232 ret void233}234 235define void @fill_nxv2f64() {236; CHECK-LABEL: fill_nxv2f64237; CHECK-DAG: ldr z{{[01]}}, [sp]238; CHECK-DAG: ldr z{{[01]}}, [sp, #1, mul vl]239 %local0 = alloca <vscale x 2 x double>240 %local1 = alloca <vscale x 2 x double>241 load volatile <vscale x 2 x double>, ptr %local0242 load volatile <vscale x 2 x double>, ptr %local1243 ret void244}245 246 247; Data spills248 249define void @spill_nxv16i8(<vscale x 16 x i8> %v0, <vscale x 16 x i8> %v1) {250; CHECK-LABEL: spill_nxv16i8251; CHECK-DAG: str z{{[01]}}, [sp]252; CHECK-DAG: str z{{[01]}}, [sp, #1, mul vl]253 %local0 = alloca <vscale x 16 x i8>254 %local1 = alloca <vscale x 16 x i8>255 store volatile <vscale x 16 x i8> %v0, ptr %local0256 store volatile <vscale x 16 x i8> %v1, ptr %local1257 ret void258}259 260define void @spill_nxv8i8(<vscale x 8 x i8> %v0, <vscale x 8 x i8> %v1) {261; CHECK-LABEL: spill_nxv8i8262; CHECK-DAG: st1b { z{{[01]}}.h }, p0, [sp]263; CHECK-DAG: st1b { z{{[01]}}.h }, p0, [sp, #1, mul vl]264 %local0 = alloca <vscale x 8 x i8>265 %local1 = alloca <vscale x 8 x i8>266 store volatile <vscale x 8 x i8> %v0, ptr %local0267 store volatile <vscale x 8 x i8> %v1, ptr %local1268 ret void269}270 271define void @spill_nxv4i8(<vscale x 4 x i8> %v0, <vscale x 4 x i8> %v1) {272; CHECK-LABEL: spill_nxv4i8273; CHECK-DAG: st1b { z{{[01]}}.s }, p0, [sp, #3, mul vl]274; CHECK-DAG: st1b { z{{[01]}}.s }, p0, [sp, #2, mul vl]275 %local0 = alloca <vscale x 4 x i8>276 %local1 = alloca <vscale x 4 x i8>277 store volatile <vscale x 4 x i8> %v0, ptr %local0278 store volatile <vscale x 4 x i8> %v1, ptr %local1279 ret void280}281 282define void @spill_nxv2i8(<vscale x 2 x i8> %v0, <vscale x 2 x i8> %v1) {283; CHECK-LABEL: spill_nxv2i8284; CHECK-DAG: st1b { z{{[01]}}.d }, p0, [sp, #7, mul vl]285; CHECK-DAG: st1b { z{{[01]}}.d }, p0, [sp, #6, mul vl]286 %local0 = alloca <vscale x 2 x i8>287 %local1 = alloca <vscale x 2 x i8>288 store volatile <vscale x 2 x i8> %v0, ptr %local0289 store volatile <vscale x 2 x i8> %v1, ptr %local1290 ret void291}292 293define void @spill_nxv8i16(<vscale x 8 x i16> %v0, <vscale x 8 x i16> %v1) {294; CHECK-LABEL: spill_nxv8i16295; CHECK-DAG: str z{{[01]}}, [sp]296; CHECK-DAG: str z{{[01]}}, [sp, #1, mul vl]297 %local0 = alloca <vscale x 8 x i16>298 %local1 = alloca <vscale x 8 x i16>299 store volatile <vscale x 8 x i16> %v0, ptr %local0300 store volatile <vscale x 8 x i16> %v1, ptr %local1301 ret void302}303 304define void @spill_nxv4i16(<vscale x 4 x i16> %v0, <vscale x 4 x i16> %v1) {305; CHECK-LABEL: spill_nxv4i16306; CHECK-DAG: st1h { z{{[01]}}.s }, p0, [sp]307; CHECK-DAG: st1h { z{{[01]}}.s }, p0, [sp, #1, mul vl]308 %local0 = alloca <vscale x 4 x i16>309 %local1 = alloca <vscale x 4 x i16>310 store volatile <vscale x 4 x i16> %v0, ptr %local0311 store volatile <vscale x 4 x i16> %v1, ptr %local1312 ret void313}314 315define void @spill_nxv2i16(<vscale x 2 x i16> %v0, <vscale x 2 x i16> %v1) {316; CHECK-LABEL: spill_nxv2i16317; CHECK-DAG: st1h { z{{[01]}}.d }, p0, [sp, #3, mul vl]318; CHECK-DAG: st1h { z{{[01]}}.d }, p0, [sp, #2, mul vl]319 %local0 = alloca <vscale x 2 x i16>320 %local1 = alloca <vscale x 2 x i16>321 store volatile <vscale x 2 x i16> %v0, ptr %local0322 store volatile <vscale x 2 x i16> %v1, ptr %local1323 ret void324}325 326define void @spill_nxv4i32(<vscale x 4 x i32> %v0, <vscale x 4 x i32> %v1) {327; CHECK-LABEL: spill_nxv4i32328; CHECK-DAG: str z{{[01]}}, [sp]329; CHECK-DAG: str z{{[01]}}, [sp, #1, mul vl]330 %local0 = alloca <vscale x 4 x i32>331 %local1 = alloca <vscale x 4 x i32>332 store volatile <vscale x 4 x i32> %v0, ptr %local0333 store volatile <vscale x 4 x i32> %v1, ptr %local1334 ret void335}336 337define void @spill_nxv2i32(<vscale x 2 x i32> %v0, <vscale x 2 x i32> %v1) {338; CHECK-LABEL: spill_nxv2i32339; CHECK-DAG: st1w { z{{[01]}}.d }, p0, [sp]340; CHECK-DAG: st1w { z{{[01]}}.d }, p0, [sp, #1, mul vl]341 %local0 = alloca <vscale x 2 x i32>342 %local1 = alloca <vscale x 2 x i32>343 store volatile <vscale x 2 x i32> %v0, ptr %local0344 store volatile <vscale x 2 x i32> %v1, ptr %local1345 ret void346}347 348define void @spill_nxv2i64(<vscale x 2 x i64> %v0, <vscale x 2 x i64> %v1) {349; CHECK-LABEL: spill_nxv2i64350; CHECK-DAG: str z{{[01]}}, [sp]351; CHECK-DAG: str z{{[01]}}, [sp, #1, mul vl]352 %local0 = alloca <vscale x 2 x i64>353 %local1 = alloca <vscale x 2 x i64>354 store volatile <vscale x 2 x i64> %v0, ptr %local0355 store volatile <vscale x 2 x i64> %v1, ptr %local1356 ret void357}358 359define void @spill_nxv8f16(<vscale x 8 x half> %v0, <vscale x 8 x half> %v1) {360; CHECK-LABEL: spill_nxv8f16361; CHECK-DAG: str z{{[01]}}, [sp]362; CHECK-DAG: str z{{[01]}}, [sp, #1, mul vl]363 %local0 = alloca <vscale x 8 x half>364 %local1 = alloca <vscale x 8 x half>365 store volatile <vscale x 8 x half> %v0, ptr %local0366 store volatile <vscale x 8 x half> %v1, ptr %local1367 ret void368}369 370define void @spill_nxv8bf16(<vscale x 8 x bfloat> %v0, <vscale x 8 x bfloat> %v1) {371; CHECK-LABEL: spill_nxv8bf16372; CHECK-DAG: str z{{[01]}}, [sp]373; CHECK-DAG: str z{{[01]}}, [sp, #1, mul vl]374 %local0 = alloca <vscale x 8 x bfloat>375 %local1 = alloca <vscale x 8 x bfloat>376 store volatile <vscale x 8 x bfloat> %v0, ptr %local0377 store volatile <vscale x 8 x bfloat> %v1, ptr %local1378 ret void379}380 381define void @spill_nxv4f32(<vscale x 4 x float> %v0, <vscale x 4 x float> %v1) {382; CHECK-LABEL: spill_nxv4f32383; CHECK-DAG: str z{{[01]}}, [sp]384; CHECK-DAG: str z{{[01]}}, [sp, #1, mul vl]385 %local0 = alloca <vscale x 4 x float>386 %local1 = alloca <vscale x 4 x float>387 store volatile <vscale x 4 x float> %v0, ptr %local0388 store volatile <vscale x 4 x float> %v1, ptr %local1389 ret void390}391 392define void @spill_nxv2f64(<vscale x 2 x double> %v0, <vscale x 2 x double> %v1) {393; CHECK-LABEL: spill_nxv2f64394; CHECK-DAG: str z{{[01]}}, [sp]395; CHECK-DAG: str z{{[01]}}, [sp, #1, mul vl]396 %local0 = alloca <vscale x 2 x double>397 %local1 = alloca <vscale x 2 x double>398 store volatile <vscale x 2 x double> %v0, ptr %local0399 store volatile <vscale x 2 x double> %v1, ptr %local1400 ret void401}402 403; Predicate fills404 405define void @fill_nxv16i1() {406; CHECK-LABEL: fill_nxv16i1407; CHECK-DAG: ldr p{{[01]}}, [sp, #7, mul vl]408; CHECK-DAG: ldr p{{[01]}}, [sp, #6, mul vl]409 %local0 = alloca <vscale x 16 x i1>410 %local1 = alloca <vscale x 16 x i1>411 load volatile <vscale x 16 x i1>, ptr %local0412 load volatile <vscale x 16 x i1>, ptr %local1413 ret void414}415 416; Predicate spills417 418define void @spill_nxv16i1(<vscale x 16 x i1> %v0, <vscale x 16 x i1> %v1) {419; CHECK-LABEL: spill_nxv16i1420; CHECK-DAG: str p{{[01]}}, [sp, #7, mul vl]421; CHECK-DAG: str p{{[01]}}, [sp, #6, mul vl]422 %local0 = alloca <vscale x 16 x i1>423 %local1 = alloca <vscale x 16 x i1>424 store volatile <vscale x 16 x i1> %v0, ptr %local0425 store volatile <vscale x 16 x i1> %v1, ptr %local1426 ret void427}428