370 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - | FileCheck %s3 4define arm_aapcs_vfpcc <4 x i32> @vmlau32(<4 x i32> %A, <4 x i32> %B, i32 %X) nounwind {5; CHECK-LABEL: vmlau32:6; CHECK: @ %bb.0: @ %entry7; CHECK-NEXT: vmla.i32 q0, q1, r08; CHECK-NEXT: bx lr9entry:10 %0 = insertelement <4 x i32> undef, i32 %X, i32 011 %1 = shufflevector <4 x i32> %0, <4 x i32> undef, <4 x i32> zeroinitializer12 %2 = mul nsw <4 x i32> %B, %113 %3 = add nsw <4 x i32> %A, %214 ret <4 x i32> %315}16 17define arm_aapcs_vfpcc <4 x i32> @vmlau32b(<4 x i32> %A, <4 x i32> %B, i32 %X) nounwind {18; CHECK-LABEL: vmlau32b:19; CHECK: @ %bb.0: @ %entry20; CHECK-NEXT: vmla.i32 q0, q1, r021; CHECK-NEXT: bx lr22entry:23 %0 = insertelement <4 x i32> undef, i32 %X, i32 024 %1 = shufflevector <4 x i32> %0, <4 x i32> undef, <4 x i32> zeroinitializer25 %2 = mul nsw <4 x i32> %1, %B26 %3 = add nsw <4 x i32> %2, %A27 ret <4 x i32> %328}29 30define arm_aapcs_vfpcc <8 x i16> @vmlau16(<8 x i16> %A, <8 x i16> %B, i16 %X) nounwind {31; CHECK-LABEL: vmlau16:32; CHECK: @ %bb.0: @ %entry33; CHECK-NEXT: vmla.i16 q0, q1, r034; CHECK-NEXT: bx lr35entry:36 %0 = insertelement <8 x i16> undef, i16 %X, i32 037 %1 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer38 %2 = mul nsw <8 x i16> %B, %139 %3 = add nsw <8 x i16> %A, %240 ret <8 x i16> %341}42 43define arm_aapcs_vfpcc <8 x i16> @vmlau16b(<8 x i16> %A, <8 x i16> %B, i16 %X) nounwind {44; CHECK-LABEL: vmlau16b:45; CHECK: @ %bb.0: @ %entry46; CHECK-NEXT: vmla.i16 q0, q1, r047; CHECK-NEXT: bx lr48entry:49 %0 = insertelement <8 x i16> undef, i16 %X, i32 050 %1 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer51 %2 = mul nsw <8 x i16> %1, %B52 %3 = add nsw <8 x i16> %2, %A53 ret <8 x i16> %354}55 56define arm_aapcs_vfpcc <16 x i8> @vmlau8(<16 x i8> %A, <16 x i8> %B, i8 %X) nounwind {57; CHECK-LABEL: vmlau8:58; CHECK: @ %bb.0: @ %entry59; CHECK-NEXT: vmla.i8 q0, q1, r060; CHECK-NEXT: bx lr61entry:62 %0 = insertelement <16 x i8> undef, i8 %X, i32 063 %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> zeroinitializer64 %2 = mul nsw <16 x i8> %B, %165 %3 = add nsw <16 x i8> %A, %266 ret <16 x i8> %367}68 69define arm_aapcs_vfpcc <16 x i8> @vmlau8b(<16 x i8> %A, <16 x i8> %B, i8 %X) nounwind {70; CHECK-LABEL: vmlau8b:71; CHECK: @ %bb.0: @ %entry72; CHECK-NEXT: vmla.i8 q0, q1, r073; CHECK-NEXT: bx lr74entry:75 %0 = insertelement <16 x i8> undef, i8 %X, i32 076 %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> zeroinitializer77 %2 = mul nsw <16 x i8> %1, %B78 %3 = add nsw <16 x i8> %2, %A79 ret <16 x i8> %380}81 82define void @vmla32_in_loop(ptr %s1, i32 %x, ptr %d, i32 %n) {83; CHECK-LABEL: vmla32_in_loop:84; CHECK: @ %bb.0: @ %entry85; CHECK-NEXT: .LBB6_1: @ %vector.body86; CHECK-NEXT: @ =>This Inner Loop Header: Depth=187; CHECK-NEXT: vldrw.u32 q0, [r0], #1688; CHECK-NEXT: vldrw.u32 q1, [r2]89; CHECK-NEXT: subs r3, #490; CHECK-NEXT: vmla.i32 q1, q0, r191; CHECK-NEXT: vstrb.8 q1, [r2], #1692; CHECK-NEXT: bne .LBB6_193; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup94; CHECK-NEXT: bx lr95entry:96 %broadcast.splatinsert8 = insertelement <4 x i32> undef, i32 %x, i32 097 %broadcast.splat9 = shufflevector <4 x i32> %broadcast.splatinsert8, <4 x i32> undef, <4 x i32> zeroinitializer98 br label %vector.body99 100vector.body:101 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]102 %0 = getelementptr inbounds i32, ptr %s1, i32 %index103 %wide.load = load <4 x i32>, ptr %0, align 4104 %1 = mul nsw <4 x i32> %wide.load, %broadcast.splat9105 %2 = getelementptr inbounds i32, ptr %d, i32 %index106 %wide.load10 = load <4 x i32>, ptr %2, align 4107 %3 = add nsw <4 x i32> %wide.load10, %1108 store <4 x i32> %3, ptr %2, align 4109 %index.next = add i32 %index, 4110 %4 = icmp eq i32 %index.next, %n111 br i1 %4, label %for.cond.cleanup, label %vector.body112 113for.cond.cleanup:114 ret void115}116 117define void @vmla16_in_loop(ptr %s1, i16 %x, ptr %d, i32 %n) {118; CHECK-LABEL: vmla16_in_loop:119; CHECK: @ %bb.0: @ %entry120; CHECK-NEXT: .LBB7_1: @ %vector.body121; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1122; CHECK-NEXT: vldrh.u16 q0, [r0], #16123; CHECK-NEXT: vldrh.u16 q1, [r2]124; CHECK-NEXT: subs r3, #8125; CHECK-NEXT: vmla.i16 q1, q0, r1126; CHECK-NEXT: vstrb.8 q1, [r2], #16127; CHECK-NEXT: bne .LBB7_1128; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup129; CHECK-NEXT: bx lr130entry:131 %broadcast.splatinsert11 = insertelement <8 x i16> undef, i16 %x, i32 0132 %broadcast.splat12 = shufflevector <8 x i16> %broadcast.splatinsert11, <8 x i16> undef, <8 x i32> zeroinitializer133 br label %vector.body134 135vector.body:136 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]137 %0 = getelementptr inbounds i16, ptr %s1, i32 %index138 %wide.load = load <8 x i16>, ptr %0, align 2139 %1 = mul <8 x i16> %wide.load, %broadcast.splat12140 %2 = getelementptr inbounds i16, ptr %d, i32 %index141 %wide.load13 = load <8 x i16>, ptr %2, align 2142 %3 = add <8 x i16> %1, %wide.load13143 store <8 x i16> %3, ptr %2, align 2144 %index.next = add i32 %index, 8145 %4 = icmp eq i32 %index.next, %n146 br i1 %4, label %for.cond.cleanup, label %vector.body147 148for.cond.cleanup:149 ret void150}151 152define void @vmla8_in_loop(ptr %s1, i8 %x, ptr %d, i32 %n) {153; CHECK-LABEL: vmla8_in_loop:154; CHECK: @ %bb.0: @ %entry155; CHECK-NEXT: .LBB8_1: @ %vector.body156; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1157; CHECK-NEXT: vldrh.u16 q0, [r0], #16158; CHECK-NEXT: vldrh.u16 q1, [r2]159; CHECK-NEXT: subs r3, #16160; CHECK-NEXT: vmla.i8 q1, q0, r1161; CHECK-NEXT: vstrb.8 q1, [r2], #16162; CHECK-NEXT: bne .LBB8_1163; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup164; CHECK-NEXT: bx lr165entry:166 %broadcast.splatinsert11 = insertelement <16 x i8> undef, i8 %x, i32 0167 %broadcast.splat12 = shufflevector <16 x i8> %broadcast.splatinsert11, <16 x i8> undef, <16 x i32> zeroinitializer168 br label %vector.body169 170vector.body:171 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]172 %0 = getelementptr inbounds i8, ptr %s1, i32 %index173 %wide.load = load <16 x i8>, ptr %0, align 2174 %1 = mul <16 x i8> %wide.load, %broadcast.splat12175 %2 = getelementptr inbounds i8, ptr %d, i32 %index176 %wide.load13 = load <16 x i8>, ptr %2, align 2177 %3 = add <16 x i8> %1, %wide.load13178 store <16 x i8> %3, ptr %2, align 2179 %index.next = add i32 %index, 16180 %4 = icmp eq i32 %index.next, %n181 br i1 %4, label %for.cond.cleanup, label %vector.body182 183for.cond.cleanup:184 ret void185}186 187 188define arm_aapcs_vfpcc <4 x i32> @vmlasu32(<4 x i32> %A, <4 x i32> %B, i32 %X) nounwind {189; CHECK-LABEL: vmlasu32:190; CHECK: @ %bb.0: @ %entry191; CHECK-NEXT: vmlas.i32 q0, q1, r0192; CHECK-NEXT: bx lr193entry:194 %0 = insertelement <4 x i32> undef, i32 %X, i32 0195 %1 = shufflevector <4 x i32> %0, <4 x i32> undef, <4 x i32> zeroinitializer196 %2 = mul nsw <4 x i32> %A, %B197 %3 = add nsw <4 x i32> %1, %2198 ret <4 x i32> %3199}200 201define arm_aapcs_vfpcc <4 x i32> @vmlasu32b(<4 x i32> %A, <4 x i32> %B, i32 %X) nounwind {202; CHECK-LABEL: vmlasu32b:203; CHECK: @ %bb.0: @ %entry204; CHECK-NEXT: vmlas.i32 q0, q1, r0205; CHECK-NEXT: bx lr206entry:207 %0 = insertelement <4 x i32> undef, i32 %X, i32 0208 %1 = shufflevector <4 x i32> %0, <4 x i32> undef, <4 x i32> zeroinitializer209 %2 = mul nsw <4 x i32> %A, %B210 %3 = add nsw <4 x i32> %2, %1211 ret <4 x i32> %3212}213 214define arm_aapcs_vfpcc <8 x i16> @vmlasu16(<8 x i16> %A, <8 x i16> %B, i16 %X) nounwind {215; CHECK-LABEL: vmlasu16:216; CHECK: @ %bb.0: @ %entry217; CHECK-NEXT: vmlas.i16 q0, q1, r0218; CHECK-NEXT: bx lr219entry:220 %0 = insertelement <8 x i16> undef, i16 %X, i32 0221 %1 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer222 %2 = mul nsw <8 x i16> %A, %B223 %3 = add nsw <8 x i16> %1, %2224 ret <8 x i16> %3225}226 227define arm_aapcs_vfpcc <8 x i16> @vmlasu16b(<8 x i16> %A, <8 x i16> %B, i16 %X) nounwind {228; CHECK-LABEL: vmlasu16b:229; CHECK: @ %bb.0: @ %entry230; CHECK-NEXT: vmlas.i16 q0, q1, r0231; CHECK-NEXT: bx lr232entry:233 %0 = insertelement <8 x i16> undef, i16 %X, i32 0234 %1 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer235 %2 = mul nsw <8 x i16> %A, %B236 %3 = add nsw <8 x i16> %2, %1237 ret <8 x i16> %3238}239 240define arm_aapcs_vfpcc <16 x i8> @vmlasu8(<16 x i8> %A, <16 x i8> %B, i8 %X) nounwind {241; CHECK-LABEL: vmlasu8:242; CHECK: @ %bb.0: @ %entry243; CHECK-NEXT: vmlas.i8 q0, q1, r0244; CHECK-NEXT: bx lr245entry:246 %0 = insertelement <16 x i8> undef, i8 %X, i32 0247 %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> zeroinitializer248 %2 = mul nsw <16 x i8> %A, %B249 %3 = add nsw <16 x i8> %1, %2250 ret <16 x i8> %3251}252 253define arm_aapcs_vfpcc <16 x i8> @vmlasu8b(<16 x i8> %A, <16 x i8> %B, i8 %X) nounwind {254; CHECK-LABEL: vmlasu8b:255; CHECK: @ %bb.0: @ %entry256; CHECK-NEXT: vmlas.i8 q0, q1, r0257; CHECK-NEXT: bx lr258entry:259 %0 = insertelement <16 x i8> undef, i8 %X, i32 0260 %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> zeroinitializer261 %2 = mul nsw <16 x i8> %A, %B262 %3 = add nsw <16 x i8> %2, %1263 ret <16 x i8> %3264}265 266define void @vmlas32_in_loop(ptr %s1, i32 %x, ptr %d, i32 %n) {267; CHECK-LABEL: vmlas32_in_loop:268; CHECK: @ %bb.0: @ %entry269; CHECK-NEXT: .LBB15_1: @ %vector.body270; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1271; CHECK-NEXT: vldrw.u32 q0, [r2]272; CHECK-NEXT: vldrw.u32 q1, [r0], #16273; CHECK-NEXT: subs r3, #4274; CHECK-NEXT: vmlas.i32 q1, q0, r1275; CHECK-NEXT: vstrb.8 q1, [r2], #16276; CHECK-NEXT: bne .LBB15_1277; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup278; CHECK-NEXT: bx lr279entry:280 %broadcast.splatinsert8 = insertelement <4 x i32> undef, i32 %x, i32 0281 %broadcast.splat9 = shufflevector <4 x i32> %broadcast.splatinsert8, <4 x i32> undef, <4 x i32> zeroinitializer282 br label %vector.body283 284vector.body:285 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]286 %0 = getelementptr inbounds i32, ptr %s1, i32 %index287 %wide.load = load <4 x i32>, ptr %0, align 4288 %1 = getelementptr inbounds i32, ptr %d, i32 %index289 %wide.load10 = load <4 x i32>, ptr %1, align 4290 %2 = mul nsw <4 x i32> %wide.load, %wide.load10291 %3 = add nsw <4 x i32> %broadcast.splat9, %2292 store <4 x i32> %3, ptr %1, align 4293 %index.next = add i32 %index, 4294 %4 = icmp eq i32 %index.next, %n295 br i1 %4, label %for.cond.cleanup, label %vector.body296 297for.cond.cleanup:298 ret void299}300 301define void @vmlas16_in_loop(ptr %s1, i16 %x, ptr %d, i32 %n) {302; CHECK-LABEL: vmlas16_in_loop:303; CHECK: @ %bb.0: @ %entry304; CHECK-NEXT: .LBB16_1: @ %vector.body305; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1306; CHECK-NEXT: vldrh.u16 q0, [r2]307; CHECK-NEXT: vldrh.u16 q1, [r0], #16308; CHECK-NEXT: subs r3, #8309; CHECK-NEXT: vmlas.i16 q1, q0, r1310; CHECK-NEXT: vstrb.8 q1, [r2], #16311; CHECK-NEXT: bne .LBB16_1312; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup313; CHECK-NEXT: bx lr314entry:315 %broadcast.splatinsert11 = insertelement <8 x i16> undef, i16 %x, i32 0316 %broadcast.splat12 = shufflevector <8 x i16> %broadcast.splatinsert11, <8 x i16> undef, <8 x i32> zeroinitializer317 br label %vector.body318 319vector.body:320 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]321 %0 = getelementptr inbounds i16, ptr %s1, i32 %index322 %wide.load = load <8 x i16>, ptr %0, align 2323 %1 = getelementptr inbounds i16, ptr %d, i32 %index324 %wide.load13 = load <8 x i16>, ptr %1, align 2325 %2 = mul <8 x i16> %wide.load, %wide.load13326 %3 = add <8 x i16> %2, %broadcast.splat12327 store <8 x i16> %3, ptr %1, align 2328 %index.next = add i32 %index, 8329 %4 = icmp eq i32 %index.next, %n330 br i1 %4, label %for.cond.cleanup, label %vector.body331 332for.cond.cleanup:333 ret void334}335 336define void @vmlas8_in_loop(ptr %s1, i8 %x, ptr %d, i32 %n) {337; CHECK-LABEL: vmlas8_in_loop:338; CHECK: @ %bb.0: @ %entry339; CHECK-NEXT: .LBB17_1: @ %vector.body340; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1341; CHECK-NEXT: vldrh.u16 q0, [r2]342; CHECK-NEXT: vldrh.u16 q1, [r0], #16343; CHECK-NEXT: subs r3, #16344; CHECK-NEXT: vmlas.i8 q1, q0, r1345; CHECK-NEXT: vstrb.8 q1, [r2], #16346; CHECK-NEXT: bne .LBB17_1347; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup348; CHECK-NEXT: bx lr349entry:350 %broadcast.splatinsert11 = insertelement <16 x i8> undef, i8 %x, i32 0351 %broadcast.splat12 = shufflevector <16 x i8> %broadcast.splatinsert11, <16 x i8> undef, <16 x i32> zeroinitializer352 br label %vector.body353 354vector.body:355 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]356 %0 = getelementptr inbounds i8, ptr %s1, i32 %index357 %wide.load = load <16 x i8>, ptr %0, align 2358 %1 = getelementptr inbounds i8, ptr %d, i32 %index359 %wide.load13 = load <16 x i8>, ptr %1, align 2360 %2 = mul <16 x i8> %wide.load, %wide.load13361 %3 = add <16 x i8> %2, %broadcast.splat12362 store <16 x i8> %3, ptr %1, align 2363 %index.next = add i32 %index, 16364 %4 = icmp eq i32 %index.next, %n365 br i1 %4, label %for.cond.cleanup, label %vector.body366 367for.cond.cleanup:368 ret void369}370