378 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -O3 -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve %s --verify-machineinstrs -o - | FileCheck %s3 4define dso_local arm_aapcs_vfpcc void @sink_shl_i32(ptr nocapture readonly %in, ptr noalias nocapture %out, i32 %shift, i32 %N) {5; CHECK-LABEL: sink_shl_i32:6; CHECK: @ %bb.0: @ %entry7; CHECK-NEXT: .save {r7, lr}8; CHECK-NEXT: push {r7, lr}9; CHECK-NEXT: bic r3, r3, #310; CHECK-NEXT: sub.w r12, r3, #411; CHECK-NEXT: movs r3, #112; CHECK-NEXT: add.w lr, r3, r12, lsr #213; CHECK-NEXT: .LBB0_1: @ %vector.body14; CHECK-NEXT: @ =>This Inner Loop Header: Depth=115; CHECK-NEXT: vldrw.u32 q0, [r0], #1616; CHECK-NEXT: vshl.u32 q0, r217; CHECK-NEXT: vstrb.8 q0, [r1], #1618; CHECK-NEXT: le lr, .LBB0_119; CHECK-NEXT: @ %bb.2: @ %exit20; CHECK-NEXT: pop {r7, pc}21entry:22 br label %vector.ph23 24vector.ph:25 %n.vec = and i32 %N, -426 %broadcast.splatinsert10 = insertelement <4 x i32> undef, i32 %shift, i32 027 %broadcast.splat11 = shufflevector <4 x i32> %broadcast.splatinsert10, <4 x i32> undef, <4 x i32> zeroinitializer28 br label %vector.body29 30vector.body: ; preds = %vector.body, %vector.ph31 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]32 %gep.in = getelementptr inbounds i32, ptr %in, i32 %index33 %wide.load = load <4 x i32>, ptr %gep.in, align 434 %res = shl <4 x i32> %wide.load, %broadcast.splat1135 %gep.out = getelementptr inbounds i32, ptr %out, i32 %index36 store <4 x i32> %res, ptr %gep.out, align 437 %index.next = add i32 %index, 438 %cmp = icmp eq i32 %index.next, %n.vec39 br i1 %cmp, label %exit, label %vector.body40 41exit:42 ret void43}44 45define dso_local arm_aapcs_vfpcc void @sink_shl_i16(ptr nocapture readonly %in, ptr noalias nocapture %out, i16 %shift, i32 %N) {46; CHECK-LABEL: sink_shl_i16:47; CHECK: @ %bb.0: @ %entry48; CHECK-NEXT: .save {r7, lr}49; CHECK-NEXT: push {r7, lr}50; CHECK-NEXT: bic r3, r3, #351; CHECK-NEXT: sub.w r12, r3, #452; CHECK-NEXT: movs r3, #153; CHECK-NEXT: add.w lr, r3, r12, lsr #254; CHECK-NEXT: .LBB1_1: @ %vector.body55; CHECK-NEXT: @ =>This Inner Loop Header: Depth=156; CHECK-NEXT: vldrw.u32 q0, [r0], #857; CHECK-NEXT: vshl.u16 q0, r258; CHECK-NEXT: vstrb.8 q0, [r1], #859; CHECK-NEXT: le lr, .LBB1_160; CHECK-NEXT: @ %bb.2: @ %exit61; CHECK-NEXT: pop {r7, pc}62entry:63 br label %vector.ph64 65vector.ph:66 %n.vec = and i32 %N, -467 %broadcast.splatinsert10 = insertelement <8 x i16> undef, i16 %shift, i32 068 %broadcast.splat11 = shufflevector <8 x i16> %broadcast.splatinsert10, <8 x i16> undef, <8 x i32> zeroinitializer69 br label %vector.body70 71vector.body: ; preds = %vector.body, %vector.ph72 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]73 %gep.in = getelementptr inbounds i16, ptr %in, i32 %index74 %wide.load = load <8 x i16>, ptr %gep.in, align 475 %res = shl <8 x i16> %wide.load, %broadcast.splat1176 %gep.out = getelementptr inbounds i16, ptr %out, i32 %index77 store <8 x i16> %res, ptr %gep.out, align 478 %index.next = add i32 %index, 479 %cmp = icmp eq i32 %index.next, %n.vec80 br i1 %cmp, label %exit, label %vector.body81 82exit:83 ret void84}85 86define dso_local arm_aapcs_vfpcc void @sink_shl_i8(ptr nocapture readonly %in, ptr noalias nocapture %out, i8 %shift, i32 %N) {87; CHECK-LABEL: sink_shl_i8:88; CHECK: @ %bb.0: @ %entry89; CHECK-NEXT: .save {r7, lr}90; CHECK-NEXT: push {r7, lr}91; CHECK-NEXT: bic r3, r3, #392; CHECK-NEXT: sub.w r12, r3, #493; CHECK-NEXT: movs r3, #194; CHECK-NEXT: add.w lr, r3, r12, lsr #295; CHECK-NEXT: .LBB2_1: @ %vector.body96; CHECK-NEXT: @ =>This Inner Loop Header: Depth=197; CHECK-NEXT: vldrw.u32 q0, [r0], #498; CHECK-NEXT: vshl.u8 q0, r299; CHECK-NEXT: vstrb.8 q0, [r1], #4100; CHECK-NEXT: le lr, .LBB2_1101; CHECK-NEXT: @ %bb.2: @ %exit102; CHECK-NEXT: pop {r7, pc}103entry:104 br label %vector.ph105 106vector.ph:107 %n.vec = and i32 %N, -4108 %broadcast.splatinsert10 = insertelement <16 x i8> undef, i8 %shift, i32 0109 %broadcast.splat11 = shufflevector <16 x i8> %broadcast.splatinsert10, <16 x i8> undef, <16 x i32> zeroinitializer110 br label %vector.body111 112vector.body: ; preds = %vector.body, %vector.ph113 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]114 %gep.in = getelementptr inbounds i8, ptr %in, i32 %index115 %wide.load = load <16 x i8>, ptr %gep.in, align 4116 %res = shl <16 x i8> %wide.load, %broadcast.splat11117 %gep.out = getelementptr inbounds i8, ptr %out, i32 %index118 store <16 x i8> %res, ptr %gep.out, align 4119 %index.next = add i32 %index, 4120 %cmp = icmp eq i32 %index.next, %n.vec121 br i1 %cmp, label %exit, label %vector.body122 123exit:124 ret void125}126 127define dso_local arm_aapcs_vfpcc void @sink_lshr_i32(ptr nocapture readonly %in, ptr noalias nocapture %out, i32 %shift, i32 %N) {128; CHECK-LABEL: sink_lshr_i32:129; CHECK: @ %bb.0: @ %entry130; CHECK-NEXT: .save {r7, lr}131; CHECK-NEXT: push {r7, lr}132; CHECK-NEXT: bic r3, r3, #3133; CHECK-NEXT: rsbs r2, r2, #0134; CHECK-NEXT: sub.w r12, r3, #4135; CHECK-NEXT: movs r3, #1136; CHECK-NEXT: add.w lr, r3, r12, lsr #2137; CHECK-NEXT: .LBB3_1: @ %vector.body138; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1139; CHECK-NEXT: vldrw.u32 q0, [r0], #16140; CHECK-NEXT: vshl.u32 q0, r2141; CHECK-NEXT: vstrb.8 q0, [r1], #16142; CHECK-NEXT: le lr, .LBB3_1143; CHECK-NEXT: @ %bb.2: @ %exit144; CHECK-NEXT: pop {r7, pc}145entry:146 br label %vector.ph147 148vector.ph:149 %n.vec = and i32 %N, -4150 %broadcast.splatinsert10 = insertelement <4 x i32> undef, i32 %shift, i32 0151 %broadcast.splat11 = shufflevector <4 x i32> %broadcast.splatinsert10, <4 x i32> undef, <4 x i32> zeroinitializer152 br label %vector.body153 154vector.body: ; preds = %vector.body, %vector.ph155 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]156 %gep.in = getelementptr inbounds i32, ptr %in, i32 %index157 %wide.load = load <4 x i32>, ptr %gep.in, align 4158 %res = lshr <4 x i32> %wide.load, %broadcast.splat11159 %gep.out = getelementptr inbounds i32, ptr %out, i32 %index160 store <4 x i32> %res, ptr %gep.out, align 4161 %index.next = add i32 %index, 4162 %cmp = icmp eq i32 %index.next, %n.vec163 br i1 %cmp, label %exit, label %vector.body164 165exit:166 ret void167}168 169define dso_local arm_aapcs_vfpcc void @sink_lshr_i16(ptr nocapture readonly %in, ptr noalias nocapture %out, i16 %shift, i32 %N) {170; CHECK-LABEL: sink_lshr_i16:171; CHECK: @ %bb.0: @ %entry172; CHECK-NEXT: .save {r7, lr}173; CHECK-NEXT: push {r7, lr}174; CHECK-NEXT: bic r3, r3, #3175; CHECK-NEXT: rsbs r2, r2, #0176; CHECK-NEXT: sub.w r12, r3, #4177; CHECK-NEXT: movs r3, #1178; CHECK-NEXT: add.w lr, r3, r12, lsr #2179; CHECK-NEXT: .LBB4_1: @ %vector.body180; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1181; CHECK-NEXT: vldrw.u32 q0, [r0], #8182; CHECK-NEXT: vshl.u16 q0, r2183; CHECK-NEXT: vstrb.8 q0, [r1], #8184; CHECK-NEXT: le lr, .LBB4_1185; CHECK-NEXT: @ %bb.2: @ %exit186; CHECK-NEXT: pop {r7, pc}187entry:188 br label %vector.ph189 190vector.ph:191 %n.vec = and i32 %N, -4192 %broadcast.splatinsert10 = insertelement <8 x i16> undef, i16 %shift, i32 0193 %broadcast.splat11 = shufflevector <8 x i16> %broadcast.splatinsert10, <8 x i16> undef, <8 x i32> zeroinitializer194 br label %vector.body195 196vector.body: ; preds = %vector.body, %vector.ph197 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]198 %gep.in = getelementptr inbounds i16, ptr %in, i32 %index199 %wide.load = load <8 x i16>, ptr %gep.in, align 4200 %res = lshr <8 x i16> %wide.load, %broadcast.splat11201 %gep.out = getelementptr inbounds i16, ptr %out, i32 %index202 store <8 x i16> %res, ptr %gep.out, align 4203 %index.next = add i32 %index, 4204 %cmp = icmp eq i32 %index.next, %n.vec205 br i1 %cmp, label %exit, label %vector.body206 207exit:208 ret void209}210 211define dso_local arm_aapcs_vfpcc void @sink_lshr_i8(ptr nocapture readonly %in, ptr noalias nocapture %out, i8 %shift, i32 %N) {212; CHECK-LABEL: sink_lshr_i8:213; CHECK: @ %bb.0: @ %entry214; CHECK-NEXT: .save {r7, lr}215; CHECK-NEXT: push {r7, lr}216; CHECK-NEXT: bic r3, r3, #3217; CHECK-NEXT: rsbs r2, r2, #0218; CHECK-NEXT: sub.w r12, r3, #4219; CHECK-NEXT: movs r3, #1220; CHECK-NEXT: add.w lr, r3, r12, lsr #2221; CHECK-NEXT: .LBB5_1: @ %vector.body222; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1223; CHECK-NEXT: vldrw.u32 q0, [r0], #4224; CHECK-NEXT: vshl.u8 q0, r2225; CHECK-NEXT: vstrb.8 q0, [r1], #4226; CHECK-NEXT: le lr, .LBB5_1227; CHECK-NEXT: @ %bb.2: @ %exit228; CHECK-NEXT: pop {r7, pc}229entry:230 br label %vector.ph231 232vector.ph:233 %n.vec = and i32 %N, -4234 %broadcast.splatinsert10 = insertelement <16 x i8> undef, i8 %shift, i32 0235 %broadcast.splat11 = shufflevector <16 x i8> %broadcast.splatinsert10, <16 x i8> undef, <16 x i32> zeroinitializer236 br label %vector.body237 238vector.body: ; preds = %vector.body, %vector.ph239 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]240 %gep.in = getelementptr inbounds i8, ptr %in, i32 %index241 %wide.load = load <16 x i8>, ptr %gep.in, align 4242 %res = lshr <16 x i8> %wide.load, %broadcast.splat11243 %gep.out = getelementptr inbounds i8, ptr %out, i32 %index244 store <16 x i8> %res, ptr %gep.out, align 4245 %index.next = add i32 %index, 4246 %cmp = icmp eq i32 %index.next, %n.vec247 br i1 %cmp, label %exit, label %vector.body248 249exit:250 ret void251}252 253define dso_local arm_aapcs_vfpcc void @sink_ashr_i32(ptr nocapture readonly %in, ptr noalias nocapture %out, i32 %shift, i32 %N) {254; CHECK-LABEL: sink_ashr_i32:255; CHECK: @ %bb.0: @ %entry256; CHECK-NEXT: .save {r7, lr}257; CHECK-NEXT: push {r7, lr}258; CHECK-NEXT: bic r3, r3, #3259; CHECK-NEXT: rsbs r2, r2, #0260; CHECK-NEXT: sub.w r12, r3, #4261; CHECK-NEXT: movs r3, #1262; CHECK-NEXT: add.w lr, r3, r12, lsr #2263; CHECK-NEXT: .LBB6_1: @ %vector.body264; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1265; CHECK-NEXT: vldrw.u32 q0, [r0], #16266; CHECK-NEXT: vshl.s32 q0, r2267; CHECK-NEXT: vstrb.8 q0, [r1], #16268; CHECK-NEXT: le lr, .LBB6_1269; CHECK-NEXT: @ %bb.2: @ %exit270; CHECK-NEXT: pop {r7, pc}271entry:272 br label %vector.ph273 274vector.ph:275 %n.vec = and i32 %N, -4276 %broadcast.splatinsert10 = insertelement <4 x i32> undef, i32 %shift, i32 0277 %broadcast.splat11 = shufflevector <4 x i32> %broadcast.splatinsert10, <4 x i32> undef, <4 x i32> zeroinitializer278 br label %vector.body279 280vector.body: ; preds = %vector.body, %vector.ph281 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]282 %gep.in = getelementptr inbounds i32, ptr %in, i32 %index283 %wide.load = load <4 x i32>, ptr %gep.in, align 4284 %res = ashr <4 x i32> %wide.load, %broadcast.splat11285 %gep.out = getelementptr inbounds i32, ptr %out, i32 %index286 store <4 x i32> %res, ptr %gep.out, align 4287 %index.next = add i32 %index, 4288 %cmp = icmp eq i32 %index.next, %n.vec289 br i1 %cmp, label %exit, label %vector.body290 291exit:292 ret void293}294 295define dso_local arm_aapcs_vfpcc void @sink_ashr_i16(ptr nocapture readonly %in, ptr noalias nocapture %out, i16 %shift, i32 %N) {296; CHECK-LABEL: sink_ashr_i16:297; CHECK: @ %bb.0: @ %entry298; CHECK-NEXT: .save {r7, lr}299; CHECK-NEXT: push {r7, lr}300; CHECK-NEXT: bic r3, r3, #3301; CHECK-NEXT: rsbs r2, r2, #0302; CHECK-NEXT: sub.w r12, r3, #4303; CHECK-NEXT: movs r3, #1304; CHECK-NEXT: add.w lr, r3, r12, lsr #2305; CHECK-NEXT: .LBB7_1: @ %vector.body306; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1307; CHECK-NEXT: vldrw.u32 q0, [r0], #8308; CHECK-NEXT: vshl.s16 q0, r2309; CHECK-NEXT: vstrb.8 q0, [r1], #8310; CHECK-NEXT: le lr, .LBB7_1311; CHECK-NEXT: @ %bb.2: @ %exit312; CHECK-NEXT: pop {r7, pc}313entry:314 br label %vector.ph315 316vector.ph:317 %n.vec = and i32 %N, -4318 %broadcast.splatinsert10 = insertelement <8 x i16> undef, i16 %shift, i32 0319 %broadcast.splat11 = shufflevector <8 x i16> %broadcast.splatinsert10, <8 x i16> undef, <8 x i32> zeroinitializer320 br label %vector.body321 322vector.body: ; preds = %vector.body, %vector.ph323 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]324 %gep.in = getelementptr inbounds i16, ptr %in, i32 %index325 %wide.load = load <8 x i16>, ptr %gep.in, align 4326 %res = ashr <8 x i16> %wide.load, %broadcast.splat11327 %gep.out = getelementptr inbounds i16, ptr %out, i32 %index328 store <8 x i16> %res, ptr %gep.out, align 4329 %index.next = add i32 %index, 4330 %cmp = icmp eq i32 %index.next, %n.vec331 br i1 %cmp, label %exit, label %vector.body332 333exit:334 ret void335}336 337define dso_local arm_aapcs_vfpcc void @sink_ashr_i8(ptr nocapture readonly %in, ptr noalias nocapture %out, i8 %shift, i32 %N) {338; CHECK-LABEL: sink_ashr_i8:339; CHECK: @ %bb.0: @ %entry340; CHECK-NEXT: .save {r7, lr}341; CHECK-NEXT: push {r7, lr}342; CHECK-NEXT: bic r3, r3, #3343; CHECK-NEXT: rsbs r2, r2, #0344; CHECK-NEXT: sub.w r12, r3, #4345; CHECK-NEXT: movs r3, #1346; CHECK-NEXT: add.w lr, r3, r12, lsr #2347; CHECK-NEXT: .LBB8_1: @ %vector.body348; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1349; CHECK-NEXT: vldrw.u32 q0, [r0], #4350; CHECK-NEXT: vshl.s8 q0, r2351; CHECK-NEXT: vstrb.8 q0, [r1], #4352; CHECK-NEXT: le lr, .LBB8_1353; CHECK-NEXT: @ %bb.2: @ %exit354; CHECK-NEXT: pop {r7, pc}355entry:356 br label %vector.ph357 358vector.ph:359 %n.vec = and i32 %N, -4360 %broadcast.splatinsert10 = insertelement <16 x i8> undef, i8 %shift, i32 0361 %broadcast.splat11 = shufflevector <16 x i8> %broadcast.splatinsert10, <16 x i8> undef, <16 x i32> zeroinitializer362 br label %vector.body363 364vector.body: ; preds = %vector.body, %vector.ph365 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]366 %gep.in = getelementptr inbounds i8, ptr %in, i32 %index367 %wide.load = load <16 x i8>, ptr %gep.in, align 4368 %res = ashr <16 x i8> %wide.load, %broadcast.splat11369 %gep.out = getelementptr inbounds i8, ptr %out, i32 %index370 store <16 x i8> %res, ptr %gep.out, align 4371 %index.next = add i32 %index, 4372 %cmp = icmp eq i32 %index.next, %n.vec373 br i1 %cmp, label %exit, label %vector.body374 375exit:376 ret void377}378