303 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -mtriple=aarch64 -mattr=+sve %s -o - | FileCheck %s3 4define <vscale x 16 x i8> @i8_1v_4s(ptr %b) {5; CHECK-LABEL: i8_1v_4s:6; CHECK: // %bb.0: // %entry7; CHECK-NEXT: rdvl x8, #18; CHECK-NEXT: ptrue p0.b9; CHECK-NEXT: mov w9, #4 // =0x410; CHECK-NEXT: add x8, x0, x811; CHECK-NEXT: ld1b { z0.b }, p0/z, [x8, x9]12; CHECK-NEXT: ret13entry:14 %0 = tail call i64 @llvm.vscale.i64()15 %1 = shl nuw nsw i64 %0, 416 %add.ptr = getelementptr inbounds i8, ptr %b, i64 %117 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 418 %2 = load <vscale x 16 x i8>, ptr %add.ptr1, align 1619 ret <vscale x 16 x i8> %220}21 22define <vscale x 16 x i8> @i8_4s_1v(ptr %b) {23; CHECK-LABEL: i8_4s_1v:24; CHECK: // %bb.0: // %entry25; CHECK-NEXT: add x8, x0, #426; CHECK-NEXT: ldr z0, [x8, #1, mul vl]27; CHECK-NEXT: ret28entry:29 %add.ptr = getelementptr inbounds i8, ptr %b, i64 430 %0 = tail call i64 @llvm.vscale.i64()31 %1 = shl nuw nsw i64 %0, 432 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 %133 %2 = load <vscale x 16 x i8>, ptr %add.ptr1, align 1634 ret <vscale x 16 x i8> %235}36 37define <vscale x 8 x i16> @i16_1v_8s(ptr %b) {38; CHECK-LABEL: i16_1v_8s:39; CHECK: // %bb.0: // %entry40; CHECK-NEXT: rdvl x8, #141; CHECK-NEXT: ptrue p0.h42; CHECK-NEXT: mov x9, #4 // =0x443; CHECK-NEXT: add x8, x0, x844; CHECK-NEXT: ld1h { z0.h }, p0/z, [x8, x9, lsl #1]45; CHECK-NEXT: ret46entry:47 %0 = tail call i64 @llvm.vscale.i64()48 %1 = shl nuw nsw i64 %0, 349 %add.ptr = getelementptr inbounds i16, ptr %b, i64 %150 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 851 %2 = load <vscale x 8 x i16>, ptr %add.ptr1, align 1652 ret <vscale x 8 x i16> %253}54 55define <vscale x 8 x i16> @i16_8s_1v(ptr %b) {56; CHECK-LABEL: i16_8s_1v:57; CHECK: // %bb.0: // %entry58; CHECK-NEXT: add x8, x0, #859; CHECK-NEXT: ldr z0, [x8, #1, mul vl]60; CHECK-NEXT: ret61entry:62 %add.ptr = getelementptr inbounds i8, ptr %b, i64 863 %0 = tail call i64 @llvm.vscale.i64()64 %1 = shl nuw nsw i64 %0, 365 %add.ptr1 = getelementptr inbounds i16, ptr %add.ptr, i64 %166 %2 = load <vscale x 8 x i16>, ptr %add.ptr1, align 1667 ret <vscale x 8 x i16> %268}69 70define <vscale x 8 x i16> @i16_2v_8s(ptr %b) {71; CHECK-LABEL: i16_2v_8s:72; CHECK: // %bb.0: // %entry73; CHECK-NEXT: rdvl x8, #274; CHECK-NEXT: ptrue p0.h75; CHECK-NEXT: mov x9, #4 // =0x476; CHECK-NEXT: add x8, x0, x877; CHECK-NEXT: ld1h { z0.h }, p0/z, [x8, x9, lsl #1]78; CHECK-NEXT: ret79entry:80 %0 = tail call i64 @llvm.vscale.i64()81 %1 = shl nuw nsw i64 %0, 482 %add.ptr = getelementptr inbounds i16, ptr %b, i64 %183 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 884 %2 = load <vscale x 8 x i16>, ptr %add.ptr1, align 1685 ret <vscale x 8 x i16> %286}87 88define <vscale x 8 x i16> @i16_8s_2v(ptr %b) {89; CHECK-LABEL: i16_8s_2v:90; CHECK: // %bb.0: // %entry91; CHECK-NEXT: add x8, x0, #892; CHECK-NEXT: ldr z0, [x8, #2, mul vl]93; CHECK-NEXT: ret94entry:95 %add.ptr = getelementptr inbounds i8, ptr %b, i64 896 %0 = tail call i64 @llvm.vscale.i64()97 %1 = shl nuw nsw i64 %0, 498 %add.ptr1 = getelementptr inbounds i16, ptr %add.ptr, i64 %199 %2 = load <vscale x 8 x i16>, ptr %add.ptr1, align 16100 ret <vscale x 8 x i16> %2101}102 103define <vscale x 4 x i32> @i32_1v_16s(ptr %b) {104; CHECK-LABEL: i32_1v_16s:105; CHECK: // %bb.0: // %entry106; CHECK-NEXT: rdvl x8, #1107; CHECK-NEXT: ptrue p0.s108; CHECK-NEXT: mov x9, #4 // =0x4109; CHECK-NEXT: add x8, x0, x8110; CHECK-NEXT: ld1w { z0.s }, p0/z, [x8, x9, lsl #2]111; CHECK-NEXT: ret112entry:113 %0 = tail call i64 @llvm.vscale.i64()114 %1 = shl nuw nsw i64 %0, 2115 %add.ptr = getelementptr inbounds i32, ptr %b, i64 %1116 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 16117 %2 = load <vscale x 4 x i32>, ptr %add.ptr1, align 16118 ret <vscale x 4 x i32> %2119}120 121define <vscale x 4 x i32> @i32_16s_2v(ptr %b) {122; CHECK-LABEL: i32_16s_2v:123; CHECK: // %bb.0: // %entry124; CHECK-NEXT: add x8, x0, #16125; CHECK-NEXT: ldr z0, [x8, #1, mul vl]126; CHECK-NEXT: ret127entry:128 %add.ptr = getelementptr inbounds i8, ptr %b, i64 16129 %0 = tail call i64 @llvm.vscale.i64()130 %1 = shl nuw nsw i64 %0, 2131 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i64 %1132 %2 = load <vscale x 4 x i32>, ptr %add.ptr1, align 16133 ret <vscale x 4 x i32> %2134}135 136define <vscale x 2 x i64> @i64_1v_32s(ptr %b) {137; CHECK-LABEL: i64_1v_32s:138; CHECK: // %bb.0: // %entry139; CHECK-NEXT: rdvl x8, #1140; CHECK-NEXT: ptrue p0.d141; CHECK-NEXT: mov x9, #4 // =0x4142; CHECK-NEXT: add x8, x0, x8143; CHECK-NEXT: ld1d { z0.d }, p0/z, [x8, x9, lsl #3]144; CHECK-NEXT: ret145entry:146 %0 = tail call i64 @llvm.vscale.i64()147 %1 = shl nuw nsw i64 %0, 1148 %add.ptr = getelementptr inbounds i64, ptr %b, i64 %1149 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 32150 %2 = load <vscale x 2 x i64>, ptr %add.ptr1, align 16151 ret <vscale x 2 x i64> %2152}153 154define <vscale x 2 x i64> @i64_32s_2v(ptr %b) {155; CHECK-LABEL: i64_32s_2v:156; CHECK: // %bb.0: // %entry157; CHECK-NEXT: add x8, x0, #32158; CHECK-NEXT: ldr z0, [x8, #1, mul vl]159; CHECK-NEXT: ret160entry:161 %add.ptr = getelementptr inbounds i8, ptr %b, i64 32162 %0 = tail call i64 @llvm.vscale.i64()163 %1 = shl nuw nsw i64 %0, 1164 %add.ptr1 = getelementptr inbounds i64, ptr %add.ptr, i64 %1165 %2 = load <vscale x 2 x i64>, ptr %add.ptr1, align 16166 ret <vscale x 2 x i64> %2167}168 169 170define <vscale x 16 x i8> @i8_m2v_4s(ptr %b) {171; CHECK-LABEL: i8_m2v_4s:172; CHECK: // %bb.0: // %entry173; CHECK-NEXT: cnth x8, all, mul #4174; CHECK-NEXT: ptrue p0.b175; CHECK-NEXT: mov w9, #4 // =0x4176; CHECK-NEXT: sub x8, x0, x8177; CHECK-NEXT: ld1b { z0.b }, p0/z, [x8, x9]178; CHECK-NEXT: ret179entry:180 %0 = tail call i64 @llvm.vscale.i64()181 %1 = mul i64 %0, -32182 %add.ptr = getelementptr inbounds i8, ptr %b, i64 %1183 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 4184 %2 = load <vscale x 16 x i8>, ptr %add.ptr1, align 16185 ret <vscale x 16 x i8> %2186}187 188define <vscale x 16 x i8> @i8_4s_m2v(ptr %b) {189; CHECK-LABEL: i8_4s_m2v:190; CHECK: // %bb.0: // %entry191; CHECK-NEXT: add x8, x0, #4192; CHECK-NEXT: ldr z0, [x8, #-2, mul vl]193; CHECK-NEXT: ret194entry:195 %add.ptr = getelementptr inbounds i8, ptr %b, i64 4196 %0 = tail call i64 @llvm.vscale.i64()197 %1 = mul i64 %0, -32198 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 %1199 %2 = load <vscale x 16 x i8>, ptr %add.ptr1, align 16200 ret <vscale x 16 x i8> %2201}202 203define <vscale x 8 x i16> @i16_m2v_8s(ptr %b) {204; CHECK-LABEL: i16_m2v_8s:205; CHECK: // %bb.0: // %entry206; CHECK-NEXT: cnth x8, all, mul #4207; CHECK-NEXT: ptrue p0.h208; CHECK-NEXT: mov x9, #4 // =0x4209; CHECK-NEXT: sub x8, x0, x8210; CHECK-NEXT: ld1h { z0.h }, p0/z, [x8, x9, lsl #1]211; CHECK-NEXT: ret212entry:213 %0 = tail call i64 @llvm.vscale.i64()214 %1 = mul i64 %0, -32215 %add.ptr = getelementptr inbounds i8, ptr %b, i64 %1216 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 8217 %2 = load <vscale x 8 x i16>, ptr %add.ptr1, align 16218 ret <vscale x 8 x i16> %2219}220 221define <vscale x 8 x i16> @i16_8s_m2v(ptr %b) {222; CHECK-LABEL: i16_8s_m2v:223; CHECK: // %bb.0: // %entry224; CHECK-NEXT: add x8, x0, #8225; CHECK-NEXT: ldr z0, [x8, #-2, mul vl]226; CHECK-NEXT: ret227entry:228 %add.ptr = getelementptr inbounds i8, ptr %b, i64 8229 %0 = tail call i64 @llvm.vscale.i64()230 %1 = mul i64 %0, -32231 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 %1232 %2 = load <vscale x 8 x i16>, ptr %add.ptr1, align 16233 ret <vscale x 8 x i16> %2234}235 236define <vscale x 4 x i32> @i32_m2v_16s(ptr %b) {237; CHECK-LABEL: i32_m2v_16s:238; CHECK: // %bb.0: // %entry239; CHECK-NEXT: cnth x8, all, mul #4240; CHECK-NEXT: ptrue p0.s241; CHECK-NEXT: mov x9, #4 // =0x4242; CHECK-NEXT: sub x8, x0, x8243; CHECK-NEXT: ld1w { z0.s }, p0/z, [x8, x9, lsl #2]244; CHECK-NEXT: ret245entry:246 %0 = tail call i64 @llvm.vscale.i64()247 %1 = mul i64 %0, -32248 %add.ptr = getelementptr inbounds i8, ptr %b, i64 %1249 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 16250 %2 = load <vscale x 4 x i32>, ptr %add.ptr1, align 16251 ret <vscale x 4 x i32> %2252}253 254define <vscale x 4 x i32> @i32_16s_m2v(ptr %b) {255; CHECK-LABEL: i32_16s_m2v:256; CHECK: // %bb.0: // %entry257; CHECK-NEXT: add x8, x0, #16258; CHECK-NEXT: ldr z0, [x8, #-2, mul vl]259; CHECK-NEXT: ret260entry:261 %add.ptr = getelementptr inbounds i8, ptr %b, i64 16262 %0 = tail call i64 @llvm.vscale.i64()263 %1 = mul i64 %0, -32264 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 %1265 %2 = load <vscale x 4 x i32>, ptr %add.ptr1, align 16266 ret <vscale x 4 x i32> %2267}268 269define <vscale x 2 x i64> @i64_m2v_32s(ptr %b) {270; CHECK-LABEL: i64_m2v_32s:271; CHECK: // %bb.0: // %entry272; CHECK-NEXT: cnth x8, all, mul #4273; CHECK-NEXT: ptrue p0.d274; CHECK-NEXT: mov x9, #4 // =0x4275; CHECK-NEXT: sub x8, x0, x8276; CHECK-NEXT: ld1d { z0.d }, p0/z, [x8, x9, lsl #3]277; CHECK-NEXT: ret278entry:279 %0 = tail call i64 @llvm.vscale.i64()280 %1 = mul i64 %0, -32281 %add.ptr = getelementptr inbounds i8, ptr %b, i64 %1282 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 32283 %2 = load <vscale x 2 x i64>, ptr %add.ptr1, align 16284 ret <vscale x 2 x i64> %2285}286 287define <vscale x 2 x i64> @i64_32s_m2v(ptr %b) {288; CHECK-LABEL: i64_32s_m2v:289; CHECK: // %bb.0: // %entry290; CHECK-NEXT: add x8, x0, #32291; CHECK-NEXT: ldr z0, [x8, #-2, mul vl]292; CHECK-NEXT: ret293entry:294 %add.ptr = getelementptr inbounds i8, ptr %b, i64 32295 %0 = tail call i64 @llvm.vscale.i64()296 %1 = mul i64 %0, -32297 %add.ptr1 = getelementptr inbounds i8, ptr %add.ptr, i64 %1298 %2 = load <vscale x 2 x i64>, ptr %add.ptr1, align 16299 ret <vscale x 2 x i64> %2300}301 302declare i64 @llvm.vscale.i64()303