brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.8 KiB · f437220 Raw
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