brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.6 KiB · 0f11e24 Raw
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