283 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 -verify-machineinstrs -tail-predication=enabled -o - %s | FileCheck %s3 4define arm_aapcs_vfpcc void @round(ptr noalias nocapture readonly %pSrcA, ptr noalias nocapture %pDst, i32 %n) #0 {5; CHECK-LABEL: round:6; CHECK: @ %bb.0: @ %entry7; CHECK-NEXT: .save {r7, lr}8; CHECK-NEXT: push {r7, lr}9; CHECK-NEXT: cmp r2, #010; CHECK-NEXT: it eq11; CHECK-NEXT: popeq {r7, pc}12; CHECK-NEXT: .LBB0_1: @ %vector.ph13; CHECK-NEXT: dlstp.32 lr, r214; CHECK-NEXT: .LBB0_2: @ %vector.body15; CHECK-NEXT: @ =>This Inner Loop Header: Depth=116; CHECK-NEXT: vldrw.u32 q0, [r0], #1617; CHECK-NEXT: vrinta.f32 q0, q018; CHECK-NEXT: vstrw.32 q0, [r1], #1619; CHECK-NEXT: letp lr, .LBB0_220; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup21; CHECK-NEXT: pop {r7, pc}22entry:23 %cmp5 = icmp eq i32 %n, 024 br i1 %cmp5, label %for.cond.cleanup, label %vector.ph25 26vector.ph: ; preds = %entry27 %n.rnd.up = add i32 %n, 328 %n.vec = and i32 %n.rnd.up, -429 br label %vector.body30 31vector.body: ; preds = %vector.body, %vector.ph32 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]33 %next.gep = getelementptr float, ptr %pSrcA, i32 %index34 %next.gep14 = getelementptr float, ptr %pDst, i32 %index35 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)36 %wide.masked.load = call <4 x float> @llvm.masked.load.v4f32.p0(ptr %next.gep, i32 4, <4 x i1> %active.lane.mask, <4 x float> undef)37 %0 = call fast <4 x float> @llvm.round.v4f32(<4 x float> %wide.masked.load)38 call void @llvm.masked.store.v4f32.p0(<4 x float> %0, ptr %next.gep14, i32 4, <4 x i1> %active.lane.mask)39 %index.next = add i32 %index, 440 %1 = icmp eq i32 %index.next, %n.vec41 br i1 %1, label %for.cond.cleanup, label %vector.body42 43for.cond.cleanup: ; preds = %vector.body, %entry44 ret void45}46 47define arm_aapcs_vfpcc void @rint(ptr noalias nocapture readonly %pSrcA, ptr noalias nocapture %pDst, i32 %n) #0 {48; CHECK-LABEL: rint:49; CHECK: @ %bb.0: @ %entry50; CHECK-NEXT: .save {r7, lr}51; CHECK-NEXT: push {r7, lr}52; CHECK-NEXT: cmp r2, #053; CHECK-NEXT: it eq54; CHECK-NEXT: popeq {r7, pc}55; CHECK-NEXT: .LBB1_1: @ %vector.ph56; CHECK-NEXT: dlstp.32 lr, r257; CHECK-NEXT: .LBB1_2: @ %vector.body58; CHECK-NEXT: @ =>This Inner Loop Header: Depth=159; CHECK-NEXT: vldrw.u32 q0, [r0], #1660; CHECK-NEXT: vrintx.f32 q0, q061; CHECK-NEXT: vstrw.32 q0, [r1], #1662; CHECK-NEXT: letp lr, .LBB1_263; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup64; CHECK-NEXT: pop {r7, pc}65entry:66 %cmp5 = icmp eq i32 %n, 067 br i1 %cmp5, label %for.cond.cleanup, label %vector.ph68 69vector.ph: ; preds = %entry70 %n.rnd.up = add i32 %n, 371 %n.vec = and i32 %n.rnd.up, -472 br label %vector.body73 74vector.body: ; preds = %vector.body, %vector.ph75 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]76 %next.gep = getelementptr float, ptr %pSrcA, i32 %index77 %next.gep14 = getelementptr float, ptr %pDst, i32 %index78 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)79 %wide.masked.load = call <4 x float> @llvm.masked.load.v4f32.p0(ptr %next.gep, i32 4, <4 x i1> %active.lane.mask, <4 x float> undef)80 %0 = call fast <4 x float> @llvm.rint.v4f32(<4 x float> %wide.masked.load)81 call void @llvm.masked.store.v4f32.p0(<4 x float> %0, ptr %next.gep14, i32 4, <4 x i1> %active.lane.mask)82 %index.next = add i32 %index, 483 %1 = icmp eq i32 %index.next, %n.vec84 br i1 %1, label %for.cond.cleanup, label %vector.body85 86for.cond.cleanup: ; preds = %vector.body, %entry87 ret void88}89 90define arm_aapcs_vfpcc void @trunc(ptr noalias nocapture readonly %pSrcA, ptr noalias nocapture %pDst, i32 %n) #0 {91; CHECK-LABEL: trunc:92; CHECK: @ %bb.0: @ %entry93; CHECK-NEXT: .save {r7, lr}94; CHECK-NEXT: push {r7, lr}95; CHECK-NEXT: cmp r2, #096; CHECK-NEXT: it eq97; CHECK-NEXT: popeq {r7, pc}98; CHECK-NEXT: .LBB2_1: @ %vector.ph99; CHECK-NEXT: dlstp.32 lr, r2100; CHECK-NEXT: .LBB2_2: @ %vector.body101; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1102; CHECK-NEXT: vldrw.u32 q0, [r0], #16103; CHECK-NEXT: vrintz.f32 q0, q0104; CHECK-NEXT: vstrw.32 q0, [r1], #16105; CHECK-NEXT: letp lr, .LBB2_2106; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup107; CHECK-NEXT: pop {r7, pc}108entry:109 %cmp5 = icmp eq i32 %n, 0110 br i1 %cmp5, label %for.cond.cleanup, label %vector.ph111 112vector.ph: ; preds = %entry113 %n.rnd.up = add i32 %n, 3114 %n.vec = and i32 %n.rnd.up, -4115 br label %vector.body116 117vector.body: ; preds = %vector.body, %vector.ph118 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]119 %next.gep = getelementptr float, ptr %pSrcA, i32 %index120 %next.gep14 = getelementptr float, ptr %pDst, i32 %index121 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)122 %wide.masked.load = call <4 x float> @llvm.masked.load.v4f32.p0(ptr %next.gep, i32 4, <4 x i1> %active.lane.mask, <4 x float> undef)123 %0 = call fast <4 x float> @llvm.trunc.v4f32(<4 x float> %wide.masked.load)124 call void @llvm.masked.store.v4f32.p0(<4 x float> %0, ptr %next.gep14, i32 4, <4 x i1> %active.lane.mask)125 %index.next = add i32 %index, 4126 %1 = icmp eq i32 %index.next, %n.vec127 br i1 %1, label %for.cond.cleanup, label %vector.body128 129for.cond.cleanup: ; preds = %vector.body, %entry130 ret void131}132 133define arm_aapcs_vfpcc void @ceil(ptr noalias nocapture readonly %pSrcA, ptr noalias nocapture %pDst, i32 %n) #0 {134; CHECK-LABEL: ceil:135; CHECK: @ %bb.0: @ %entry136; CHECK-NEXT: .save {r7, lr}137; CHECK-NEXT: push {r7, lr}138; CHECK-NEXT: cmp r2, #0139; CHECK-NEXT: it eq140; CHECK-NEXT: popeq {r7, pc}141; CHECK-NEXT: .LBB3_1: @ %vector.ph142; CHECK-NEXT: dlstp.32 lr, r2143; CHECK-NEXT: .LBB3_2: @ %vector.body144; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1145; CHECK-NEXT: vldrw.u32 q0, [r0], #16146; CHECK-NEXT: vrintp.f32 q0, q0147; CHECK-NEXT: vstrw.32 q0, [r1], #16148; CHECK-NEXT: letp lr, .LBB3_2149; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup150; CHECK-NEXT: pop {r7, pc}151entry:152 %cmp5 = icmp eq i32 %n, 0153 br i1 %cmp5, label %for.cond.cleanup, label %vector.ph154 155vector.ph: ; preds = %entry156 %n.rnd.up = add i32 %n, 3157 %n.vec = and i32 %n.rnd.up, -4158 br label %vector.body159 160vector.body: ; preds = %vector.body, %vector.ph161 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]162 %next.gep = getelementptr float, ptr %pSrcA, i32 %index163 %next.gep14 = getelementptr float, ptr %pDst, i32 %index164 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)165 %wide.masked.load = call <4 x float> @llvm.masked.load.v4f32.p0(ptr %next.gep, i32 4, <4 x i1> %active.lane.mask, <4 x float> undef)166 %0 = call fast <4 x float> @llvm.ceil.v4f32(<4 x float> %wide.masked.load)167 call void @llvm.masked.store.v4f32.p0(<4 x float> %0, ptr %next.gep14, i32 4, <4 x i1> %active.lane.mask)168 %index.next = add i32 %index, 4169 %1 = icmp eq i32 %index.next, %n.vec170 br i1 %1, label %for.cond.cleanup, label %vector.body171 172for.cond.cleanup: ; preds = %vector.body, %entry173 ret void174}175 176define arm_aapcs_vfpcc void @floor(ptr noalias nocapture readonly %pSrcA, ptr noalias nocapture %pDst, i32 %n) #0 {177; CHECK-LABEL: floor:178; CHECK: @ %bb.0: @ %entry179; CHECK-NEXT: .save {r7, lr}180; CHECK-NEXT: push {r7, lr}181; CHECK-NEXT: cmp r2, #0182; CHECK-NEXT: it eq183; CHECK-NEXT: popeq {r7, pc}184; CHECK-NEXT: .LBB4_1: @ %vector.ph185; CHECK-NEXT: dlstp.32 lr, r2186; CHECK-NEXT: .LBB4_2: @ %vector.body187; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1188; CHECK-NEXT: vldrw.u32 q0, [r0], #16189; CHECK-NEXT: vrintm.f32 q0, q0190; CHECK-NEXT: vstrw.32 q0, [r1], #16191; CHECK-NEXT: letp lr, .LBB4_2192; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup193; CHECK-NEXT: pop {r7, pc}194entry:195 %cmp5 = icmp eq i32 %n, 0196 br i1 %cmp5, label %for.cond.cleanup, label %vector.ph197 198vector.ph: ; preds = %entry199 %n.rnd.up = add i32 %n, 3200 %n.vec = and i32 %n.rnd.up, -4201 br label %vector.body202 203vector.body: ; preds = %vector.body, %vector.ph204 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]205 %next.gep = getelementptr float, ptr %pSrcA, i32 %index206 %next.gep14 = getelementptr float, ptr %pDst, i32 %index207 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)208 %wide.masked.load = call <4 x float> @llvm.masked.load.v4f32.p0(ptr %next.gep, i32 4, <4 x i1> %active.lane.mask, <4 x float> undef)209 %0 = call fast <4 x float> @llvm.floor.v4f32(<4 x float> %wide.masked.load)210 call void @llvm.masked.store.v4f32.p0(<4 x float> %0, ptr %next.gep14, i32 4, <4 x i1> %active.lane.mask)211 %index.next = add i32 %index, 4212 %1 = icmp eq i32 %index.next, %n.vec213 br i1 %1, label %for.cond.cleanup, label %vector.body214 215for.cond.cleanup: ; preds = %vector.body, %entry216 ret void217}218 219; nearbyint shouldn't be tail predicated because it's lowered into multiple instructions220define arm_aapcs_vfpcc void @nearbyint(ptr noalias nocapture readonly %pSrcA, ptr noalias nocapture %pDst, i32 %n) #0 {221; CHECK-LABEL: nearbyint:222; CHECK: @ %bb.0: @ %entry223; CHECK-NEXT: .save {r7, lr}224; CHECK-NEXT: push {r7, lr}225; CHECK-NEXT: cmp r2, #0226; CHECK-NEXT: it eq227; CHECK-NEXT: popeq {r7, pc}228; CHECK-NEXT: .LBB5_1: @ %vector.ph229; CHECK-NEXT: dlstp.32 lr, r2230; CHECK-NEXT: .LBB5_2: @ %vector.body231; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1232; CHECK-NEXT: vldrw.u32 q0, [r0], #16233; CHECK-NEXT: vrintr.f32 s3, s3234; CHECK-NEXT: vrintr.f32 s2, s2235; CHECK-NEXT: vrintr.f32 s1, s1236; CHECK-NEXT: vrintr.f32 s0, s0237; CHECK-NEXT: vstrw.32 q0, [r1], #16238; CHECK-NEXT: letp lr, .LBB5_2239; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup240; CHECK-NEXT: pop {r7, pc}241entry:242 %cmp5 = icmp eq i32 %n, 0243 br i1 %cmp5, label %for.cond.cleanup, label %vector.ph244 245vector.ph: ; preds = %entry246 %n.rnd.up = add i32 %n, 3247 %n.vec = and i32 %n.rnd.up, -4248 br label %vector.body249 250vector.body: ; preds = %vector.body, %vector.ph251 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]252 %next.gep = getelementptr float, ptr %pSrcA, i32 %index253 %next.gep14 = getelementptr float, ptr %pDst, i32 %index254 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)255 %wide.masked.load = call <4 x float> @llvm.masked.load.v4f32.p0(ptr %next.gep, i32 4, <4 x i1> %active.lane.mask, <4 x float> undef)256 %0 = call fast <4 x float> @llvm.nearbyint.v4f32(<4 x float> %wide.masked.load)257 call void @llvm.masked.store.v4f32.p0(<4 x float> %0, ptr %next.gep14, i32 4, <4 x i1> %active.lane.mask)258 %index.next = add i32 %index, 4259 %1 = icmp eq i32 %index.next, %n.vec260 br i1 %1, label %for.cond.cleanup, label %vector.body261 262for.cond.cleanup: ; preds = %vector.body, %entry263 ret void264}265 266declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32, i32) #1267 268declare <4 x float> @llvm.masked.load.v4f32.p0(ptr, i32 immarg, <4 x i1>, <4 x float>) #2269 270declare <4 x float> @llvm.trunc.v4f32(<4 x float>) #3271 272declare <4 x float> @llvm.rint.v4f32(<4 x float>) #3273 274declare <4 x float> @llvm.round.v4f32(<4 x float>) #3275 276declare <4 x float> @llvm.ceil.v4f32(<4 x float>) #3277 278declare <4 x float> @llvm.floor.v4f32(<4 x float>) #3279 280declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>) #1281 282declare void @llvm.masked.store.v4f32.p0(<4 x float>, ptr, i32 immarg, <4 x i1>) #4283