brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.8 KiB · 242adb1 Raw
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