233 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 4define ptr @scalar_of_scalable_1(ptr %base) {5; CHECK-LABEL: scalar_of_scalable_1:6; CHECK: // %bb.0:7; CHECK-NEXT: rdvl x8, #48; CHECK-NEXT: add x0, x0, x89; CHECK-NEXT: ret10 %d = getelementptr <vscale x 2 x i64>, ptr %base, i64 411 ret ptr %d12}13 14define ptr @scalar_of_scalable_2(ptr %base, i64 %offset) {15; CHECK-LABEL: scalar_of_scalable_2:16; CHECK: // %bb.0:17; CHECK-NEXT: rdvl x8, #118; CHECK-NEXT: madd x0, x1, x8, x019; CHECK-NEXT: ret20 %d = getelementptr <vscale x 2 x i64>, ptr %base, i64 %offset21 ret ptr %d22}23 24define ptr @scalar_of_scalable_3(ptr %base, i64 %offset) {25; CHECK-LABEL: scalar_of_scalable_3:26; CHECK: // %bb.0:27; CHECK-NEXT: cnth x828; CHECK-NEXT: madd x0, x1, x8, x029; CHECK-NEXT: ret30 %d = getelementptr <vscale x 2 x i32>, ptr %base, i64 %offset31 ret ptr %d32}33 34define <2 x ptr> @fixed_of_scalable_1(ptr %base) {35; CHECK-LABEL: fixed_of_scalable_1:36; CHECK: // %bb.0:37; CHECK-NEXT: rdvl x8, #138; CHECK-NEXT: dup v1.2d, x039; CHECK-NEXT: dup v0.2d, x840; CHECK-NEXT: add v0.2d, v1.2d, v0.2d41; CHECK-NEXT: ret42 %d = getelementptr <vscale x 2 x i64>, ptr %base, <2 x i64> <i64 1, i64 1>43 ret <2 x ptr> %d44}45 46define <2 x ptr> @fixed_of_scalable_2(<2 x ptr> %base) {47; CHECK-LABEL: fixed_of_scalable_2:48; CHECK: // %bb.0:49; CHECK-NEXT: rdvl x8, #150; CHECK-NEXT: dup v1.2d, x851; CHECK-NEXT: add v0.2d, v0.2d, v1.2d52; CHECK-NEXT: ret53 %d = getelementptr <vscale x 2 x i64>, <2 x ptr> %base, <2 x i64> <i64 1, i64 1>54 ret <2 x ptr> %d55}56 57define <vscale x 2 x ptr> @scalable_of_fixed_1(ptr %base) {58; CHECK-LABEL: scalable_of_fixed_1:59; CHECK: // %bb.0:60; CHECK-NEXT: add x8, x0, #161; CHECK-NEXT: mov z0.d, x862; CHECK-NEXT: ret63 %d = getelementptr i8, ptr %base, <vscale x 2 x i64> splat (i64 1)64 ret <vscale x 2 x ptr> %d65}66 67define <vscale x 2 x ptr> @scalable_of_fixed_2(<vscale x 2 x ptr> %base) {68; CHECK-LABEL: scalable_of_fixed_2:69; CHECK: // %bb.0:70; CHECK-NEXT: add z0.d, z0.d, #1 // =0x171; CHECK-NEXT: ret72 %d = getelementptr i8, <vscale x 2 x ptr> %base, <vscale x 2 x i64> splat (i64 1)73 ret <vscale x 2 x ptr> %d74}75 76define <vscale x 2 x ptr> @scalable_of_fixed_3_i8(ptr %base, <vscale x 2 x i64> %idx) {77; CHECK-LABEL: scalable_of_fixed_3_i8:78; CHECK: // %bb.0:79; CHECK-NEXT: mov z1.d, x080; CHECK-NEXT: add z0.d, z1.d, z0.d81; CHECK-NEXT: ret82 %d = getelementptr i8, ptr %base, <vscale x 2 x i64> %idx83 ret <vscale x 2 x ptr> %d84}85 86define <vscale x 2 x ptr> @scalable_of_fixed_3_i16(ptr %base, <vscale x 2 x i64> %idx) {87; CHECK-LABEL: scalable_of_fixed_3_i16:88; CHECK: // %bb.0:89; CHECK-NEXT: mov z1.d, x090; CHECK-NEXT: adr z0.d, [z1.d, z0.d, lsl #1]91; CHECK-NEXT: ret92 %d = getelementptr i16, ptr %base, <vscale x 2 x i64> %idx93 ret <vscale x 2 x ptr> %d94}95 96define <vscale x 2 x ptr> @scalable_of_fixed_3_i32(ptr %base, <vscale x 2 x i64> %idx) {97; CHECK-LABEL: scalable_of_fixed_3_i32:98; CHECK: // %bb.0:99; CHECK-NEXT: mov z1.d, x0100; CHECK-NEXT: adr z0.d, [z1.d, z0.d, lsl #2]101; CHECK-NEXT: ret102 %d = getelementptr i32, ptr %base, <vscale x 2 x i64> %idx103 ret <vscale x 2 x ptr> %d104}105 106define <vscale x 2 x ptr> @scalable_of_fixed_3_i64(ptr %base, <vscale x 2 x i64> %idx) {107; CHECK-LABEL: scalable_of_fixed_3_i64:108; CHECK: // %bb.0:109; CHECK-NEXT: mov z1.d, x0110; CHECK-NEXT: adr z0.d, [z1.d, z0.d, lsl #3]111; CHECK-NEXT: ret112 %d = getelementptr i64, ptr %base, <vscale x 2 x i64> %idx113 ret <vscale x 2 x ptr> %d114}115 116define <vscale x 2 x ptr> @scalable_of_fixed_4_i8(ptr %base, <vscale x 2 x i32> %idx) {117; CHECK-LABEL: scalable_of_fixed_4_i8:118; CHECK: // %bb.0:119; CHECK-NEXT: mov z1.d, x0120; CHECK-NEXT: adr z0.d, [z1.d, z0.d, sxtw]121; CHECK-NEXT: ret122 %d = getelementptr i8, ptr %base, <vscale x 2 x i32> %idx123 ret <vscale x 2 x ptr> %d124}125 126define <vscale x 2 x ptr> @scalable_of_fixed_4_i16(ptr %base, <vscale x 2 x i32> %idx) {127; CHECK-LABEL: scalable_of_fixed_4_i16:128; CHECK: // %bb.0:129; CHECK-NEXT: mov z1.d, x0130; CHECK-NEXT: adr z0.d, [z1.d, z0.d, sxtw #1]131; CHECK-NEXT: ret132 %d = getelementptr i16, ptr %base, <vscale x 2 x i32> %idx133 ret <vscale x 2 x ptr> %d134}135 136define <vscale x 2 x ptr> @scalable_of_fixed_4_i32(ptr %base, <vscale x 2 x i32> %idx) {137; CHECK-LABEL: scalable_of_fixed_4_i32:138; CHECK: // %bb.0:139; CHECK-NEXT: mov z1.d, x0140; CHECK-NEXT: adr z0.d, [z1.d, z0.d, sxtw #2]141; CHECK-NEXT: ret142 %d = getelementptr i32, ptr %base, <vscale x 2 x i32> %idx143 ret <vscale x 2 x ptr> %d144}145 146define <vscale x 2 x ptr> @scalable_of_fixed_4_i64(ptr %base, <vscale x 2 x i32> %idx) {147; CHECK-LABEL: scalable_of_fixed_4_i64:148; CHECK: // %bb.0:149; CHECK-NEXT: mov z1.d, x0150; CHECK-NEXT: adr z0.d, [z1.d, z0.d, sxtw #3]151; CHECK-NEXT: ret152 %d = getelementptr i64, ptr %base, <vscale x 2 x i32> %idx153 ret <vscale x 2 x ptr> %d154}155 156define <vscale x 2 x ptr> @scalable_of_fixed_5(ptr %base, <vscale x 2 x i32> %idx) {157; CHECK-LABEL: scalable_of_fixed_5:158; CHECK: // %bb.0:159; CHECK-NEXT: mov z1.d, x0160; CHECK-NEXT: adr z0.d, [z1.d, z0.d, uxtw]161; CHECK-NEXT: ret162 %idxZext = zext <vscale x 2 x i32> %idx to <vscale x 2 x i64>163 %d = getelementptr i8, ptr %base, <vscale x 2 x i64> %idxZext164 ret <vscale x 2 x ptr> %d165}166 167define <vscale x 2 x ptr> @scalable_of_fixed_5_i16(ptr %base, <vscale x 2 x i32> %idx) {168; CHECK-LABEL: scalable_of_fixed_5_i16:169; CHECK: // %bb.0:170; CHECK-NEXT: mov z1.d, x0171; CHECK-NEXT: adr z0.d, [z1.d, z0.d, uxtw #1]172; CHECK-NEXT: ret173 %idxZext = zext <vscale x 2 x i32> %idx to <vscale x 2 x i64>174 %d = getelementptr i16, ptr %base, <vscale x 2 x i64> %idxZext175 ret <vscale x 2 x ptr> %d176}177 178define <vscale x 2 x ptr> @scalable_of_fixed_5_i32(ptr %base, <vscale x 2 x i32> %idx) {179; CHECK-LABEL: scalable_of_fixed_5_i32:180; CHECK: // %bb.0:181; CHECK-NEXT: mov z1.d, x0182; CHECK-NEXT: adr z0.d, [z1.d, z0.d, uxtw #2]183; CHECK-NEXT: ret184 %idxZext = zext <vscale x 2 x i32> %idx to <vscale x 2 x i64>185 %d = getelementptr i32, ptr %base, <vscale x 2 x i64> %idxZext186 ret <vscale x 2 x ptr> %d187}188 189 190define <vscale x 2 x ptr> @scalable_of_fixed_5_i64(ptr %base, <vscale x 2 x i32> %idx) {191; CHECK-LABEL: scalable_of_fixed_5_i64:192; CHECK: // %bb.0:193; CHECK-NEXT: mov z1.d, x0194; CHECK-NEXT: adr z0.d, [z1.d, z0.d, uxtw #3]195; CHECK-NEXT: ret196 %idxZext = zext <vscale x 2 x i32> %idx to <vscale x 2 x i64>197 %d = getelementptr i64, ptr %base, <vscale x 2 x i64> %idxZext198 ret <vscale x 2 x ptr> %d199}200 201define <vscale x 2 x ptr> @scalable_of_scalable_1(ptr %base) {202; CHECK-LABEL: scalable_of_scalable_1:203; CHECK: // %bb.0:204; CHECK-NEXT: rdvl x8, #1205; CHECK-NEXT: add x8, x0, x8206; CHECK-NEXT: mov z0.d, x8207; CHECK-NEXT: ret208 %d = getelementptr <vscale x 2 x i64>, ptr %base, <vscale x 2 x i64> splat (i64 1)209 ret <vscale x 2 x ptr> %d210}211 212define <vscale x 2 x ptr> @scalable_of_scalable_2(<vscale x 2 x ptr> %base) {213; CHECK-LABEL: scalable_of_scalable_2:214; CHECK: // %bb.0:215; CHECK-NEXT: incd z0.d, all, mul #8216; CHECK-NEXT: ret217 %d = getelementptr <vscale x 2 x i64>, <vscale x 2 x ptr> %base, <vscale x 2 x i64> splat (i64 1)218 ret <vscale x 2 x ptr> %d219}220 221define <vscale x 2 x ptr> @scalable_of_scalable_3(<vscale x 2 x ptr> %base, <vscale x 2 x i32> %idx) {222; CHECK-LABEL: scalable_of_scalable_3:223; CHECK: // %bb.0:224; CHECK-NEXT: ptrue p0.d225; CHECK-NEXT: rdvl x8, #1226; CHECK-NEXT: mov z2.d, x8227; CHECK-NEXT: sxtw z1.d, p0/m, z1.d228; CHECK-NEXT: mla z0.d, p0/m, z1.d, z2.d229; CHECK-NEXT: ret230 %d = getelementptr <vscale x 2 x i64>, <vscale x 2 x ptr> %base, <vscale x 2 x i32> %idx231 ret <vscale x 2 x ptr> %d232}233