479 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 %s -o - | FileCheck %s3 4define void @to_4(ptr nocapture readonly %x, ptr noalias nocapture %y) {5; CHECK-LABEL: to_4:6; CHECK: @ %bb.0: @ %entry7; CHECK-NEXT: .save {r7, lr}8; CHECK-NEXT: push {r7, lr}9; CHECK-NEXT: mov.w lr, #25610; CHECK-NEXT: movw r2, #2621411; CHECK-NEXT: movt r2, #1639012; CHECK-NEXT: .LBB0_1: @ %vector.body13; CHECK-NEXT: @ =>This Inner Loop Header: Depth=114; CHECK-NEXT: vldrw.u32 q0, [r0], #1615; CHECK-NEXT: vmul.f32 q0, q0, r216; CHECK-NEXT: vcvtb.f16.f32 q0, q017; CHECK-NEXT: vstrh.32 q0, [r1], #818; CHECK-NEXT: le lr, .LBB0_119; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup20; CHECK-NEXT: pop {r7, pc}21entry:22 br label %vector.body23 24vector.body: ; preds = %vector.body, %entry25 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]26 %0 = getelementptr inbounds float, ptr %x, i32 %index27 %wide.load = load <4 x float>, ptr %0, align 428 %1 = fmul <4 x float> %wide.load, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>29 %2 = fptrunc <4 x float> %1 to <4 x half>30 %3 = getelementptr inbounds half, ptr %y, i32 %index31 store <4 x half> %2, ptr %3, align 232 %index.next = add i32 %index, 433 %4 = icmp eq i32 %index.next, 102434 br i1 %4, label %for.cond.cleanup, label %vector.body35 36for.cond.cleanup: ; preds = %vector.body37 ret void38}39 40define void @to_8(ptr nocapture readonly %x, ptr noalias nocapture %y) {41; CHECK-LABEL: to_8:42; CHECK: @ %bb.0: @ %entry43; CHECK-NEXT: .save {r7, lr}44; CHECK-NEXT: push {r7, lr}45; CHECK-NEXT: mov.w lr, #12846; CHECK-NEXT: movw r2, #2621447; CHECK-NEXT: movt r2, #1639048; CHECK-NEXT: .LBB1_1: @ %vector.body49; CHECK-NEXT: @ =>This Inner Loop Header: Depth=150; CHECK-NEXT: vldrw.u32 q0, [r0, #16]51; CHECK-NEXT: vmul.f32 q0, q0, r252; CHECK-NEXT: vcvtb.f16.f32 q0, q053; CHECK-NEXT: vstrh.32 q0, [r1, #8]54; CHECK-NEXT: vldrw.u32 q0, [r0], #3255; CHECK-NEXT: vmul.f32 q0, q0, r256; CHECK-NEXT: vcvtb.f16.f32 q0, q057; CHECK-NEXT: vstrh.32 q0, [r1], #1658; CHECK-NEXT: le lr, .LBB1_159; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup60; CHECK-NEXT: pop {r7, pc}61entry:62 br label %vector.body63 64vector.body: ; preds = %vector.body, %entry65 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]66 %0 = getelementptr inbounds float, ptr %x, i32 %index67 %wide.load = load <8 x float>, ptr %0, align 468 %1 = fmul <8 x float> %wide.load, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>69 %2 = fptrunc <8 x float> %1 to <8 x half>70 %3 = getelementptr inbounds half, ptr %y, i32 %index71 store <8 x half> %2, ptr %3, align 272 %index.next = add i32 %index, 873 %4 = icmp eq i32 %index.next, 102474 br i1 %4, label %for.cond.cleanup, label %vector.body75 76for.cond.cleanup: ; preds = %vector.body77 ret void78}79 80define void @to_16(ptr nocapture readonly %x, ptr noalias nocapture %y) {81; CHECK-LABEL: to_16:82; CHECK: @ %bb.0: @ %entry83; CHECK-NEXT: .save {r7, lr}84; CHECK-NEXT: push {r7, lr}85; CHECK-NEXT: mov.w lr, #6486; CHECK-NEXT: movw r2, #2621487; CHECK-NEXT: movt r2, #1639088; CHECK-NEXT: .LBB2_1: @ %vector.body89; CHECK-NEXT: @ =>This Inner Loop Header: Depth=190; CHECK-NEXT: vldrw.u32 q0, [r0, #48]91; CHECK-NEXT: vmul.f32 q0, q0, r292; CHECK-NEXT: vcvtb.f16.f32 q0, q093; CHECK-NEXT: vstrh.32 q0, [r1, #24]94; CHECK-NEXT: vldrw.u32 q0, [r0, #32]95; CHECK-NEXT: vmul.f32 q0, q0, r296; CHECK-NEXT: vcvtb.f16.f32 q0, q097; CHECK-NEXT: vstrh.32 q0, [r1, #16]98; CHECK-NEXT: vldrw.u32 q0, [r0, #16]99; CHECK-NEXT: vmul.f32 q0, q0, r2100; CHECK-NEXT: vcvtb.f16.f32 q0, q0101; CHECK-NEXT: vstrh.32 q0, [r1, #8]102; CHECK-NEXT: vldrw.u32 q0, [r0], #64103; CHECK-NEXT: vmul.f32 q0, q0, r2104; CHECK-NEXT: vcvtb.f16.f32 q0, q0105; CHECK-NEXT: vstrh.32 q0, [r1], #32106; CHECK-NEXT: le lr, .LBB2_1107; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup108; CHECK-NEXT: pop {r7, pc}109entry:110 br label %vector.body111 112vector.body: ; preds = %vector.body, %entry113 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]114 %0 = getelementptr inbounds float, ptr %x, i32 %index115 %wide.load = load <16 x float>, ptr %0, align 4116 %1 = fmul <16 x float> %wide.load, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>117 %2 = fptrunc <16 x float> %1 to <16 x half>118 %3 = getelementptr inbounds half, ptr %y, i32 %index119 store <16 x half> %2, ptr %3, align 2120 %index.next = add i32 %index, 16121 %4 = icmp eq i32 %index.next, 1024122 br i1 %4, label %for.cond.cleanup, label %vector.body123 124for.cond.cleanup: ; preds = %vector.body125 ret void126}127 128define void @from_4(ptr nocapture readonly %x, ptr noalias nocapture %y) {129; CHECK-LABEL: from_4:130; CHECK: @ %bb.0: @ %entry131; CHECK-NEXT: .save {r7, lr}132; CHECK-NEXT: push {r7, lr}133; CHECK-NEXT: mov.w lr, #256134; CHECK-NEXT: movw r2, #26214135; CHECK-NEXT: movt r2, #16390136; CHECK-NEXT: .LBB3_1: @ %vector.body137; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1138; CHECK-NEXT: vldrh.u32 q0, [r0], #8139; CHECK-NEXT: vcvtb.f32.f16 q0, q0140; CHECK-NEXT: vmul.f32 q0, q0, r2141; CHECK-NEXT: vstrb.8 q0, [r1], #16142; CHECK-NEXT: le lr, .LBB3_1143; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup144; CHECK-NEXT: pop {r7, pc}145entry:146 br label %vector.body147 148vector.body: ; preds = %vector.body, %entry149 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]150 %0 = getelementptr inbounds half, ptr %x, i32 %index151 %wide.load = load <4 x half>, ptr %0, align 2152 %1 = fpext <4 x half> %wide.load to <4 x float>153 %2 = fmul <4 x float> %1, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>154 %3 = getelementptr inbounds float, ptr %y, i32 %index155 store <4 x float> %2, ptr %3, align 4156 %index.next = add i32 %index, 4157 %4 = icmp eq i32 %index.next, 1024158 br i1 %4, label %for.cond.cleanup, label %vector.body159 160for.cond.cleanup: ; preds = %vector.body161 ret void162}163 164define void @from_8(ptr nocapture readonly %x, ptr noalias nocapture %y) {165; CHECK-LABEL: from_8:166; CHECK: @ %bb.0: @ %entry167; CHECK-NEXT: .save {r7, lr}168; CHECK-NEXT: push {r7, lr}169; CHECK-NEXT: mov.w lr, #128170; CHECK-NEXT: movw r2, #26214171; CHECK-NEXT: movt r2, #16390172; CHECK-NEXT: .LBB4_1: @ %vector.body173; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1174; CHECK-NEXT: vldrh.u32 q0, [r0], #16175; CHECK-NEXT: vldrh.u32 q1, [r0, #-8]176; CHECK-NEXT: vcvtb.f32.f16 q0, q0177; CHECK-NEXT: vmul.f32 q0, q0, r2178; CHECK-NEXT: vcvtb.f32.f16 q1, q1179; CHECK-NEXT: vmul.f32 q1, q1, r2180; CHECK-NEXT: vstrw.32 q1, [r1, #16]181; CHECK-NEXT: vstrw.32 q0, [r1], #32182; CHECK-NEXT: le lr, .LBB4_1183; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup184; CHECK-NEXT: pop {r7, pc}185entry:186 br label %vector.body187 188vector.body: ; preds = %vector.body, %entry189 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]190 %0 = getelementptr inbounds half, ptr %x, i32 %index191 %wide.load = load <8 x half>, ptr %0, align 2192 %1 = fpext <8 x half> %wide.load to <8 x float>193 %2 = fmul <8 x float> %1, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>194 %3 = getelementptr inbounds float, ptr %y, i32 %index195 store <8 x float> %2, ptr %3, align 4196 %index.next = add i32 %index, 8197 %4 = icmp eq i32 %index.next, 1024198 br i1 %4, label %for.cond.cleanup, label %vector.body199 200for.cond.cleanup: ; preds = %vector.body201 ret void202}203 204define void @from_16(ptr nocapture readonly %x, ptr noalias nocapture %y) {205; CHECK-LABEL: from_16:206; CHECK: @ %bb.0: @ %entry207; CHECK-NEXT: .save {r7, lr}208; CHECK-NEXT: push {r7, lr}209; CHECK-NEXT: mov.w lr, #64210; CHECK-NEXT: movw r2, #26214211; CHECK-NEXT: movt r2, #16390212; CHECK-NEXT: .LBB5_1: @ %vector.body213; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1214; CHECK-NEXT: vldrh.u32 q0, [r0], #32215; CHECK-NEXT: vldrh.u32 q1, [r0, #-24]216; CHECK-NEXT: vldrh.u32 q2, [r0, #-16]217; CHECK-NEXT: vldrh.u32 q3, [r0, #-8]218; CHECK-NEXT: vcvtb.f32.f16 q0, q0219; CHECK-NEXT: vcvtb.f32.f16 q1, q1220; CHECK-NEXT: vcvtb.f32.f16 q2, q2221; CHECK-NEXT: vcvtb.f32.f16 q3, q3222; CHECK-NEXT: vmul.f32 q2, q2, r2223; CHECK-NEXT: vmul.f32 q3, q3, r2224; CHECK-NEXT: vmul.f32 q1, q1, r2225; CHECK-NEXT: vmul.f32 q0, q0, r2226; CHECK-NEXT: vstrw.32 q3, [r1, #48]227; CHECK-NEXT: vstrw.32 q2, [r1, #32]228; CHECK-NEXT: vstrw.32 q1, [r1, #16]229; CHECK-NEXT: vstrw.32 q0, [r1], #64230; CHECK-NEXT: le lr, .LBB5_1231; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup232; CHECK-NEXT: pop {r7, pc}233entry:234 br label %vector.body235 236vector.body: ; preds = %vector.body, %entry237 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]238 %0 = getelementptr inbounds half, ptr %x, i32 %index239 %wide.load = load <16 x half>, ptr %0, align 2240 %1 = fpext <16 x half> %wide.load to <16 x float>241 %2 = fmul <16 x float> %1, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>242 %3 = getelementptr inbounds float, ptr %y, i32 %index243 store <16 x float> %2, ptr %3, align 4244 %index.next = add i32 %index, 16245 %4 = icmp eq i32 %index.next, 1024246 br i1 %4, label %for.cond.cleanup, label %vector.body247 248for.cond.cleanup: ; preds = %vector.body249 ret void250}251 252define void @both_4(ptr nocapture readonly %x, ptr noalias nocapture %y) {253; CHECK-LABEL: both_4:254; CHECK: @ %bb.0: @ %entry255; CHECK-NEXT: .save {r7, lr}256; CHECK-NEXT: push {r7, lr}257; CHECK-NEXT: mov.w lr, #256258; CHECK-NEXT: movw r2, #26214259; CHECK-NEXT: movt r2, #16390260; CHECK-NEXT: .LBB6_1: @ %vector.body261; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1262; CHECK-NEXT: vldrh.u32 q0, [r0], #8263; CHECK-NEXT: vcvtb.f32.f16 q0, q0264; CHECK-NEXT: vmul.f32 q0, q0, r2265; CHECK-NEXT: vcvtb.f16.f32 q0, q0266; CHECK-NEXT: vstrh.32 q0, [r1], #8267; CHECK-NEXT: le lr, .LBB6_1268; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup269; CHECK-NEXT: pop {r7, pc}270entry:271 br label %vector.body272 273vector.body: ; preds = %vector.body, %entry274 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]275 %0 = getelementptr inbounds half, ptr %x, i32 %index276 %wide.load = load <4 x half>, ptr %0, align 2277 %1 = fpext <4 x half> %wide.load to <4 x float>278 %2 = fmul <4 x float> %1, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>279 %3 = fptrunc <4 x float> %2 to <4 x half>280 %4 = getelementptr inbounds half, ptr %y, i32 %index281 store <4 x half> %3, ptr %4, align 2282 %index.next = add i32 %index, 4283 %5 = icmp eq i32 %index.next, 1024284 br i1 %5, label %for.cond.cleanup, label %vector.body285 286for.cond.cleanup: ; preds = %vector.body287 ret void288}289 290define void @both_8(ptr nocapture readonly %x, ptr noalias nocapture %y) {291; CHECK-LABEL: both_8:292; CHECK: @ %bb.0: @ %entry293; CHECK-NEXT: .save {r7, lr}294; CHECK-NEXT: push {r7, lr}295; CHECK-NEXT: mov.w lr, #128296; CHECK-NEXT: movw r2, #26214297; CHECK-NEXT: movt r2, #16390298; CHECK-NEXT: .LBB7_1: @ %vector.body299; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1300; CHECK-NEXT: vldrh.u16 q0, [r0], #16301; CHECK-NEXT: vcvtb.f32.f16 q1, q0302; CHECK-NEXT: vcvtt.f32.f16 q0, q0303; CHECK-NEXT: vmul.f32 q1, q1, r2304; CHECK-NEXT: vmul.f32 q0, q0, r2305; CHECK-NEXT: vcvtb.f16.f32 q1, q1306; CHECK-NEXT: vcvtt.f16.f32 q1, q0307; CHECK-NEXT: vstrb.8 q1, [r1], #16308; CHECK-NEXT: le lr, .LBB7_1309; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup310; CHECK-NEXT: pop {r7, pc}311entry:312 br label %vector.body313 314vector.body: ; preds = %vector.body, %entry315 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]316 %0 = getelementptr inbounds half, ptr %x, i32 %index317 %wide.load = load <8 x half>, ptr %0, align 2318 %1 = fpext <8 x half> %wide.load to <8 x float>319 %2 = fmul <8 x float> %1, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>320 %3 = fptrunc <8 x float> %2 to <8 x half>321 %4 = getelementptr inbounds half, ptr %y, i32 %index322 store <8 x half> %3, ptr %4, align 2323 %index.next = add i32 %index, 8324 %5 = icmp eq i32 %index.next, 1024325 br i1 %5, label %for.cond.cleanup, label %vector.body326 327for.cond.cleanup: ; preds = %vector.body328 ret void329}330 331define void @both_16(ptr nocapture readonly %x, ptr noalias nocapture %y) {332; CHECK-LABEL: both_16:333; CHECK: @ %bb.0: @ %entry334; CHECK-NEXT: .save {r7, lr}335; CHECK-NEXT: push {r7, lr}336; CHECK-NEXT: mov.w lr, #64337; CHECK-NEXT: movw r2, #26214338; CHECK-NEXT: movt r2, #16390339; CHECK-NEXT: .LBB8_1: @ %vector.body340; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1341; CHECK-NEXT: vldrh.u16 q0, [r0, #16]342; CHECK-NEXT: vcvtb.f32.f16 q1, q0343; CHECK-NEXT: vcvtt.f32.f16 q0, q0344; CHECK-NEXT: vmul.f32 q1, q1, r2345; CHECK-NEXT: vmul.f32 q0, q0, r2346; CHECK-NEXT: vcvtb.f16.f32 q1, q1347; CHECK-NEXT: vcvtt.f16.f32 q1, q0348; CHECK-NEXT: vldrh.u16 q0, [r0], #32349; CHECK-NEXT: vstrh.16 q1, [r1, #16]350; CHECK-NEXT: vcvtb.f32.f16 q1, q0351; CHECK-NEXT: vcvtt.f32.f16 q0, q0352; CHECK-NEXT: vmul.f32 q1, q1, r2353; CHECK-NEXT: vmul.f32 q0, q0, r2354; CHECK-NEXT: vcvtb.f16.f32 q1, q1355; CHECK-NEXT: vcvtt.f16.f32 q1, q0356; CHECK-NEXT: vstrh.16 q1, [r1], #32357; CHECK-NEXT: le lr, .LBB8_1358; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup359; CHECK-NEXT: pop {r7, pc}360entry:361 br label %vector.body362 363vector.body: ; preds = %vector.body, %entry364 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]365 %0 = getelementptr inbounds half, ptr %x, i32 %index366 %wide.load = load <16 x half>, ptr %0, align 2367 %1 = fpext <16 x half> %wide.load to <16 x float>368 %2 = fmul <16 x float> %1, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>369 %3 = fptrunc <16 x float> %2 to <16 x half>370 %4 = getelementptr inbounds half, ptr %y, i32 %index371 store <16 x half> %3, ptr %4, align 2372 %index.next = add i32 %index, 16373 %5 = icmp eq i32 %index.next, 1024374 br i1 %5, label %for.cond.cleanup, label %vector.body375 376for.cond.cleanup: ; preds = %vector.body377 ret void378}379 380define void @both_8_I(ptr nocapture readonly %x, ptr noalias nocapture %y) {381; CHECK-LABEL: both_8_I:382; CHECK: @ %bb.0: @ %entry383; CHECK-NEXT: .save {r7, lr}384; CHECK-NEXT: push {r7, lr}385; CHECK-NEXT: mov.w lr, #128386; CHECK-NEXT: movw r2, #26214387; CHECK-NEXT: movt r2, #16390388; CHECK-NEXT: .LBB9_1: @ %vector.body389; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1390; CHECK-NEXT: vldrh.u16 q0, [r0], #16391; CHECK-NEXT: vcvtb.f32.f16 q1, q0392; CHECK-NEXT: vcvtt.f32.f16 q0, q0393; CHECK-NEXT: vmul.f32 q1, q1, r2394; CHECK-NEXT: vmul.f32 q0, q0, r2395; CHECK-NEXT: vcvtb.f16.f32 q1, q1396; CHECK-NEXT: vcvtt.f16.f32 q1, q0397; CHECK-NEXT: vstrb.8 q1, [r1], #16398; CHECK-NEXT: le lr, .LBB9_1399; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup400; CHECK-NEXT: pop {r7, pc}401entry:402 br label %vector.body403 404vector.body: ; preds = %vector.body, %entry405 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]406 %0 = getelementptr inbounds half, ptr %x, i32 %index407 %wide.load = load <8 x half>, ptr %0, align 2408 %1 = shufflevector <8 x half> %wide.load, <8 x half> %wide.load, <4 x i32> <i32 0, i32 2, i32 4, i32 6>409 %2 = shufflevector <8 x half> %wide.load, <8 x half> %wide.load, <4 x i32> <i32 1, i32 3, i32 5, i32 7>410 %3 = fpext <4 x half> %1 to <4 x float>411 %4 = fpext <4 x half> %2 to <4 x float>412 %5 = fmul <4 x float> %3, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>413 %6 = fmul <4 x float> %4, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>414 %7 = shufflevector <4 x float> %5, <4 x float> %6, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>415 %8 = fptrunc <8 x float> %7 to <8 x half>416 %9 = getelementptr inbounds half, ptr %y, i32 %index417 store <8 x half> %8, ptr %9, align 2418 %index.next = add i32 %index, 8419 %10 = icmp eq i32 %index.next, 1024420 br i1 %10, label %for.cond.cleanup, label %vector.body421 422for.cond.cleanup: ; preds = %vector.body423 ret void424}425 426define void @both_16_I(ptr nocapture readonly %x, ptr noalias nocapture %y) {427; CHECK-LABEL: both_16_I:428; CHECK: @ %bb.0: @ %entry429; CHECK-NEXT: .save {r7, lr}430; CHECK-NEXT: push {r7, lr}431; CHECK-NEXT: mov.w lr, #128432; CHECK-NEXT: movw r2, #26214433; CHECK-NEXT: movt r2, #16390434; CHECK-NEXT: .LBB10_1: @ %vector.body435; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1436; CHECK-NEXT: vldrh.u16 q0, [r0]437; CHECK-NEXT: vcvtb.f32.f16 q1, q0438; CHECK-NEXT: vcvtt.f32.f16 q0, q0439; CHECK-NEXT: vmul.f32 q1, q1, r2440; CHECK-NEXT: vmul.f32 q0, q0, r2441; CHECK-NEXT: vcvtb.f16.f32 q1, q1442; CHECK-NEXT: vcvtt.f16.f32 q1, q0443; CHECK-NEXT: vldrh.u16 q0, [r0, #16]!444; CHECK-NEXT: vstrh.16 q1, [r1]445; CHECK-NEXT: vcvtb.f32.f16 q1, q0446; CHECK-NEXT: vcvtt.f32.f16 q0, q0447; CHECK-NEXT: vmul.f32 q1, q1, r2448; CHECK-NEXT: vmul.f32 q0, q0, r2449; CHECK-NEXT: vcvtb.f16.f32 q1, q1450; CHECK-NEXT: vcvtt.f16.f32 q1, q0451; CHECK-NEXT: vstrb.8 q1, [r1, #16]!452; CHECK-NEXT: le lr, .LBB10_1453; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup454; CHECK-NEXT: pop {r7, pc}455entry:456 br label %vector.body457 458vector.body: ; preds = %vector.body, %entry459 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]460 %0 = getelementptr inbounds half, ptr %x, i32 %index461 %wide.load = load <16 x half>, ptr %0, align 2462 %1 = shufflevector <16 x half> %wide.load, <16 x half> %wide.load, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>463 %2 = shufflevector <16 x half> %wide.load, <16 x half> %wide.load, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>464 %3 = fpext <8 x half> %1 to <8 x float>465 %4 = fpext <8 x half> %2 to <8 x float>466 %5 = fmul <8 x float> %3, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>467 %6 = fmul <8 x float> %4, <float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000, float 0x4000CCCCC0000000>468 %7 = shufflevector <8 x float> %5, <8 x float> %6, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>469 %8 = fptrunc <16 x float> %7 to <16 x half>470 %9 = getelementptr inbounds half, ptr %y, i32 %index471 store <16 x half> %8, ptr %9, align 2472 %index.next = add i32 %index, 8473 %10 = icmp eq i32 %index.next, 1024474 br i1 %10, label %for.cond.cleanup, label %vector.body475 476for.cond.cleanup: ; preds = %vector.body477 ret void478}479