[ARM] Regen ctselect tests for new core legalization

The core PR moved CT_SELECT lowering into the generic legalizer
(memory-blend for FP types without a legal same-size integer,
scalar-mask+splat for vectors). ARM tests' CHECK lines need to
reflect the new codegen.

No functional change in ARM target lowering itself; only test
expectations updated to match generated output.
diff --git a/llvm/test/CodeGen/ARM/ctselect-half.ll b/llvm/test/CodeGen/ARM/ctselect-half.ll
index bfc60f1..aa632bf 100644
--- a/llvm/test/CodeGen/ARM/ctselect-half.ll
+++ b/llvm/test/CodeGen/ARM/ctselect-half.ll
@@ -8,32 +8,20 @@
 define half @ct_half(i1 %cond, half %a, half %b) {
 ; CT-LABEL: ct_half:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    sub r3, r0, #1
-; CT-NEXT:    rsb r0, r0, #0
-; CT-NEXT:    and r2, r2, r3
-; CT-NEXT:    and r0, r1, r0
-; CT-NEXT:    orr r0, r0, r2
+; CT-NEXT:    and r3, r0, #1
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    bx lr
 ;
 ; BFLOAT-F16-NATIVE-LABEL: ct_half:
 ; BFLOAT-F16-NATIVE:       @ %bb.0: @ %entry
-; BFLOAT-F16-NATIVE-NEXT:    and r0, r0, #1
-; BFLOAT-F16-NATIVE-NEXT:    sub r3, r0, #1
-; BFLOAT-F16-NATIVE-NEXT:    rsb r0, r0, #0
-; BFLOAT-F16-NATIVE-NEXT:    and r2, r2, r3
-; BFLOAT-F16-NATIVE-NEXT:    and r0, r1, r0
-; BFLOAT-F16-NATIVE-NEXT:    orr r0, r0, r2
+; BFLOAT-F16-NATIVE-NEXT:    and r3, r0, #1
+; BFLOAT-F16-NATIVE-NEXT:    BUNDLE
 ; BFLOAT-F16-NATIVE-NEXT:    bx lr
 ;
 ; F16-NATIVE-LABEL: ct_half:
 ; F16-NATIVE:       @ %bb.0: @ %entry
-; F16-NATIVE-NEXT:    and r0, r0, #1
-; F16-NATIVE-NEXT:    sub r3, r0, #1
-; F16-NATIVE-NEXT:    rsb r0, r0, #0
-; F16-NATIVE-NEXT:    and r2, r2, r3
-; F16-NATIVE-NEXT:    and r0, r1, r0
-; F16-NATIVE-NEXT:    orr r0, r0, r2
+; F16-NATIVE-NEXT:    and r3, r0, #1
+; F16-NATIVE-NEXT:    BUNDLE
 ; F16-NATIVE-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_half:
@@ -42,21 +30,16 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    subs r4, r3, #1
-; THUMB1-NEXT:    ands r4, r2
-; THUMB1-NEXT:    rsbs r0, r3, #0
-; THUMB1-NEXT:    ands r0, r1
-; THUMB1-NEXT:    orrs r0, r4
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_half:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    subs r3, r0, #1
-; THUMB2-NEXT:    rsbs r0, r0, #0
-; THUMB2-NEXT:    ands r2, r3
-; THUMB2-NEXT:    ands r0, r1
-; THUMB2-NEXT:    orrs r0, r2
+; THUMB2-NEXT:    and r3, r0, #1
+; THUMB2-NEXT:    rsb.w r12, r3, #0
+; THUMB2-NEXT:    and.w r0, r1, r12
+; THUMB2-NEXT:    bic.w r12, r2, r12
+; THUMB2-NEXT:    orr.w r0, r0, r12
 ; THUMB2-NEXT:    bx lr
 entry:
   %sel = call half @llvm.ct.select.f16(i1 %cond, half %a, half %b)
@@ -66,12 +49,8 @@
 define bfloat @ct_bf16(i1 %cond, bfloat %a, bfloat %b) {
 ; CT-LABEL: ct_bf16:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    sub r3, r0, #1
-; CT-NEXT:    rsb r0, r0, #0
-; CT-NEXT:    and r2, r2, r3
-; CT-NEXT:    and r0, r1, r0
-; CT-NEXT:    orr r0, r0, r2
+; CT-NEXT:    and r3, r0, #1
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    bx lr
 ;
 ; BFLOAT-F16-NATIVE-LABEL: ct_bf16:
@@ -79,10 +58,7 @@
 ; BFLOAT-F16-NATIVE-NEXT:    .pad #4
 ; BFLOAT-F16-NATIVE-NEXT:    sub sp, sp, #4
 ; BFLOAT-F16-NATIVE-NEXT:    and r0, r0, #1
-; BFLOAT-F16-NATIVE-NEXT:    rsb r12, r0, #0
-; BFLOAT-F16-NATIVE-NEXT:    and r3, r1, r12
-; BFLOAT-F16-NATIVE-NEXT:    bic r12, r2, r12
-; BFLOAT-F16-NATIVE-NEXT:    orr r3, r3, r12
+; BFLOAT-F16-NATIVE-NEXT:    BUNDLE
 ; BFLOAT-F16-NATIVE-NEXT:    strh r3, [sp, #2]
 ; BFLOAT-F16-NATIVE-NEXT:    ldrh r0, [sp, #2]
 ; BFLOAT-F16-NATIVE-NEXT:    add sp, sp, #4
@@ -90,12 +66,8 @@
 ;
 ; F16-NATIVE-LABEL: ct_bf16:
 ; F16-NATIVE:       @ %bb.0: @ %entry
-; F16-NATIVE-NEXT:    and r0, r0, #1
-; F16-NATIVE-NEXT:    sub r3, r0, #1
-; F16-NATIVE-NEXT:    rsb r0, r0, #0
-; F16-NATIVE-NEXT:    and r2, r2, r3
-; F16-NATIVE-NEXT:    and r0, r1, r0
-; F16-NATIVE-NEXT:    orr r0, r0, r2
+; F16-NATIVE-NEXT:    and r3, r0, #1
+; F16-NATIVE-NEXT:    BUNDLE
 ; F16-NATIVE-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_bf16:
@@ -104,21 +76,16 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    subs r4, r3, #1
-; THUMB1-NEXT:    ands r4, r2
-; THUMB1-NEXT:    rsbs r0, r3, #0
-; THUMB1-NEXT:    ands r0, r1
-; THUMB1-NEXT:    orrs r0, r4
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_bf16:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    subs r3, r0, #1
-; THUMB2-NEXT:    rsbs r0, r0, #0
-; THUMB2-NEXT:    ands r2, r3
-; THUMB2-NEXT:    ands r0, r1
-; THUMB2-NEXT:    orrs r0, r2
+; THUMB2-NEXT:    and r3, r0, #1
+; THUMB2-NEXT:    rsb.w r12, r3, #0
+; THUMB2-NEXT:    and.w r0, r1, r12
+; THUMB2-NEXT:    bic.w r12, r2, r12
+; THUMB2-NEXT:    orr.w r0, r0, r12
 ; THUMB2-NEXT:    bx lr
 entry:
   %sel = call bfloat @llvm.ct.select.bf16(i1 %cond, bfloat %a, bfloat %b)
@@ -130,140 +97,123 @@
 ; CT:       @ %bb.0: @ %entry
 ; CT-NEXT:    .save {r4, r5, r6, lr}
 ; CT-NEXT:    push {r4, r5, r6, lr}
-; CT-NEXT:    ldrh lr, [sp, #36]
-; CT-NEXT:    vdup.16 d16, r0
-; CT-NEXT:    ldrh r12, [sp, #28]
+; CT-NEXT:    ldrh r1, [sp, #20]
 ; CT-NEXT:    pkhbt r2, r2, r3, lsl #16
-; CT-NEXT:    ldrh r1, [sp, #32]
-; CT-NEXT:    vshl.i16 d16, d16, #15
+; CT-NEXT:    ldrh r12, [sp, #36]
+; CT-NEXT:    and r0, r0, #1
+; CT-NEXT:    ldrh lr, [sp, #28]
 ; CT-NEXT:    ldrh r6, [sp, #24]
-; CT-NEXT:    ldrh r4, [sp, #20]
-; CT-NEXT:    orr r0, r1, lr, lsl #16
-; CT-NEXT:    orr r1, r6, r12, lsl #16
-; CT-NEXT:    ldrh r5, [sp, #16]
-; CT-NEXT:    vshr.s16 d16, d16, #15
-; CT-NEXT:    vmov d17, r1, r0
-; CT-NEXT:    orr r0, r5, r4, lsl #16
-; CT-NEXT:    vmov d18, r2, r0
-; CT-NEXT:    veor d18, d18, d17
-; CT-NEXT:    vand d16, d18, d16
-; CT-NEXT:    veor d16, d17, d16
-; CT-NEXT:    vmov.u16 r0, d16[0]
-; CT-NEXT:    vmov.u16 r1, d16[1]
-; CT-NEXT:    vmov.u16 r2, d16[2]
-; CT-NEXT:    vmov.u16 r3, d16[3]
+; CT-NEXT:    ldrh r4, [sp, #16]
+; CT-NEXT:    ldrh r5, [sp, #32]
+; CT-NEXT:    orr r6, r6, lr, lsl #16
+; CT-NEXT:    orr r1, r4, r1, lsl #16
+; CT-NEXT:    orr r3, r5, r12, lsl #16
+; CT-NEXT:    vmov d17, r2, r1
+; CT-NEXT:    vmov d16, r6, r3
+; CT-NEXT:    BUNDLE
+; CT-NEXT:    vmov.u16 r0, d18[0]
+; CT-NEXT:    vmov.u16 r1, d18[1]
+; CT-NEXT:    vmov.u16 r2, d18[2]
+; CT-NEXT:    vmov.u16 r3, d18[3]
 ; CT-NEXT:    pop {r4, r5, r6, pc}
 ;
 ; BFLOAT-F16-NATIVE-LABEL: ct_v4f16:
 ; BFLOAT-F16-NATIVE:       @ %bb.0: @ %entry
 ; BFLOAT-F16-NATIVE-NEXT:    .save {r4, r5, r6, lr}
 ; BFLOAT-F16-NATIVE-NEXT:    push {r4, r5, r6, lr}
-; BFLOAT-F16-NATIVE-NEXT:    ldrh lr, [sp, #36]
-; BFLOAT-F16-NATIVE-NEXT:    vdup.16 d16, r0
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r12, [sp, #28]
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r1, [sp, #20]
 ; BFLOAT-F16-NATIVE-NEXT:    pkhbt r2, r2, r3, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r1, [sp, #32]
-; BFLOAT-F16-NATIVE-NEXT:    vshl.i16 d16, d16, #15
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r12, [sp, #36]
+; BFLOAT-F16-NATIVE-NEXT:    and r0, r0, #1
+; BFLOAT-F16-NATIVE-NEXT:    ldrh lr, [sp, #28]
 ; BFLOAT-F16-NATIVE-NEXT:    ldrh r6, [sp, #24]
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r4, [sp, #20]
-; BFLOAT-F16-NATIVE-NEXT:    orr r0, r1, lr, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    orr r1, r6, r12, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r5, [sp, #16]
-; BFLOAT-F16-NATIVE-NEXT:    vshr.s16 d16, d16, #15
-; BFLOAT-F16-NATIVE-NEXT:    vmov d17, r1, r0
-; BFLOAT-F16-NATIVE-NEXT:    orr r0, r5, r4, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    vmov d18, r2, r0
-; BFLOAT-F16-NATIVE-NEXT:    veor d18, d18, d17
-; BFLOAT-F16-NATIVE-NEXT:    vand d16, d18, d16
-; BFLOAT-F16-NATIVE-NEXT:    veor d16, d17, d16
-; BFLOAT-F16-NATIVE-NEXT:    vmov.u16 r0, d16[0]
-; BFLOAT-F16-NATIVE-NEXT:    vmov.u16 r1, d16[1]
-; BFLOAT-F16-NATIVE-NEXT:    vmov.u16 r2, d16[2]
-; BFLOAT-F16-NATIVE-NEXT:    vmov.u16 r3, d16[3]
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r4, [sp, #16]
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r5, [sp, #32]
+; BFLOAT-F16-NATIVE-NEXT:    orr r6, r6, lr, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    orr r1, r4, r1, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    orr r3, r5, r12, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    vmov d17, r2, r1
+; BFLOAT-F16-NATIVE-NEXT:    vmov d16, r6, r3
+; BFLOAT-F16-NATIVE-NEXT:    BUNDLE
+; BFLOAT-F16-NATIVE-NEXT:    vmov.u16 r0, d18[0]
+; BFLOAT-F16-NATIVE-NEXT:    vmov.u16 r1, d18[1]
+; BFLOAT-F16-NATIVE-NEXT:    vmov.u16 r2, d18[2]
+; BFLOAT-F16-NATIVE-NEXT:    vmov.u16 r3, d18[3]
 ; BFLOAT-F16-NATIVE-NEXT:    pop {r4, r5, r6, pc}
 ;
 ; F16-NATIVE-LABEL: ct_v4f16:
 ; F16-NATIVE:       @ %bb.0: @ %entry
 ; F16-NATIVE-NEXT:    .save {r4, r5, r6, lr}
 ; F16-NATIVE-NEXT:    push {r4, r5, r6, lr}
-; F16-NATIVE-NEXT:    ldrh lr, [sp, #36]
-; F16-NATIVE-NEXT:    vdup.16 d16, r0
-; F16-NATIVE-NEXT:    ldrh r12, [sp, #28]
+; F16-NATIVE-NEXT:    ldrh r1, [sp, #20]
 ; F16-NATIVE-NEXT:    pkhbt r2, r2, r3, lsl #16
-; F16-NATIVE-NEXT:    ldrh r1, [sp, #32]
-; F16-NATIVE-NEXT:    vshl.i16 d16, d16, #15
+; F16-NATIVE-NEXT:    ldrh r12, [sp, #36]
+; F16-NATIVE-NEXT:    and r0, r0, #1
+; F16-NATIVE-NEXT:    ldrh lr, [sp, #28]
 ; F16-NATIVE-NEXT:    ldrh r6, [sp, #24]
-; F16-NATIVE-NEXT:    ldrh r4, [sp, #20]
-; F16-NATIVE-NEXT:    orr r0, r1, lr, lsl #16
-; F16-NATIVE-NEXT:    orr r1, r6, r12, lsl #16
-; F16-NATIVE-NEXT:    ldrh r5, [sp, #16]
-; F16-NATIVE-NEXT:    vshr.s16 d16, d16, #15
-; F16-NATIVE-NEXT:    vmov d17, r1, r0
-; F16-NATIVE-NEXT:    orr r0, r5, r4, lsl #16
-; F16-NATIVE-NEXT:    vmov d18, r2, r0
-; F16-NATIVE-NEXT:    veor d18, d18, d17
-; F16-NATIVE-NEXT:    vand d16, d18, d16
-; F16-NATIVE-NEXT:    veor d16, d17, d16
-; F16-NATIVE-NEXT:    vmov.u16 r0, d16[0]
-; F16-NATIVE-NEXT:    vmov.u16 r1, d16[1]
-; F16-NATIVE-NEXT:    vmov.u16 r2, d16[2]
-; F16-NATIVE-NEXT:    vmov.u16 r3, d16[3]
+; F16-NATIVE-NEXT:    ldrh r4, [sp, #16]
+; F16-NATIVE-NEXT:    ldrh r5, [sp, #32]
+; F16-NATIVE-NEXT:    orr r6, r6, lr, lsl #16
+; F16-NATIVE-NEXT:    orr r1, r4, r1, lsl #16
+; F16-NATIVE-NEXT:    orr r3, r5, r12, lsl #16
+; F16-NATIVE-NEXT:    vmov d17, r2, r1
+; F16-NATIVE-NEXT:    vmov d16, r6, r3
+; F16-NATIVE-NEXT:    BUNDLE
+; F16-NATIVE-NEXT:    vmov.u16 r0, d18[0]
+; F16-NATIVE-NEXT:    vmov.u16 r1, d18[1]
+; F16-NATIVE-NEXT:    vmov.u16 r2, d18[2]
+; F16-NATIVE-NEXT:    vmov.u16 r3, d18[3]
 ; F16-NATIVE-NEXT:    pop {r4, r5, r6, pc}
 ;
 ; THUMB1-LABEL: ct_v4f16:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #24]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r5, r1, #0
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r1, [sp, #28]
-; THUMB1-NEXT:    ands r1, r4
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r1, r3
-; THUMB1-NEXT:    ldr r3, [sp, #32]
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    ldr r2, [sp, #16]
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    ldr r3, [sp, #20]
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r3, r6
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r3, [sp, #40]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #44]
+; THUMB1-NEXT:    ldr r6, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v4f16:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    .save {r7, lr}
-; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    ldrh.w r1, [sp, #16]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    rsb.w lr, r0, #0
+; THUMB2-NEXT:    .save {r4, r5, r7, lr}
+; THUMB2-NEXT:    push {r4, r5, r7, lr}
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    ldrh.w r1, [sp, #24]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
 ; THUMB2-NEXT:    and.w r0, r2, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r0, r1
-; THUMB2-NEXT:    ldrh.w r1, [sp, #20]
-; THUMB2-NEXT:    and.w r2, r3, lr
-; THUMB2-NEXT:    ldrh.w r3, [sp, #8]
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
-; THUMB2-NEXT:    ldrh.w r2, [sp, #24]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r2, r3
-; THUMB2-NEXT:    ldrh.w r3, [sp, #28]
-; THUMB2-NEXT:    and.w r12, r12, r3
-; THUMB2-NEXT:    ldrh.w r3, [sp, #12]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    orr.w r3, r3, r12
-; THUMB2-NEXT:    pop {r7, pc}
+; THUMB2-NEXT:    bic.w lr, r1, lr
+; THUMB2-NEXT:    orr.w r0, r0, lr
+; THUMB2-NEXT:    ldrh.w r2, [sp, #28]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
+; THUMB2-NEXT:    ldrh.w r3, [sp, #16]
+; THUMB2-NEXT:    ldrh.w lr, [sp, #32]
+; THUMB2-NEXT:    rsb.w r4, r12, #0
+; THUMB2-NEXT:    and.w r2, r3, r4
+; THUMB2-NEXT:    bic.w r4, lr, r4
+; THUMB2-NEXT:    orrs r2, r4
+; THUMB2-NEXT:    ldrh.w lr, [sp, #36]
+; THUMB2-NEXT:    ldrh.w r4, [sp, #20]
+; THUMB2-NEXT:    rsb.w r5, r12, #0
+; THUMB2-NEXT:    and.w r3, r4, r5
+; THUMB2-NEXT:    bic.w r5, lr, r5
+; THUMB2-NEXT:    orrs r3, r5
+; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <4 x half> @llvm.ct.select.v4f16(i1 %cond, <4 x half> %a, <4 x half> %b)
   ret <4 x half> %sel
@@ -274,28 +224,24 @@
 ; CT:       @ %bb.0: @ %entry
 ; CT-NEXT:    .save {r4, r5, r6, lr}
 ; CT-NEXT:    push {r4, r5, r6, lr}
-; CT-NEXT:    ldrh lr, [sp, #36]
-; CT-NEXT:    vdup.16 d16, r0
-; CT-NEXT:    ldrh r12, [sp, #28]
+; CT-NEXT:    ldrh r1, [sp, #20]
 ; CT-NEXT:    pkhbt r2, r2, r3, lsl #16
-; CT-NEXT:    ldrh r1, [sp, #32]
-; CT-NEXT:    vshl.i16 d16, d16, #15
+; CT-NEXT:    ldrh r12, [sp, #36]
+; CT-NEXT:    and r0, r0, #1
+; CT-NEXT:    ldrh lr, [sp, #28]
 ; CT-NEXT:    ldrh r6, [sp, #24]
-; CT-NEXT:    ldrh r4, [sp, #20]
-; CT-NEXT:    orr r0, r1, lr, lsl #16
-; CT-NEXT:    orr r1, r6, r12, lsl #16
-; CT-NEXT:    ldrh r5, [sp, #16]
-; CT-NEXT:    vshr.s16 d16, d16, #15
-; CT-NEXT:    vmov d17, r1, r0
-; CT-NEXT:    orr r0, r5, r4, lsl #16
-; CT-NEXT:    vmov d18, r2, r0
-; CT-NEXT:    veor d18, d18, d17
-; CT-NEXT:    vand d16, d18, d16
-; CT-NEXT:    veor d16, d17, d16
-; CT-NEXT:    vmov.u16 r0, d16[0]
-; CT-NEXT:    vmov.u16 r1, d16[1]
-; CT-NEXT:    vmov.u16 r2, d16[2]
-; CT-NEXT:    vmov.u16 r3, d16[3]
+; CT-NEXT:    ldrh r4, [sp, #16]
+; CT-NEXT:    ldrh r5, [sp, #32]
+; CT-NEXT:    orr r6, r6, lr, lsl #16
+; CT-NEXT:    orr r1, r4, r1, lsl #16
+; CT-NEXT:    orr r3, r5, r12, lsl #16
+; CT-NEXT:    vmov d17, r2, r1
+; CT-NEXT:    vmov d16, r6, r3
+; CT-NEXT:    BUNDLE
+; CT-NEXT:    vmov.u16 r0, d18[0]
+; CT-NEXT:    vmov.u16 r1, d18[1]
+; CT-NEXT:    vmov.u16 r2, d18[2]
+; CT-NEXT:    vmov.u16 r3, d18[3]
 ; CT-NEXT:    pop {r4, r5, r6, pc}
 ;
 ; BFLOAT-F16-NATIVE-LABEL: ct_v4bf16:
@@ -303,11 +249,7 @@
 ; BFLOAT-F16-NATIVE-NEXT:    vldr d16, [sp]
 ; BFLOAT-F16-NATIVE-NEXT:    vmov d17, r2, r3
 ; BFLOAT-F16-NATIVE-NEXT:    and r0, r0, #1
-; BFLOAT-F16-NATIVE-NEXT:    rsb r1, r0, #0
-; BFLOAT-F16-NATIVE-NEXT:    vdup.32 d19, r1
-; BFLOAT-F16-NATIVE-NEXT:    vand d18, d17, d19
-; BFLOAT-F16-NATIVE-NEXT:    vbic d19, d16, d19
-; BFLOAT-F16-NATIVE-NEXT:    vorr d18, d18, d19
+; BFLOAT-F16-NATIVE-NEXT:    BUNDLE
 ; BFLOAT-F16-NATIVE-NEXT:    vmov r0, r1, d18
 ; BFLOAT-F16-NATIVE-NEXT:    bx lr
 ;
@@ -315,84 +257,75 @@
 ; F16-NATIVE:       @ %bb.0: @ %entry
 ; F16-NATIVE-NEXT:    .save {r4, r5, r6, lr}
 ; F16-NATIVE-NEXT:    push {r4, r5, r6, lr}
-; F16-NATIVE-NEXT:    ldrh lr, [sp, #36]
-; F16-NATIVE-NEXT:    vdup.16 d16, r0
-; F16-NATIVE-NEXT:    ldrh r12, [sp, #28]
+; F16-NATIVE-NEXT:    ldrh r1, [sp, #20]
 ; F16-NATIVE-NEXT:    pkhbt r2, r2, r3, lsl #16
-; F16-NATIVE-NEXT:    ldrh r1, [sp, #32]
-; F16-NATIVE-NEXT:    vshl.i16 d16, d16, #15
+; F16-NATIVE-NEXT:    ldrh r12, [sp, #36]
+; F16-NATIVE-NEXT:    and r0, r0, #1
+; F16-NATIVE-NEXT:    ldrh lr, [sp, #28]
 ; F16-NATIVE-NEXT:    ldrh r6, [sp, #24]
-; F16-NATIVE-NEXT:    ldrh r4, [sp, #20]
-; F16-NATIVE-NEXT:    orr r0, r1, lr, lsl #16
-; F16-NATIVE-NEXT:    orr r1, r6, r12, lsl #16
-; F16-NATIVE-NEXT:    ldrh r5, [sp, #16]
-; F16-NATIVE-NEXT:    vshr.s16 d16, d16, #15
-; F16-NATIVE-NEXT:    vmov d17, r1, r0
-; F16-NATIVE-NEXT:    orr r0, r5, r4, lsl #16
-; F16-NATIVE-NEXT:    vmov d18, r2, r0
-; F16-NATIVE-NEXT:    veor d18, d18, d17
-; F16-NATIVE-NEXT:    vand d16, d18, d16
-; F16-NATIVE-NEXT:    veor d16, d17, d16
-; F16-NATIVE-NEXT:    vmov.u16 r0, d16[0]
-; F16-NATIVE-NEXT:    vmov.u16 r1, d16[1]
-; F16-NATIVE-NEXT:    vmov.u16 r2, d16[2]
-; F16-NATIVE-NEXT:    vmov.u16 r3, d16[3]
+; F16-NATIVE-NEXT:    ldrh r4, [sp, #16]
+; F16-NATIVE-NEXT:    ldrh r5, [sp, #32]
+; F16-NATIVE-NEXT:    orr r6, r6, lr, lsl #16
+; F16-NATIVE-NEXT:    orr r1, r4, r1, lsl #16
+; F16-NATIVE-NEXT:    orr r3, r5, r12, lsl #16
+; F16-NATIVE-NEXT:    vmov d17, r2, r1
+; F16-NATIVE-NEXT:    vmov d16, r6, r3
+; F16-NATIVE-NEXT:    BUNDLE
+; F16-NATIVE-NEXT:    vmov.u16 r0, d18[0]
+; F16-NATIVE-NEXT:    vmov.u16 r1, d18[1]
+; F16-NATIVE-NEXT:    vmov.u16 r2, d18[2]
+; F16-NATIVE-NEXT:    vmov.u16 r3, d18[3]
 ; F16-NATIVE-NEXT:    pop {r4, r5, r6, pc}
 ;
 ; THUMB1-LABEL: ct_v4bf16:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #24]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r5, r1, #0
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r1, [sp, #28]
-; THUMB1-NEXT:    ands r1, r4
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r1, r3
-; THUMB1-NEXT:    ldr r3, [sp, #32]
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    ldr r2, [sp, #16]
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    ldr r3, [sp, #20]
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r3, r6
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r3, [sp, #40]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #44]
+; THUMB1-NEXT:    ldr r6, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v4bf16:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    .save {r7, lr}
-; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    ldrh.w r1, [sp, #16]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    rsb.w lr, r0, #0
+; THUMB2-NEXT:    .save {r4, r5, r7, lr}
+; THUMB2-NEXT:    push {r4, r5, r7, lr}
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    ldrh.w r1, [sp, #24]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
 ; THUMB2-NEXT:    and.w r0, r2, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r0, r1
-; THUMB2-NEXT:    ldrh.w r1, [sp, #20]
-; THUMB2-NEXT:    and.w r2, r3, lr
-; THUMB2-NEXT:    ldrh.w r3, [sp, #8]
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
-; THUMB2-NEXT:    ldrh.w r2, [sp, #24]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r2, r3
-; THUMB2-NEXT:    ldrh.w r3, [sp, #28]
-; THUMB2-NEXT:    and.w r12, r12, r3
-; THUMB2-NEXT:    ldrh.w r3, [sp, #12]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    orr.w r3, r3, r12
-; THUMB2-NEXT:    pop {r7, pc}
+; THUMB2-NEXT:    bic.w lr, r1, lr
+; THUMB2-NEXT:    orr.w r0, r0, lr
+; THUMB2-NEXT:    ldrh.w r2, [sp, #28]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
+; THUMB2-NEXT:    ldrh.w r3, [sp, #16]
+; THUMB2-NEXT:    ldrh.w lr, [sp, #32]
+; THUMB2-NEXT:    rsb.w r4, r12, #0
+; THUMB2-NEXT:    and.w r2, r3, r4
+; THUMB2-NEXT:    bic.w r4, lr, r4
+; THUMB2-NEXT:    orrs r2, r4
+; THUMB2-NEXT:    ldrh.w lr, [sp, #36]
+; THUMB2-NEXT:    ldrh.w r4, [sp, #20]
+; THUMB2-NEXT:    rsb.w r5, r12, #0
+; THUMB2-NEXT:    and.w r3, r4, r5
+; THUMB2-NEXT:    bic.w r5, lr, r5
+; THUMB2-NEXT:    orrs r3, r5
+; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <4 x bfloat> @llvm.ct.select.v4bf16(i1 %cond, <4 x bfloat> %a, <4 x bfloat> %b)
   ret <4 x bfloat> %sel
@@ -401,245 +334,221 @@
 define <8 x half> @ct_v8f16(i1 %cond, <8 x half> %a, <8 x half> %b) {
 ; CT-LABEL: ct_v8f16:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    .save {r4, r5, r6, r7, r11, lr}
-; CT-NEXT:    push {r4, r5, r6, r7, r11, lr}
-; CT-NEXT:    ldrh r5, [sp, #36]
+; CT-NEXT:    .save {r4, r5, r6, r7, r8, lr}
+; CT-NEXT:    push {r4, r5, r6, r7, r8, lr}
+; CT-NEXT:    ldrh r12, [sp, #36]
 ; CT-NEXT:    pkhbt r2, r2, r3, lsl #16
 ; CT-NEXT:    ldrh r7, [sp, #32]
-; CT-NEXT:    vdup.8 d18, r1
-; CT-NEXT:    ldrh r1, [sp, #52]
+; CT-NEXT:    and r1, r1, #1
+; CT-NEXT:    ldrh r3, [sp, #68]
 ; CT-NEXT:    vmov.32 d16[0], r2
-; CT-NEXT:    orr r3, r7, r5, lsl #16
-; CT-NEXT:    ldrh r2, [sp, #48]
-; CT-NEXT:    ldrh r5, [sp, #68]
-; CT-NEXT:    vmovl.u8 q9, d18
-; CT-NEXT:    orr r1, r2, r1, lsl #16
-; CT-NEXT:    vmov.32 d17[0], r3
-; CT-NEXT:    ldrh r3, [sp, #64]
-; CT-NEXT:    ldrh r2, [sp, #28]
-; CT-NEXT:    vmov.32 d20[0], r1
-; CT-NEXT:    ldrh r1, [sp, #24]
-; CT-NEXT:    orr r3, r3, r5, lsl #16
-; CT-NEXT:    ldrh r5, [sp, #76]
-; CT-NEXT:    vshl.i16 q9, q9, #15
-; CT-NEXT:    vmov.32 d21[0], r3
-; CT-NEXT:    orr r1, r1, r2, lsl #16
-; CT-NEXT:    ldrh r3, [sp, #72]
-; CT-NEXT:    ldrh r4, [sp, #60]
-; CT-NEXT:    vmov.32 d16[1], r1
-; CT-NEXT:    orr r1, r3, r5, lsl #16
-; CT-NEXT:    ldrh r6, [sp, #56]
-; CT-NEXT:    ldrh r12, [sp, #44]
-; CT-NEXT:    vshr.s16 q9, q9, #15
-; CT-NEXT:    vmov.32 d21[1], r1
-; CT-NEXT:    orr r1, r6, r4, lsl #16
-; CT-NEXT:    ldrh lr, [sp, #40]
-; CT-NEXT:    vmov.32 d20[1], r1
-; CT-NEXT:    orr r1, lr, r12, lsl #16
-; CT-NEXT:    vmov.32 d17[1], r1
-; CT-NEXT:    veor q8, q8, q10
-; CT-NEXT:    vand q8, q8, q9
-; CT-NEXT:    veor q8, q10, q8
-; CT-NEXT:    vst1.64 {d16, d17}, [r0:128]
-; CT-NEXT:    pop {r4, r5, r6, r7, r11, pc}
+; CT-NEXT:    ldrh r2, [sp, #64]
+; CT-NEXT:    orr r7, r7, r12, lsl #16
+; CT-NEXT:    ldrh r5, [sp, #52]
+; CT-NEXT:    orr r2, r2, r3, lsl #16
+; CT-NEXT:    vmov.32 d17[0], r7
+; CT-NEXT:    ldrh r7, [sp, #48]
+; CT-NEXT:    ldrh r3, [sp, #28]
+; CT-NEXT:    vmov.32 d19[0], r2
+; CT-NEXT:    ldrh r2, [sp, #24]
+; CT-NEXT:    orr r7, r7, r5, lsl #16
+; CT-NEXT:    ldrh r5, [sp, #60]
+; CT-NEXT:    vmov.32 d18[0], r7
+; CT-NEXT:    orr r2, r2, r3, lsl #16
+; CT-NEXT:    ldrh r7, [sp, #56]
+; CT-NEXT:    ldrh lr, [sp, #76]
+; CT-NEXT:    vmov.32 d16[1], r2
+; CT-NEXT:    orr r2, r7, r5, lsl #16
+; CT-NEXT:    ldrh r4, [sp, #72]
+; CT-NEXT:    ldrh r8, [sp, #44]
+; CT-NEXT:    vmov.32 d18[1], r2
+; CT-NEXT:    orr r2, r4, lr, lsl #16
+; CT-NEXT:    ldrh r6, [sp, #40]
+; CT-NEXT:    vmov.32 d19[1], r2
+; CT-NEXT:    orr r2, r6, r8, lsl #16
+; CT-NEXT:    vmov.32 d17[1], r2
+; CT-NEXT:    BUNDLE
+; CT-NEXT:    vst1.64 {d20, d21}, [r0:128]
+; CT-NEXT:    pop {r4, r5, r6, r7, r8, pc}
 ;
 ; BFLOAT-F16-NATIVE-LABEL: ct_v8f16:
 ; BFLOAT-F16-NATIVE:       @ %bb.0: @ %entry
-; BFLOAT-F16-NATIVE-NEXT:    .save {r4, r5, r6, r7, r11, lr}
-; BFLOAT-F16-NATIVE-NEXT:    push {r4, r5, r6, r7, r11, lr}
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r5, [sp, #36]
+; BFLOAT-F16-NATIVE-NEXT:    .save {r4, r5, r6, r7, r8, lr}
+; BFLOAT-F16-NATIVE-NEXT:    push {r4, r5, r6, r7, r8, lr}
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r12, [sp, #36]
 ; BFLOAT-F16-NATIVE-NEXT:    pkhbt r2, r2, r3, lsl #16
 ; BFLOAT-F16-NATIVE-NEXT:    ldrh r7, [sp, #32]
-; BFLOAT-F16-NATIVE-NEXT:    vdup.8 d18, r1
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r1, [sp, #52]
+; BFLOAT-F16-NATIVE-NEXT:    and r1, r1, #1
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r3, [sp, #68]
 ; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d16[0], r2
-; BFLOAT-F16-NATIVE-NEXT:    orr r3, r7, r5, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r2, [sp, #48]
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r5, [sp, #68]
-; BFLOAT-F16-NATIVE-NEXT:    vmovl.u8 q9, d18
-; BFLOAT-F16-NATIVE-NEXT:    orr r1, r2, r1, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d17[0], r3
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r3, [sp, #64]
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r2, [sp, #28]
-; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d20[0], r1
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r1, [sp, #24]
-; BFLOAT-F16-NATIVE-NEXT:    orr r3, r3, r5, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r5, [sp, #76]
-; BFLOAT-F16-NATIVE-NEXT:    vshl.i16 q9, q9, #15
-; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d21[0], r3
-; BFLOAT-F16-NATIVE-NEXT:    orr r1, r1, r2, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r3, [sp, #72]
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r4, [sp, #60]
-; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d16[1], r1
-; BFLOAT-F16-NATIVE-NEXT:    orr r1, r3, r5, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r6, [sp, #56]
-; BFLOAT-F16-NATIVE-NEXT:    ldrh r12, [sp, #44]
-; BFLOAT-F16-NATIVE-NEXT:    vshr.s16 q9, q9, #15
-; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d21[1], r1
-; BFLOAT-F16-NATIVE-NEXT:    orr r1, r6, r4, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    ldrh lr, [sp, #40]
-; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d20[1], r1
-; BFLOAT-F16-NATIVE-NEXT:    orr r1, lr, r12, lsl #16
-; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d17[1], r1
-; BFLOAT-F16-NATIVE-NEXT:    veor q8, q8, q10
-; BFLOAT-F16-NATIVE-NEXT:    vand q8, q8, q9
-; BFLOAT-F16-NATIVE-NEXT:    veor q8, q10, q8
-; BFLOAT-F16-NATIVE-NEXT:    vst1.64 {d16, d17}, [r0:128]
-; BFLOAT-F16-NATIVE-NEXT:    pop {r4, r5, r6, r7, r11, pc}
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r2, [sp, #64]
+; BFLOAT-F16-NATIVE-NEXT:    orr r7, r7, r12, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r5, [sp, #52]
+; BFLOAT-F16-NATIVE-NEXT:    orr r2, r2, r3, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d17[0], r7
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r7, [sp, #48]
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r3, [sp, #28]
+; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d19[0], r2
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r2, [sp, #24]
+; BFLOAT-F16-NATIVE-NEXT:    orr r7, r7, r5, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r5, [sp, #60]
+; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d18[0], r7
+; BFLOAT-F16-NATIVE-NEXT:    orr r2, r2, r3, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r7, [sp, #56]
+; BFLOAT-F16-NATIVE-NEXT:    ldrh lr, [sp, #76]
+; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d16[1], r2
+; BFLOAT-F16-NATIVE-NEXT:    orr r2, r7, r5, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r4, [sp, #72]
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r8, [sp, #44]
+; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d18[1], r2
+; BFLOAT-F16-NATIVE-NEXT:    orr r2, r4, lr, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    ldrh r6, [sp, #40]
+; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d19[1], r2
+; BFLOAT-F16-NATIVE-NEXT:    orr r2, r6, r8, lsl #16
+; BFLOAT-F16-NATIVE-NEXT:    vmov.32 d17[1], r2
+; BFLOAT-F16-NATIVE-NEXT:    BUNDLE
+; BFLOAT-F16-NATIVE-NEXT:    vst1.64 {d20, d21}, [r0:128]
+; BFLOAT-F16-NATIVE-NEXT:    pop {r4, r5, r6, r7, r8, pc}
 ;
 ; F16-NATIVE-LABEL: ct_v8f16:
 ; F16-NATIVE:       @ %bb.0: @ %entry
-; F16-NATIVE-NEXT:    .save {r4, r5, r6, r7, r11, lr}
-; F16-NATIVE-NEXT:    push {r4, r5, r6, r7, r11, lr}
-; F16-NATIVE-NEXT:    ldrh r5, [sp, #36]
+; F16-NATIVE-NEXT:    .save {r4, r5, r6, r7, r8, lr}
+; F16-NATIVE-NEXT:    push {r4, r5, r6, r7, r8, lr}
+; F16-NATIVE-NEXT:    ldrh r12, [sp, #36]
 ; F16-NATIVE-NEXT:    pkhbt r2, r2, r3, lsl #16
 ; F16-NATIVE-NEXT:    ldrh r7, [sp, #32]
-; F16-NATIVE-NEXT:    vdup.8 d18, r1
-; F16-NATIVE-NEXT:    ldrh r1, [sp, #52]
+; F16-NATIVE-NEXT:    and r1, r1, #1
+; F16-NATIVE-NEXT:    ldrh r3, [sp, #68]
 ; F16-NATIVE-NEXT:    vmov.32 d16[0], r2
-; F16-NATIVE-NEXT:    orr r3, r7, r5, lsl #16
-; F16-NATIVE-NEXT:    ldrh r2, [sp, #48]
-; F16-NATIVE-NEXT:    ldrh r5, [sp, #68]
-; F16-NATIVE-NEXT:    vmovl.u8 q9, d18
-; F16-NATIVE-NEXT:    orr r1, r2, r1, lsl #16
-; F16-NATIVE-NEXT:    vmov.32 d17[0], r3
-; F16-NATIVE-NEXT:    ldrh r3, [sp, #64]
-; F16-NATIVE-NEXT:    ldrh r2, [sp, #28]
-; F16-NATIVE-NEXT:    vmov.32 d20[0], r1
-; F16-NATIVE-NEXT:    ldrh r1, [sp, #24]
-; F16-NATIVE-NEXT:    orr r3, r3, r5, lsl #16
-; F16-NATIVE-NEXT:    ldrh r5, [sp, #76]
-; F16-NATIVE-NEXT:    vshl.i16 q9, q9, #15
-; F16-NATIVE-NEXT:    vmov.32 d21[0], r3
-; F16-NATIVE-NEXT:    orr r1, r1, r2, lsl #16
-; F16-NATIVE-NEXT:    ldrh r3, [sp, #72]
-; F16-NATIVE-NEXT:    ldrh r4, [sp, #60]
-; F16-NATIVE-NEXT:    vmov.32 d16[1], r1
-; F16-NATIVE-NEXT:    orr r1, r3, r5, lsl #16
-; F16-NATIVE-NEXT:    ldrh r6, [sp, #56]
-; F16-NATIVE-NEXT:    ldrh r12, [sp, #44]
-; F16-NATIVE-NEXT:    vshr.s16 q9, q9, #15
-; F16-NATIVE-NEXT:    vmov.32 d21[1], r1
-; F16-NATIVE-NEXT:    orr r1, r6, r4, lsl #16
-; F16-NATIVE-NEXT:    ldrh lr, [sp, #40]
-; F16-NATIVE-NEXT:    vmov.32 d20[1], r1
-; F16-NATIVE-NEXT:    orr r1, lr, r12, lsl #16
-; F16-NATIVE-NEXT:    vmov.32 d17[1], r1
-; F16-NATIVE-NEXT:    veor q8, q8, q10
-; F16-NATIVE-NEXT:    vand q8, q8, q9
-; F16-NATIVE-NEXT:    veor q8, q10, q8
-; F16-NATIVE-NEXT:    vst1.64 {d16, d17}, [r0:128]
-; F16-NATIVE-NEXT:    pop {r4, r5, r6, r7, r11, pc}
+; F16-NATIVE-NEXT:    ldrh r2, [sp, #64]
+; F16-NATIVE-NEXT:    orr r7, r7, r12, lsl #16
+; F16-NATIVE-NEXT:    ldrh r5, [sp, #52]
+; F16-NATIVE-NEXT:    orr r2, r2, r3, lsl #16
+; F16-NATIVE-NEXT:    vmov.32 d17[0], r7
+; F16-NATIVE-NEXT:    ldrh r7, [sp, #48]
+; F16-NATIVE-NEXT:    ldrh r3, [sp, #28]
+; F16-NATIVE-NEXT:    vmov.32 d19[0], r2
+; F16-NATIVE-NEXT:    ldrh r2, [sp, #24]
+; F16-NATIVE-NEXT:    orr r7, r7, r5, lsl #16
+; F16-NATIVE-NEXT:    ldrh r5, [sp, #60]
+; F16-NATIVE-NEXT:    vmov.32 d18[0], r7
+; F16-NATIVE-NEXT:    orr r2, r2, r3, lsl #16
+; F16-NATIVE-NEXT:    ldrh r7, [sp, #56]
+; F16-NATIVE-NEXT:    ldrh lr, [sp, #76]
+; F16-NATIVE-NEXT:    vmov.32 d16[1], r2
+; F16-NATIVE-NEXT:    orr r2, r7, r5, lsl #16
+; F16-NATIVE-NEXT:    ldrh r4, [sp, #72]
+; F16-NATIVE-NEXT:    ldrh r8, [sp, #44]
+; F16-NATIVE-NEXT:    vmov.32 d18[1], r2
+; F16-NATIVE-NEXT:    orr r2, r4, lr, lsl #16
+; F16-NATIVE-NEXT:    ldrh r6, [sp, #40]
+; F16-NATIVE-NEXT:    vmov.32 d19[1], r2
+; F16-NATIVE-NEXT:    orr r2, r6, r8, lsl #16
+; F16-NATIVE-NEXT:    vmov.32 d17[1], r2
+; F16-NATIVE-NEXT:    BUNDLE
+; F16-NATIVE-NEXT:    vst1.64 {d20, d21}, [r0:128]
+; F16-NATIVE-NEXT:    pop {r4, r5, r6, r7, r8, pc}
 ;
 ; THUMB1-LABEL: ct_v8f16:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
 ; THUMB1-NEXT:    movs r4, #1
 ; THUMB1-NEXT:    ands r4, r1
-; THUMB1-NEXT:    subs r1, r4, #1
-; THUMB1-NEXT:    ldr r5, [sp, #68]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    rsbs r4, r4, #0
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #14]
-; THUMB1-NEXT:    ldr r5, [sp, #64]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #32]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #12]
-; THUMB1-NEXT:    ldr r5, [sp, #60]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #28]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #10]
-; THUMB1-NEXT:    ldr r5, [sp, #56]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #24]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #8]
-; THUMB1-NEXT:    ldr r5, [sp, #52]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #20]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #6]
-; THUMB1-NEXT:    ldr r5, [sp, #48]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #16]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #4]
+; THUMB1-NEXT:    ldr r1, [sp, #76]
 ; THUMB1-NEXT:    ldr r5, [sp, #44]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    orrs r3, r5
-; THUMB1-NEXT:    strh r3, [r0, #2]
-; THUMB1-NEXT:    ldr r3, [sp, #40]
-; THUMB1-NEXT:    ands r3, r1
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    strh r2, [r0]
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #14]
+; THUMB1-NEXT:    ldr r1, [sp, #72]
+; THUMB1-NEXT:    ldr r5, [sp, #40]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #12]
+; THUMB1-NEXT:    ldr r1, [sp, #68]
+; THUMB1-NEXT:    ldr r5, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #10]
+; THUMB1-NEXT:    ldr r1, [sp, #64]
+; THUMB1-NEXT:    ldr r5, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #8]
+; THUMB1-NEXT:    ldr r1, [sp, #60]
+; THUMB1-NEXT:    ldr r5, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #6]
+; THUMB1-NEXT:    ldr r1, [sp, #56]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #4]
+; THUMB1-NEXT:    ldr r1, [sp, #52]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r5, [r0, #2]
+; THUMB1-NEXT:    ldr r1, [sp, #48]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r3, [r0]
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v8f16:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r4, r5, r7, lr}
 ; THUMB2-NEXT:    push {r4, r5, r7, lr}
 ; THUMB2-NEXT:    and lr, r1, #1
-; THUMB2-NEXT:    ldrh.w r1, [sp, #68]
-; THUMB2-NEXT:    sub.w r12, lr, #1
-; THUMB2-NEXT:    ldrh.w r4, [sp, #36]
-; THUMB2-NEXT:    and.w r5, r1, r12
+; THUMB2-NEXT:    ldrh.w r12, [sp, #68]
+; THUMB2-NEXT:    ldrh.w r1, [sp, #36]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r4, r1, r5
+; THUMB2-NEXT:    bic.w r5, r12, r5
+; THUMB2-NEXT:    orrs r4, r5
+; THUMB2-NEXT:    strh r4, [r0, #14]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #64]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #32]
 ; THUMB2-NEXT:    rsb.w r1, lr, #0
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r3, r1
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #12]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #60]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #28]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #10]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #56]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #24]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #8]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #52]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #20]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #6]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #48]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #16]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #4]
+; THUMB2-NEXT:    ldrh.w r1, [sp, #44]
+; THUMB2-NEXT:    rsb.w r4, lr, #0
+; THUMB2-NEXT:    and.w r5, r3, r4
+; THUMB2-NEXT:    bic.w r4, r1, r4
 ; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #32]
-; THUMB2-NEXT:    strh r5, [r0, #14]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #64]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #28]
-; THUMB2-NEXT:    strh r5, [r0, #12]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #60]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #24]
-; THUMB2-NEXT:    strh r5, [r0, #10]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #56]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #20]
-; THUMB2-NEXT:    strh r5, [r0, #8]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #52]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #16]
-; THUMB2-NEXT:    strh r5, [r0, #6]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #48]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r1, r2
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    strh r5, [r0, #4]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #44]
-; THUMB2-NEXT:    and.w r5, r5, r12
+; THUMB2-NEXT:    strh r5, [r0, #2]
+; THUMB2-NEXT:    ldrh.w r1, [sp, #40]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r3, r2, r5
+; THUMB2-NEXT:    bic.w r5, r1, r5
 ; THUMB2-NEXT:    orrs r3, r5
-; THUMB2-NEXT:    strh r3, [r0, #2]
-; THUMB2-NEXT:    ldrh.w r3, [sp, #40]
-; THUMB2-NEXT:    and.w r3, r3, r12
-; THUMB2-NEXT:    orrs r1, r3
-; THUMB2-NEXT:    strh r1, [r0]
+; THUMB2-NEXT:    strh r3, [r0]
 ; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <8 x half> @llvm.ct.select.v8f16(i1 %cond, <8 x half> %a, <8 x half> %b)
@@ -649,47 +558,42 @@
 define <8 x bfloat> @ct_v8bf16(i1 %cond, <8 x bfloat> %a, <8 x bfloat> %b) {
 ; CT-LABEL: ct_v8bf16:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    .save {r4, r5, r6, r7, r11, lr}
-; CT-NEXT:    push {r4, r5, r6, r7, r11, lr}
-; CT-NEXT:    ldrh r5, [sp, #36]
+; CT-NEXT:    .save {r4, r5, r6, r7, r8, lr}
+; CT-NEXT:    push {r4, r5, r6, r7, r8, lr}
+; CT-NEXT:    ldrh r12, [sp, #36]
 ; CT-NEXT:    pkhbt r2, r2, r3, lsl #16
 ; CT-NEXT:    ldrh r7, [sp, #32]
-; CT-NEXT:    vdup.8 d18, r1
-; CT-NEXT:    ldrh r1, [sp, #52]
+; CT-NEXT:    and r1, r1, #1
+; CT-NEXT:    ldrh r3, [sp, #68]
 ; CT-NEXT:    vmov.32 d16[0], r2
-; CT-NEXT:    orr r3, r7, r5, lsl #16
-; CT-NEXT:    ldrh r2, [sp, #48]
-; CT-NEXT:    ldrh r5, [sp, #68]
-; CT-NEXT:    vmovl.u8 q9, d18
-; CT-NEXT:    orr r1, r2, r1, lsl #16
-; CT-NEXT:    vmov.32 d17[0], r3
-; CT-NEXT:    ldrh r3, [sp, #64]
-; CT-NEXT:    ldrh r2, [sp, #28]
-; CT-NEXT:    vmov.32 d20[0], r1
-; CT-NEXT:    ldrh r1, [sp, #24]
-; CT-NEXT:    orr r3, r3, r5, lsl #16
-; CT-NEXT:    ldrh r5, [sp, #76]
-; CT-NEXT:    vshl.i16 q9, q9, #15
-; CT-NEXT:    vmov.32 d21[0], r3
-; CT-NEXT:    orr r1, r1, r2, lsl #16
-; CT-NEXT:    ldrh r3, [sp, #72]
-; CT-NEXT:    ldrh r4, [sp, #60]
-; CT-NEXT:    vmov.32 d16[1], r1
-; CT-NEXT:    orr r1, r3, r5, lsl #16
-; CT-NEXT:    ldrh r6, [sp, #56]
-; CT-NEXT:    ldrh r12, [sp, #44]
-; CT-NEXT:    vshr.s16 q9, q9, #15
-; CT-NEXT:    vmov.32 d21[1], r1
-; CT-NEXT:    orr r1, r6, r4, lsl #16
-; CT-NEXT:    ldrh lr, [sp, #40]
-; CT-NEXT:    vmov.32 d20[1], r1
-; CT-NEXT:    orr r1, lr, r12, lsl #16
-; CT-NEXT:    vmov.32 d17[1], r1
-; CT-NEXT:    veor q8, q8, q10
-; CT-NEXT:    vand q8, q8, q9
-; CT-NEXT:    veor q8, q10, q8
-; CT-NEXT:    vst1.64 {d16, d17}, [r0:128]
-; CT-NEXT:    pop {r4, r5, r6, r7, r11, pc}
+; CT-NEXT:    ldrh r2, [sp, #64]
+; CT-NEXT:    orr r7, r7, r12, lsl #16
+; CT-NEXT:    ldrh r5, [sp, #52]
+; CT-NEXT:    orr r2, r2, r3, lsl #16
+; CT-NEXT:    vmov.32 d17[0], r7
+; CT-NEXT:    ldrh r7, [sp, #48]
+; CT-NEXT:    ldrh r3, [sp, #28]
+; CT-NEXT:    vmov.32 d19[0], r2
+; CT-NEXT:    ldrh r2, [sp, #24]
+; CT-NEXT:    orr r7, r7, r5, lsl #16
+; CT-NEXT:    ldrh r5, [sp, #60]
+; CT-NEXT:    vmov.32 d18[0], r7
+; CT-NEXT:    orr r2, r2, r3, lsl #16
+; CT-NEXT:    ldrh r7, [sp, #56]
+; CT-NEXT:    ldrh lr, [sp, #76]
+; CT-NEXT:    vmov.32 d16[1], r2
+; CT-NEXT:    orr r2, r7, r5, lsl #16
+; CT-NEXT:    ldrh r4, [sp, #72]
+; CT-NEXT:    ldrh r8, [sp, #44]
+; CT-NEXT:    vmov.32 d18[1], r2
+; CT-NEXT:    orr r2, r4, lr, lsl #16
+; CT-NEXT:    ldrh r6, [sp, #40]
+; CT-NEXT:    vmov.32 d19[1], r2
+; CT-NEXT:    orr r2, r6, r8, lsl #16
+; CT-NEXT:    vmov.32 d17[1], r2
+; CT-NEXT:    BUNDLE
+; CT-NEXT:    vst1.64 {d20, d21}, [r0:128]
+; CT-NEXT:    pop {r4, r5, r6, r7, r8, pc}
 ;
 ; BFLOAT-F16-NATIVE-LABEL: ct_v8bf16:
 ; BFLOAT-F16-NATIVE:       @ %bb.0: @ %entry
@@ -698,168 +602,150 @@
 ; BFLOAT-F16-NATIVE-NEXT:    vmov d16, r2, r3
 ; BFLOAT-F16-NATIVE-NEXT:    vld1.64 {d18, d19}, [r1]
 ; BFLOAT-F16-NATIVE-NEXT:    and r0, r0, #1
-; BFLOAT-F16-NATIVE-NEXT:    rsb r1, r0, #0
-; BFLOAT-F16-NATIVE-NEXT:    vdup.32 q11, r1
-; BFLOAT-F16-NATIVE-NEXT:    vand q10, q8, q11
-; BFLOAT-F16-NATIVE-NEXT:    vbic q11, q9, q11
-; BFLOAT-F16-NATIVE-NEXT:    vorr q10, q10, q11
+; BFLOAT-F16-NATIVE-NEXT:    BUNDLE
 ; BFLOAT-F16-NATIVE-NEXT:    vmov r0, r1, d20
 ; BFLOAT-F16-NATIVE-NEXT:    vmov r2, r3, d21
 ; BFLOAT-F16-NATIVE-NEXT:    bx lr
 ;
 ; F16-NATIVE-LABEL: ct_v8bf16:
 ; F16-NATIVE:       @ %bb.0: @ %entry
-; F16-NATIVE-NEXT:    .save {r4, r5, r6, r7, r11, lr}
-; F16-NATIVE-NEXT:    push {r4, r5, r6, r7, r11, lr}
-; F16-NATIVE-NEXT:    ldrh r5, [sp, #36]
+; F16-NATIVE-NEXT:    .save {r4, r5, r6, r7, r8, lr}
+; F16-NATIVE-NEXT:    push {r4, r5, r6, r7, r8, lr}
+; F16-NATIVE-NEXT:    ldrh r12, [sp, #36]
 ; F16-NATIVE-NEXT:    pkhbt r2, r2, r3, lsl #16
 ; F16-NATIVE-NEXT:    ldrh r7, [sp, #32]
-; F16-NATIVE-NEXT:    vdup.8 d18, r1
-; F16-NATIVE-NEXT:    ldrh r1, [sp, #52]
+; F16-NATIVE-NEXT:    and r1, r1, #1
+; F16-NATIVE-NEXT:    ldrh r3, [sp, #68]
 ; F16-NATIVE-NEXT:    vmov.32 d16[0], r2
-; F16-NATIVE-NEXT:    orr r3, r7, r5, lsl #16
-; F16-NATIVE-NEXT:    ldrh r2, [sp, #48]
-; F16-NATIVE-NEXT:    ldrh r5, [sp, #68]
-; F16-NATIVE-NEXT:    vmovl.u8 q9, d18
-; F16-NATIVE-NEXT:    orr r1, r2, r1, lsl #16
-; F16-NATIVE-NEXT:    vmov.32 d17[0], r3
-; F16-NATIVE-NEXT:    ldrh r3, [sp, #64]
-; F16-NATIVE-NEXT:    ldrh r2, [sp, #28]
-; F16-NATIVE-NEXT:    vmov.32 d20[0], r1
-; F16-NATIVE-NEXT:    ldrh r1, [sp, #24]
-; F16-NATIVE-NEXT:    orr r3, r3, r5, lsl #16
-; F16-NATIVE-NEXT:    ldrh r5, [sp, #76]
-; F16-NATIVE-NEXT:    vshl.i16 q9, q9, #15
-; F16-NATIVE-NEXT:    vmov.32 d21[0], r3
-; F16-NATIVE-NEXT:    orr r1, r1, r2, lsl #16
-; F16-NATIVE-NEXT:    ldrh r3, [sp, #72]
-; F16-NATIVE-NEXT:    ldrh r4, [sp, #60]
-; F16-NATIVE-NEXT:    vmov.32 d16[1], r1
-; F16-NATIVE-NEXT:    orr r1, r3, r5, lsl #16
-; F16-NATIVE-NEXT:    ldrh r6, [sp, #56]
-; F16-NATIVE-NEXT:    ldrh r12, [sp, #44]
-; F16-NATIVE-NEXT:    vshr.s16 q9, q9, #15
-; F16-NATIVE-NEXT:    vmov.32 d21[1], r1
-; F16-NATIVE-NEXT:    orr r1, r6, r4, lsl #16
-; F16-NATIVE-NEXT:    ldrh lr, [sp, #40]
-; F16-NATIVE-NEXT:    vmov.32 d20[1], r1
-; F16-NATIVE-NEXT:    orr r1, lr, r12, lsl #16
-; F16-NATIVE-NEXT:    vmov.32 d17[1], r1
-; F16-NATIVE-NEXT:    veor q8, q8, q10
-; F16-NATIVE-NEXT:    vand q8, q8, q9
-; F16-NATIVE-NEXT:    veor q8, q10, q8
-; F16-NATIVE-NEXT:    vst1.64 {d16, d17}, [r0:128]
-; F16-NATIVE-NEXT:    pop {r4, r5, r6, r7, r11, pc}
+; F16-NATIVE-NEXT:    ldrh r2, [sp, #64]
+; F16-NATIVE-NEXT:    orr r7, r7, r12, lsl #16
+; F16-NATIVE-NEXT:    ldrh r5, [sp, #52]
+; F16-NATIVE-NEXT:    orr r2, r2, r3, lsl #16
+; F16-NATIVE-NEXT:    vmov.32 d17[0], r7
+; F16-NATIVE-NEXT:    ldrh r7, [sp, #48]
+; F16-NATIVE-NEXT:    ldrh r3, [sp, #28]
+; F16-NATIVE-NEXT:    vmov.32 d19[0], r2
+; F16-NATIVE-NEXT:    ldrh r2, [sp, #24]
+; F16-NATIVE-NEXT:    orr r7, r7, r5, lsl #16
+; F16-NATIVE-NEXT:    ldrh r5, [sp, #60]
+; F16-NATIVE-NEXT:    vmov.32 d18[0], r7
+; F16-NATIVE-NEXT:    orr r2, r2, r3, lsl #16
+; F16-NATIVE-NEXT:    ldrh r7, [sp, #56]
+; F16-NATIVE-NEXT:    ldrh lr, [sp, #76]
+; F16-NATIVE-NEXT:    vmov.32 d16[1], r2
+; F16-NATIVE-NEXT:    orr r2, r7, r5, lsl #16
+; F16-NATIVE-NEXT:    ldrh r4, [sp, #72]
+; F16-NATIVE-NEXT:    ldrh r8, [sp, #44]
+; F16-NATIVE-NEXT:    vmov.32 d18[1], r2
+; F16-NATIVE-NEXT:    orr r2, r4, lr, lsl #16
+; F16-NATIVE-NEXT:    ldrh r6, [sp, #40]
+; F16-NATIVE-NEXT:    vmov.32 d19[1], r2
+; F16-NATIVE-NEXT:    orr r2, r6, r8, lsl #16
+; F16-NATIVE-NEXT:    vmov.32 d17[1], r2
+; F16-NATIVE-NEXT:    BUNDLE
+; F16-NATIVE-NEXT:    vst1.64 {d20, d21}, [r0:128]
+; F16-NATIVE-NEXT:    pop {r4, r5, r6, r7, r8, pc}
 ;
 ; THUMB1-LABEL: ct_v8bf16:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
 ; THUMB1-NEXT:    movs r4, #1
 ; THUMB1-NEXT:    ands r4, r1
-; THUMB1-NEXT:    subs r1, r4, #1
-; THUMB1-NEXT:    ldr r5, [sp, #68]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    rsbs r4, r4, #0
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #14]
-; THUMB1-NEXT:    ldr r5, [sp, #64]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #32]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #12]
-; THUMB1-NEXT:    ldr r5, [sp, #60]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #28]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #10]
-; THUMB1-NEXT:    ldr r5, [sp, #56]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #24]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #8]
-; THUMB1-NEXT:    ldr r5, [sp, #52]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #20]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #6]
-; THUMB1-NEXT:    ldr r5, [sp, #48]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #16]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #4]
+; THUMB1-NEXT:    ldr r1, [sp, #76]
 ; THUMB1-NEXT:    ldr r5, [sp, #44]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    orrs r3, r5
-; THUMB1-NEXT:    strh r3, [r0, #2]
-; THUMB1-NEXT:    ldr r3, [sp, #40]
-; THUMB1-NEXT:    ands r3, r1
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    strh r2, [r0]
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #14]
+; THUMB1-NEXT:    ldr r1, [sp, #72]
+; THUMB1-NEXT:    ldr r5, [sp, #40]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #12]
+; THUMB1-NEXT:    ldr r1, [sp, #68]
+; THUMB1-NEXT:    ldr r5, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #10]
+; THUMB1-NEXT:    ldr r1, [sp, #64]
+; THUMB1-NEXT:    ldr r5, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #8]
+; THUMB1-NEXT:    ldr r1, [sp, #60]
+; THUMB1-NEXT:    ldr r5, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #6]
+; THUMB1-NEXT:    ldr r1, [sp, #56]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #4]
+; THUMB1-NEXT:    ldr r1, [sp, #52]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r5, [r0, #2]
+; THUMB1-NEXT:    ldr r1, [sp, #48]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r3, [r0]
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v8bf16:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r4, r5, r7, lr}
 ; THUMB2-NEXT:    push {r4, r5, r7, lr}
 ; THUMB2-NEXT:    and lr, r1, #1
-; THUMB2-NEXT:    ldrh.w r1, [sp, #68]
-; THUMB2-NEXT:    sub.w r12, lr, #1
-; THUMB2-NEXT:    ldrh.w r4, [sp, #36]
-; THUMB2-NEXT:    and.w r5, r1, r12
+; THUMB2-NEXT:    ldrh.w r12, [sp, #68]
+; THUMB2-NEXT:    ldrh.w r1, [sp, #36]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r4, r1, r5
+; THUMB2-NEXT:    bic.w r5, r12, r5
+; THUMB2-NEXT:    orrs r4, r5
+; THUMB2-NEXT:    strh r4, [r0, #14]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #64]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #32]
 ; THUMB2-NEXT:    rsb.w r1, lr, #0
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r3, r1
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #12]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #60]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #28]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #10]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #56]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #24]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #8]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #52]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #20]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #6]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #48]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #16]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #4]
+; THUMB2-NEXT:    ldrh.w r1, [sp, #44]
+; THUMB2-NEXT:    rsb.w r4, lr, #0
+; THUMB2-NEXT:    and.w r5, r3, r4
+; THUMB2-NEXT:    bic.w r4, r1, r4
 ; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #32]
-; THUMB2-NEXT:    strh r5, [r0, #14]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #64]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #28]
-; THUMB2-NEXT:    strh r5, [r0, #12]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #60]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #24]
-; THUMB2-NEXT:    strh r5, [r0, #10]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #56]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #20]
-; THUMB2-NEXT:    strh r5, [r0, #8]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #52]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #16]
-; THUMB2-NEXT:    strh r5, [r0, #6]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #48]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r1, r2
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    strh r5, [r0, #4]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #44]
-; THUMB2-NEXT:    and.w r5, r5, r12
+; THUMB2-NEXT:    strh r5, [r0, #2]
+; THUMB2-NEXT:    ldrh.w r1, [sp, #40]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r3, r2, r5
+; THUMB2-NEXT:    bic.w r5, r1, r5
 ; THUMB2-NEXT:    orrs r3, r5
-; THUMB2-NEXT:    strh r3, [r0, #2]
-; THUMB2-NEXT:    ldrh.w r3, [sp, #40]
-; THUMB2-NEXT:    and.w r3, r3, r12
-; THUMB2-NEXT:    orrs r1, r3
-; THUMB2-NEXT:    strh r1, [r0]
+; THUMB2-NEXT:    strh r3, [r0]
 ; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <8 x bfloat> @llvm.ct.select.v8bf16(i1 %cond, <8 x bfloat> %a, <8 x bfloat> %b)
diff --git a/llvm/test/CodeGen/ARM/ctselect-vector.ll b/llvm/test/CodeGen/ARM/ctselect-vector.ll
index 3a03ebc..d720c89 100644
--- a/llvm/test/CodeGen/ARM/ctselect-vector.ll
+++ b/llvm/test/CodeGen/ARM/ctselect-vector.ll
@@ -10,11 +10,7 @@
 ; CT-NEXT:    vldr d16, [sp]
 ; CT-NEXT:    vmov d17, r2, r3
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 d19, r1
-; CT-NEXT:    vand d18, d17, d19
-; CT-NEXT:    vbic d19, d16, d19
-; CT-NEXT:    vorr d18, d18, d19
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d18
 ; CT-NEXT:    bx lr
 ;
@@ -22,165 +18,138 @@
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    push {r4, r5, r11, lr}
 ; DEFAULT-NEXT:    and lr, r1, #1
-; DEFAULT-NEXT:    ldrb r1, [sp, #68]
-; DEFAULT-NEXT:    sub r12, lr, #1
-; DEFAULT-NEXT:    ldrb r4, [sp, #36]
-; DEFAULT-NEXT:    and r5, r1, r12
-; DEFAULT-NEXT:    rsb r1, lr, #0
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r3, r3, r1
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #32]
-; DEFAULT-NEXT:    strb r5, [r0, #7]
-; DEFAULT-NEXT:    ldrb r5, [sp, #64]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #28]
-; DEFAULT-NEXT:    strb r5, [r0, #6]
-; DEFAULT-NEXT:    ldrb r5, [sp, #60]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #24]
-; DEFAULT-NEXT:    strb r5, [r0, #5]
-; DEFAULT-NEXT:    ldrb r5, [sp, #56]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #20]
-; DEFAULT-NEXT:    strb r5, [r0, #4]
-; DEFAULT-NEXT:    ldrb r5, [sp, #52]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #16]
-; DEFAULT-NEXT:    strb r5, [r0, #3]
-; DEFAULT-NEXT:    ldrb r5, [sp, #48]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r1, r2, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    strb r5, [r0, #2]
-; DEFAULT-NEXT:    ldrb r5, [sp, #44]
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r3, r3, r5
-; DEFAULT-NEXT:    strb r3, [r0, #1]
-; DEFAULT-NEXT:    ldrb r3, [sp, #40]
-; DEFAULT-NEXT:    and r3, r3, r12
-; DEFAULT-NEXT:    orr r1, r1, r3
-; DEFAULT-NEXT:    strb r1, [r0]
+; DEFAULT-NEXT:    ldrb r12, [sp, #68]
+; DEFAULT-NEXT:    ldrb r1, [sp, #36]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #7]
+; DEFAULT-NEXT:    ldrb r12, [sp, #64]
+; DEFAULT-NEXT:    ldrb r5, [sp, #32]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #6]
+; DEFAULT-NEXT:    ldrb r12, [sp, #60]
+; DEFAULT-NEXT:    ldrb r5, [sp, #28]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #5]
+; DEFAULT-NEXT:    ldrb r12, [sp, #56]
+; DEFAULT-NEXT:    ldrb r5, [sp, #24]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #4]
+; DEFAULT-NEXT:    ldrb r12, [sp, #52]
+; DEFAULT-NEXT:    ldrb r5, [sp, #20]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #3]
+; DEFAULT-NEXT:    ldrb r12, [sp, #48]
+; DEFAULT-NEXT:    ldrb r5, [sp, #16]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #2]
+; DEFAULT-NEXT:    ldrb r1, [sp, #44]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r5, [r0, #1]
+; DEFAULT-NEXT:    ldrb r1, [sp, #40]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r3, [r0]
 ; DEFAULT-NEXT:    pop {r4, r5, r11, pc}
 ;
 ; THUMB1-LABEL: ct_v8i8:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
 ; THUMB1-NEXT:    movs r4, #1
 ; THUMB1-NEXT:    ands r4, r1
-; THUMB1-NEXT:    subs r1, r4, #1
-; THUMB1-NEXT:    ldr r5, [sp, #68]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    rsbs r4, r4, #0
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #7]
-; THUMB1-NEXT:    ldr r5, [sp, #64]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #32]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #6]
-; THUMB1-NEXT:    ldr r5, [sp, #60]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #28]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #5]
-; THUMB1-NEXT:    ldr r5, [sp, #56]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #24]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #4]
-; THUMB1-NEXT:    ldr r5, [sp, #52]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #20]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #3]
-; THUMB1-NEXT:    ldr r5, [sp, #48]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #16]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #2]
+; THUMB1-NEXT:    ldr r1, [sp, #76]
 ; THUMB1-NEXT:    ldr r5, [sp, #44]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    orrs r3, r5
-; THUMB1-NEXT:    strb r3, [r0, #1]
-; THUMB1-NEXT:    ldr r3, [sp, #40]
-; THUMB1-NEXT:    ands r3, r1
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    strb r2, [r0]
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #7]
+; THUMB1-NEXT:    ldr r1, [sp, #72]
+; THUMB1-NEXT:    ldr r5, [sp, #40]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #6]
+; THUMB1-NEXT:    ldr r1, [sp, #68]
+; THUMB1-NEXT:    ldr r5, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #5]
+; THUMB1-NEXT:    ldr r1, [sp, #64]
+; THUMB1-NEXT:    ldr r5, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #4]
+; THUMB1-NEXT:    ldr r1, [sp, #60]
+; THUMB1-NEXT:    ldr r5, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #3]
+; THUMB1-NEXT:    ldr r1, [sp, #56]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #2]
+; THUMB1-NEXT:    ldr r1, [sp, #52]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r5, [r0, #1]
+; THUMB1-NEXT:    ldr r1, [sp, #48]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r3, [r0]
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v8i8:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r4, r5, r7, lr}
 ; THUMB2-NEXT:    push {r4, r5, r7, lr}
 ; THUMB2-NEXT:    and lr, r1, #1
-; THUMB2-NEXT:    ldrb.w r1, [sp, #68]
-; THUMB2-NEXT:    sub.w r12, lr, #1
-; THUMB2-NEXT:    ldrb.w r4, [sp, #36]
-; THUMB2-NEXT:    and.w r5, r1, r12
+; THUMB2-NEXT:    ldrb.w r12, [sp, #68]
+; THUMB2-NEXT:    ldrb.w r1, [sp, #36]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r4, r1, r5
+; THUMB2-NEXT:    bic.w r5, r12, r5
+; THUMB2-NEXT:    orrs r4, r5
+; THUMB2-NEXT:    strb r4, [r0, #7]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #64]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #32]
 ; THUMB2-NEXT:    rsb.w r1, lr, #0
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r3, r1
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #6]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #60]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #28]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #5]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #56]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #24]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #4]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #52]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #20]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #3]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #48]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #16]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #2]
+; THUMB2-NEXT:    ldrb.w r1, [sp, #44]
+; THUMB2-NEXT:    rsb.w r4, lr, #0
+; THUMB2-NEXT:    and.w r5, r3, r4
+; THUMB2-NEXT:    bic.w r4, r1, r4
 ; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #32]
-; THUMB2-NEXT:    strb r5, [r0, #7]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #64]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #28]
-; THUMB2-NEXT:    strb r5, [r0, #6]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #60]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #24]
-; THUMB2-NEXT:    strb r5, [r0, #5]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #56]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #20]
-; THUMB2-NEXT:    strb r5, [r0, #4]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #52]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #16]
-; THUMB2-NEXT:    strb r5, [r0, #3]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #48]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r1, r2
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    strb r5, [r0, #2]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #44]
-; THUMB2-NEXT:    and.w r5, r5, r12
+; THUMB2-NEXT:    strb r5, [r0, #1]
+; THUMB2-NEXT:    ldrb.w r1, [sp, #40]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r3, r2, r5
+; THUMB2-NEXT:    bic.w r5, r1, r5
 ; THUMB2-NEXT:    orrs r3, r5
-; THUMB2-NEXT:    strb r3, [r0, #1]
-; THUMB2-NEXT:    ldrb.w r3, [sp, #40]
-; THUMB2-NEXT:    and.w r3, r3, r12
-; THUMB2-NEXT:    orrs r1, r3
-; THUMB2-NEXT:    strb r1, [r0]
+; THUMB2-NEXT:    strb r3, [r0]
 ; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <8 x i8> @llvm.ct.select.v8i8(i1 %cond, <8 x i8> %a, <8 x i8> %b)
@@ -193,94 +162,75 @@
 ; CT-NEXT:    vldr d16, [sp]
 ; CT-NEXT:    vmov d17, r2, r3
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 d19, r1
-; CT-NEXT:    vand d18, d17, d19
-; CT-NEXT:    vbic d19, d16, d19
-; CT-NEXT:    vorr d18, d18, d19
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d18
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v4i16:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    ldrh r1, [sp, #16]
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    rsb lr, r0, #0
-; DEFAULT-NEXT:    and r0, r2, lr
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r0, r0, r1
-; DEFAULT-NEXT:    ldrh r1, [sp, #20]
-; DEFAULT-NEXT:    and r2, r3, lr
-; DEFAULT-NEXT:    ldrh r3, [sp, #8]
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r1, r2, r1
-; DEFAULT-NEXT:    ldrh r2, [sp, #24]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r2, r3, r2
-; DEFAULT-NEXT:    ldrh r3, [sp, #28]
-; DEFAULT-NEXT:    and r12, r3, r12
-; DEFAULT-NEXT:    ldrh r3, [sp, #12]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    orr r3, r3, r12
-; DEFAULT-NEXT:    pop {r11, pc}
+; DEFAULT-NEXT:    push {r4, r5, r11, lr}
+; DEFAULT-NEXT:    and r12, r0, #1
+; DEFAULT-NEXT:    ldrh r1, [sp, #24]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldrh r2, [sp, #28]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldrh r3, [sp, #16]
+; DEFAULT-NEXT:    ldrh lr, [sp, #32]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldrh lr, [sp, #36]
+; DEFAULT-NEXT:    ldrh r4, [sp, #20]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    pop {r4, r5, r11, pc}
 ;
 ; THUMB1-LABEL: ct_v4i16:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #24]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r5, r1, #0
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r1, [sp, #28]
-; THUMB1-NEXT:    ands r1, r4
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r1, r3
-; THUMB1-NEXT:    ldr r3, [sp, #32]
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    ldr r2, [sp, #16]
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    ldr r3, [sp, #20]
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r3, r6
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r3, [sp, #40]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #44]
+; THUMB1-NEXT:    ldr r6, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v4i16:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    .save {r7, lr}
-; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    ldrh.w r1, [sp, #16]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    rsb.w lr, r0, #0
+; THUMB2-NEXT:    .save {r4, r5, r7, lr}
+; THUMB2-NEXT:    push {r4, r5, r7, lr}
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    ldrh.w r1, [sp, #24]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
 ; THUMB2-NEXT:    and.w r0, r2, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r0, r1
-; THUMB2-NEXT:    ldrh.w r1, [sp, #20]
-; THUMB2-NEXT:    and.w r2, r3, lr
-; THUMB2-NEXT:    ldrh.w r3, [sp, #8]
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
-; THUMB2-NEXT:    ldrh.w r2, [sp, #24]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r2, r3
-; THUMB2-NEXT:    ldrh.w r3, [sp, #28]
-; THUMB2-NEXT:    and.w r12, r12, r3
-; THUMB2-NEXT:    ldrh.w r3, [sp, #12]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    orr.w r3, r3, r12
-; THUMB2-NEXT:    pop {r7, pc}
+; THUMB2-NEXT:    bic.w lr, r1, lr
+; THUMB2-NEXT:    orr.w r0, r0, lr
+; THUMB2-NEXT:    ldrh.w r2, [sp, #28]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
+; THUMB2-NEXT:    ldrh.w r3, [sp, #16]
+; THUMB2-NEXT:    ldrh.w lr, [sp, #32]
+; THUMB2-NEXT:    rsb.w r4, r12, #0
+; THUMB2-NEXT:    and.w r2, r3, r4
+; THUMB2-NEXT:    bic.w r4, lr, r4
+; THUMB2-NEXT:    orrs r2, r4
+; THUMB2-NEXT:    ldrh.w lr, [sp, #36]
+; THUMB2-NEXT:    ldrh.w r4, [sp, #20]
+; THUMB2-NEXT:    rsb.w r5, r12, #0
+; THUMB2-NEXT:    and.w r3, r4, r5
+; THUMB2-NEXT:    bic.w r5, lr, r5
+; THUMB2-NEXT:    orrs r3, r5
+; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <4 x i16> @llvm.ct.select.v4i16(i1 %cond, <4 x i16> %a, <4 x i16> %b)
   ret <4 x i16> %sel
@@ -292,63 +242,47 @@
 ; CT-NEXT:    vldr d16, [sp]
 ; CT-NEXT:    vmov d17, r2, r3
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 d19, r1
-; CT-NEXT:    vand d18, d17, d19
-; CT-NEXT:    vbic d19, d16, d19
-; CT-NEXT:    vorr d18, d18, d19
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d18
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v2i32:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
+; DEFAULT-NEXT:    and r12, r0, #1
 ; DEFAULT-NEXT:    ldr r1, [sp, #8]
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    and lr, r1, r12
-; DEFAULT-NEXT:    rsb r1, r0, #0
-; DEFAULT-NEXT:    and r0, r2, r1
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    ldr r2, [sp, #12]
-; DEFAULT-NEXT:    and r1, r3, r1
-; DEFAULT-NEXT:    orr r0, r0, lr
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r1, r1, r2
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    pop {r11, pc}
 ;
 ; THUMB1-LABEL: ct_v2i32:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, lr}
-; THUMB1-NEXT:    push {r4, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #8]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r1, r1, #0
-; THUMB1-NEXT:    ands r2, r1
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r2, [sp, #12]
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    ands r1, r3
-; THUMB1-NEXT:    orrs r1, r2
-; THUMB1-NEXT:    pop {r4, pc}
+; THUMB1-NEXT:    .save {r4, r5, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r7, lr}
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #16]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #20]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    pop {r4, r5, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v2i32:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r7, lr}
 ; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
+; THUMB2-NEXT:    and r12, r0, #1
 ; THUMB2-NEXT:    ldr r1, [sp, #8]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    and.w lr, r1, r12
-; THUMB2-NEXT:    rsbs r1, r0, #0
-; THUMB2-NEXT:    and.w r0, r2, r1
-; THUMB2-NEXT:    ldr r2, [sp, #12]
-; THUMB2-NEXT:    ands r1, r3
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r0, r2, lr
+; THUMB2-NEXT:    bic.w lr, r1, lr
 ; THUMB2-NEXT:    orr.w r0, r0, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r1, r2
+; THUMB2-NEXT:    ldr r2, [sp, #12]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
 ; THUMB2-NEXT:    pop {r7, pc}
 entry:
   %sel = call <2 x i32> @llvm.ct.select.v2i32(i1 %cond, <2 x i32> %a, <2 x i32> %b)
@@ -361,63 +295,47 @@
 ; CT-NEXT:    vldr d16, [sp]
 ; CT-NEXT:    vmov d17, r2, r3
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 d19, r1
-; CT-NEXT:    vand d18, d17, d19
-; CT-NEXT:    vbic d19, d16, d19
-; CT-NEXT:    vorr d18, d18, d19
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d18
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v1i64:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
+; DEFAULT-NEXT:    and r12, r0, #1
 ; DEFAULT-NEXT:    ldr r1, [sp, #8]
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    and lr, r1, r12
-; DEFAULT-NEXT:    rsb r1, r0, #0
-; DEFAULT-NEXT:    and r0, r2, r1
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    ldr r2, [sp, #12]
-; DEFAULT-NEXT:    and r1, r3, r1
-; DEFAULT-NEXT:    orr r0, r0, lr
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r1, r1, r2
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    pop {r11, pc}
 ;
 ; THUMB1-LABEL: ct_v1i64:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, lr}
-; THUMB1-NEXT:    push {r4, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #8]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r1, r1, #0
-; THUMB1-NEXT:    ands r2, r1
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r2, [sp, #12]
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    ands r1, r3
-; THUMB1-NEXT:    orrs r1, r2
-; THUMB1-NEXT:    pop {r4, pc}
+; THUMB1-NEXT:    .save {r4, r5, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r7, lr}
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #16]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #20]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    pop {r4, r5, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v1i64:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r7, lr}
 ; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
+; THUMB2-NEXT:    and r12, r0, #1
 ; THUMB2-NEXT:    ldr r1, [sp, #8]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    and.w lr, r1, r12
-; THUMB2-NEXT:    rsbs r1, r0, #0
-; THUMB2-NEXT:    and.w r0, r2, r1
-; THUMB2-NEXT:    ldr r2, [sp, #12]
-; THUMB2-NEXT:    ands r1, r3
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r0, r2, lr
+; THUMB2-NEXT:    bic.w lr, r1, lr
 ; THUMB2-NEXT:    orr.w r0, r0, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r1, r2
+; THUMB2-NEXT:    ldr r2, [sp, #12]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
 ; THUMB2-NEXT:    pop {r7, pc}
 entry:
   %sel = call <1 x i64> @llvm.ct.select.v1i64(i1 %cond, <1 x i64> %a, <1 x i64> %b)
@@ -430,63 +348,47 @@
 ; CT-NEXT:    vldr d16, [sp]
 ; CT-NEXT:    vmov d17, r2, r3
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 d19, r1
-; CT-NEXT:    vand d18, d17, d19
-; CT-NEXT:    vbic d19, d16, d19
-; CT-NEXT:    vorr d18, d18, d19
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d18
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v2f32:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
+; DEFAULT-NEXT:    and r12, r0, #1
 ; DEFAULT-NEXT:    ldr r1, [sp, #8]
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    and lr, r1, r12
-; DEFAULT-NEXT:    rsb r1, r0, #0
-; DEFAULT-NEXT:    and r0, r2, r1
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    ldr r2, [sp, #12]
-; DEFAULT-NEXT:    and r1, r3, r1
-; DEFAULT-NEXT:    orr r0, r0, lr
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r1, r1, r2
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    pop {r11, pc}
 ;
 ; THUMB1-LABEL: ct_v2f32:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, lr}
-; THUMB1-NEXT:    push {r4, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #8]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r1, r1, #0
-; THUMB1-NEXT:    ands r2, r1
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r2, [sp, #12]
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    ands r1, r3
-; THUMB1-NEXT:    orrs r1, r2
-; THUMB1-NEXT:    pop {r4, pc}
+; THUMB1-NEXT:    .save {r4, r5, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r7, lr}
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #16]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #20]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    pop {r4, r5, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v2f32:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r7, lr}
 ; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
+; THUMB2-NEXT:    and r12, r0, #1
 ; THUMB2-NEXT:    ldr r1, [sp, #8]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    and.w lr, r1, r12
-; THUMB2-NEXT:    rsbs r1, r0, #0
-; THUMB2-NEXT:    and.w r0, r2, r1
-; THUMB2-NEXT:    ldr r2, [sp, #12]
-; THUMB2-NEXT:    ands r1, r3
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r0, r2, lr
+; THUMB2-NEXT:    bic.w lr, r1, lr
 ; THUMB2-NEXT:    orr.w r0, r0, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r1, r2
+; THUMB2-NEXT:    ldr r2, [sp, #12]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
 ; THUMB2-NEXT:    pop {r7, pc}
 entry:
   %sel = call <2 x float> @llvm.ct.select.v2f32(i1 %cond, <2 x float> %a, <2 x float> %b)
@@ -501,11 +403,7 @@
 ; CT-NEXT:    vmov d16, r2, r3
 ; CT-NEXT:    vld1.64 {d18, d19}, [r1]
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 q11, r1
-; CT-NEXT:    vand q10, q8, q11
-; CT-NEXT:    vbic q11, q9, q11
-; CT-NEXT:    vorr q10, q10, q11
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d20
 ; CT-NEXT:    vmov r2, r3, d21
 ; CT-NEXT:    bx lr
@@ -514,309 +412,258 @@
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    push {r4, r5, r11, lr}
 ; DEFAULT-NEXT:    and lr, r1, #1
-; DEFAULT-NEXT:    ldrb r1, [sp, #132]
-; DEFAULT-NEXT:    sub r12, lr, #1
-; DEFAULT-NEXT:    ldrb r4, [sp, #68]
-; DEFAULT-NEXT:    and r5, r1, r12
-; DEFAULT-NEXT:    rsb r1, lr, #0
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r3, r3, r1
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #64]
-; DEFAULT-NEXT:    strb r5, [r0, #15]
-; DEFAULT-NEXT:    ldrb r5, [sp, #128]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #60]
-; DEFAULT-NEXT:    strb r5, [r0, #14]
-; DEFAULT-NEXT:    ldrb r5, [sp, #124]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #56]
-; DEFAULT-NEXT:    strb r5, [r0, #13]
-; DEFAULT-NEXT:    ldrb r5, [sp, #120]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #52]
-; DEFAULT-NEXT:    strb r5, [r0, #12]
-; DEFAULT-NEXT:    ldrb r5, [sp, #116]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #48]
-; DEFAULT-NEXT:    strb r5, [r0, #11]
-; DEFAULT-NEXT:    ldrb r5, [sp, #112]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #44]
-; DEFAULT-NEXT:    strb r5, [r0, #10]
-; DEFAULT-NEXT:    ldrb r5, [sp, #108]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #40]
-; DEFAULT-NEXT:    strb r5, [r0, #9]
-; DEFAULT-NEXT:    ldrb r5, [sp, #104]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #36]
-; DEFAULT-NEXT:    strb r5, [r0, #8]
-; DEFAULT-NEXT:    ldrb r5, [sp, #100]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #32]
-; DEFAULT-NEXT:    strb r5, [r0, #7]
-; DEFAULT-NEXT:    ldrb r5, [sp, #96]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #28]
-; DEFAULT-NEXT:    strb r5, [r0, #6]
-; DEFAULT-NEXT:    ldrb r5, [sp, #92]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #24]
-; DEFAULT-NEXT:    strb r5, [r0, #5]
-; DEFAULT-NEXT:    ldrb r5, [sp, #88]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #20]
-; DEFAULT-NEXT:    strb r5, [r0, #4]
-; DEFAULT-NEXT:    ldrb r5, [sp, #84]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrb r4, [sp, #16]
-; DEFAULT-NEXT:    strb r5, [r0, #3]
-; DEFAULT-NEXT:    ldrb r5, [sp, #80]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r1, r2, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    strb r5, [r0, #2]
-; DEFAULT-NEXT:    ldrb r5, [sp, #76]
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r3, r3, r5
-; DEFAULT-NEXT:    strb r3, [r0, #1]
-; DEFAULT-NEXT:    ldrb r3, [sp, #72]
-; DEFAULT-NEXT:    and r3, r3, r12
-; DEFAULT-NEXT:    orr r1, r1, r3
-; DEFAULT-NEXT:    strb r1, [r0]
+; DEFAULT-NEXT:    ldrb r12, [sp, #132]
+; DEFAULT-NEXT:    ldrb r1, [sp, #68]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #15]
+; DEFAULT-NEXT:    ldrb r12, [sp, #128]
+; DEFAULT-NEXT:    ldrb r5, [sp, #64]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #14]
+; DEFAULT-NEXT:    ldrb r12, [sp, #124]
+; DEFAULT-NEXT:    ldrb r5, [sp, #60]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #13]
+; DEFAULT-NEXT:    ldrb r12, [sp, #120]
+; DEFAULT-NEXT:    ldrb r5, [sp, #56]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #12]
+; DEFAULT-NEXT:    ldrb r12, [sp, #116]
+; DEFAULT-NEXT:    ldrb r5, [sp, #52]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #11]
+; DEFAULT-NEXT:    ldrb r12, [sp, #112]
+; DEFAULT-NEXT:    ldrb r5, [sp, #48]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #10]
+; DEFAULT-NEXT:    ldrb r12, [sp, #108]
+; DEFAULT-NEXT:    ldrb r5, [sp, #44]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #9]
+; DEFAULT-NEXT:    ldrb r12, [sp, #104]
+; DEFAULT-NEXT:    ldrb r5, [sp, #40]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #8]
+; DEFAULT-NEXT:    ldrb r12, [sp, #100]
+; DEFAULT-NEXT:    ldrb r5, [sp, #36]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #7]
+; DEFAULT-NEXT:    ldrb r12, [sp, #96]
+; DEFAULT-NEXT:    ldrb r5, [sp, #32]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #6]
+; DEFAULT-NEXT:    ldrb r12, [sp, #92]
+; DEFAULT-NEXT:    ldrb r5, [sp, #28]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #5]
+; DEFAULT-NEXT:    ldrb r12, [sp, #88]
+; DEFAULT-NEXT:    ldrb r5, [sp, #24]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #4]
+; DEFAULT-NEXT:    ldrb r12, [sp, #84]
+; DEFAULT-NEXT:    ldrb r5, [sp, #20]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #3]
+; DEFAULT-NEXT:    ldrb r12, [sp, #80]
+; DEFAULT-NEXT:    ldrb r5, [sp, #16]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r4, [r0, #2]
+; DEFAULT-NEXT:    ldrb r1, [sp, #76]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r5, [r0, #1]
+; DEFAULT-NEXT:    ldrb r1, [sp, #72]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strb r3, [r0]
 ; DEFAULT-NEXT:    pop {r4, r5, r11, pc}
 ;
 ; THUMB1-LABEL: ct_v16i8:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
 ; THUMB1-NEXT:    movs r4, #1
 ; THUMB1-NEXT:    ands r4, r1
-; THUMB1-NEXT:    subs r1, r4, #1
-; THUMB1-NEXT:    ldr r5, [sp, #132]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    rsbs r4, r4, #0
-; THUMB1-NEXT:    ldr r6, [sp, #68]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #15]
-; THUMB1-NEXT:    ldr r5, [sp, #128]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #64]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #14]
-; THUMB1-NEXT:    ldr r5, [sp, #124]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #60]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #13]
-; THUMB1-NEXT:    ldr r5, [sp, #120]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #56]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #12]
-; THUMB1-NEXT:    ldr r5, [sp, #116]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #52]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #11]
-; THUMB1-NEXT:    ldr r5, [sp, #112]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #48]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #10]
-; THUMB1-NEXT:    ldr r5, [sp, #108]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #44]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #9]
-; THUMB1-NEXT:    ldr r5, [sp, #104]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #40]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #8]
-; THUMB1-NEXT:    ldr r5, [sp, #100]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #7]
-; THUMB1-NEXT:    ldr r5, [sp, #96]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #32]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #6]
-; THUMB1-NEXT:    ldr r5, [sp, #92]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #28]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #5]
-; THUMB1-NEXT:    ldr r5, [sp, #88]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #24]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #4]
-; THUMB1-NEXT:    ldr r5, [sp, #84]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #20]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #3]
-; THUMB1-NEXT:    ldr r5, [sp, #80]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #16]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strb r6, [r0, #2]
+; THUMB1-NEXT:    ldr r1, [sp, #140]
 ; THUMB1-NEXT:    ldr r5, [sp, #76]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    orrs r3, r5
-; THUMB1-NEXT:    strb r3, [r0, #1]
-; THUMB1-NEXT:    ldr r3, [sp, #72]
-; THUMB1-NEXT:    ands r3, r1
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    strb r2, [r0]
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #15]
+; THUMB1-NEXT:    ldr r1, [sp, #136]
+; THUMB1-NEXT:    ldr r5, [sp, #72]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #14]
+; THUMB1-NEXT:    ldr r1, [sp, #132]
+; THUMB1-NEXT:    ldr r5, [sp, #68]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #13]
+; THUMB1-NEXT:    ldr r1, [sp, #128]
+; THUMB1-NEXT:    ldr r5, [sp, #64]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #12]
+; THUMB1-NEXT:    ldr r1, [sp, #124]
+; THUMB1-NEXT:    ldr r5, [sp, #60]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #11]
+; THUMB1-NEXT:    ldr r1, [sp, #120]
+; THUMB1-NEXT:    ldr r5, [sp, #56]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #10]
+; THUMB1-NEXT:    ldr r1, [sp, #116]
+; THUMB1-NEXT:    ldr r5, [sp, #52]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #9]
+; THUMB1-NEXT:    ldr r1, [sp, #112]
+; THUMB1-NEXT:    ldr r5, [sp, #48]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #8]
+; THUMB1-NEXT:    ldr r1, [sp, #108]
+; THUMB1-NEXT:    ldr r5, [sp, #44]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #7]
+; THUMB1-NEXT:    ldr r1, [sp, #104]
+; THUMB1-NEXT:    ldr r5, [sp, #40]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #6]
+; THUMB1-NEXT:    ldr r1, [sp, #100]
+; THUMB1-NEXT:    ldr r5, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #5]
+; THUMB1-NEXT:    ldr r1, [sp, #96]
+; THUMB1-NEXT:    ldr r5, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #4]
+; THUMB1-NEXT:    ldr r1, [sp, #92]
+; THUMB1-NEXT:    ldr r5, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #3]
+; THUMB1-NEXT:    ldr r1, [sp, #88]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r6, [r0, #2]
+; THUMB1-NEXT:    ldr r1, [sp, #84]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r5, [r0, #1]
+; THUMB1-NEXT:    ldr r1, [sp, #80]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strb r3, [r0]
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v16i8:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r4, r5, r7, lr}
 ; THUMB2-NEXT:    push {r4, r5, r7, lr}
 ; THUMB2-NEXT:    and lr, r1, #1
-; THUMB2-NEXT:    ldrb.w r1, [sp, #132]
-; THUMB2-NEXT:    sub.w r12, lr, #1
-; THUMB2-NEXT:    ldrb.w r4, [sp, #68]
-; THUMB2-NEXT:    and.w r5, r1, r12
+; THUMB2-NEXT:    ldrb.w r12, [sp, #132]
+; THUMB2-NEXT:    ldrb.w r1, [sp, #68]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r4, r1, r5
+; THUMB2-NEXT:    bic.w r5, r12, r5
+; THUMB2-NEXT:    orrs r4, r5
+; THUMB2-NEXT:    strb r4, [r0, #15]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #128]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #64]
 ; THUMB2-NEXT:    rsb.w r1, lr, #0
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r3, r1
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #14]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #124]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #60]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #13]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #120]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #56]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #12]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #116]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #52]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #11]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #112]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #48]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #10]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #108]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #44]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #9]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #104]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #40]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #8]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #100]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #36]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #7]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #96]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #32]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #6]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #92]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #28]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #5]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #88]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #24]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #4]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #84]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #20]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #3]
+; THUMB2-NEXT:    ldrb.w r12, [sp, #80]
+; THUMB2-NEXT:    ldrb.w r5, [sp, #16]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strb r4, [r0, #2]
+; THUMB2-NEXT:    ldrb.w r1, [sp, #76]
+; THUMB2-NEXT:    rsb.w r4, lr, #0
+; THUMB2-NEXT:    and.w r5, r3, r4
+; THUMB2-NEXT:    bic.w r4, r1, r4
 ; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #64]
-; THUMB2-NEXT:    strb r5, [r0, #15]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #128]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #60]
-; THUMB2-NEXT:    strb r5, [r0, #14]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #124]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #56]
-; THUMB2-NEXT:    strb r5, [r0, #13]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #120]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #52]
-; THUMB2-NEXT:    strb r5, [r0, #12]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #116]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #48]
-; THUMB2-NEXT:    strb r5, [r0, #11]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #112]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #44]
-; THUMB2-NEXT:    strb r5, [r0, #10]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #108]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #40]
-; THUMB2-NEXT:    strb r5, [r0, #9]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #104]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #36]
-; THUMB2-NEXT:    strb r5, [r0, #8]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #100]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #32]
-; THUMB2-NEXT:    strb r5, [r0, #7]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #96]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #28]
-; THUMB2-NEXT:    strb r5, [r0, #6]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #92]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #24]
-; THUMB2-NEXT:    strb r5, [r0, #5]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #88]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #20]
-; THUMB2-NEXT:    strb r5, [r0, #4]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #84]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrb.w r4, [sp, #16]
-; THUMB2-NEXT:    strb r5, [r0, #3]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #80]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r1, r2
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    strb r5, [r0, #2]
-; THUMB2-NEXT:    ldrb.w r5, [sp, #76]
-; THUMB2-NEXT:    and.w r5, r5, r12
+; THUMB2-NEXT:    strb r5, [r0, #1]
+; THUMB2-NEXT:    ldrb.w r1, [sp, #72]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r3, r2, r5
+; THUMB2-NEXT:    bic.w r5, r1, r5
 ; THUMB2-NEXT:    orrs r3, r5
-; THUMB2-NEXT:    strb r3, [r0, #1]
-; THUMB2-NEXT:    ldrb.w r3, [sp, #72]
-; THUMB2-NEXT:    and.w r3, r3, r12
-; THUMB2-NEXT:    orrs r1, r3
-; THUMB2-NEXT:    strb r1, [r0]
+; THUMB2-NEXT:    strb r3, [r0]
 ; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <16 x i8> @llvm.ct.select.v16i8(i1 %cond, <16 x i8> %a, <16 x i8> %b)
@@ -831,11 +678,7 @@
 ; CT-NEXT:    vmov d16, r2, r3
 ; CT-NEXT:    vld1.64 {d18, d19}, [r1]
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 q11, r1
-; CT-NEXT:    vand q10, q8, q11
-; CT-NEXT:    vbic q11, q9, q11
-; CT-NEXT:    vorr q10, q10, q11
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d20
 ; CT-NEXT:    vmov r2, r3, d21
 ; CT-NEXT:    bx lr
@@ -844,165 +687,138 @@
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    push {r4, r5, r11, lr}
 ; DEFAULT-NEXT:    and lr, r1, #1
-; DEFAULT-NEXT:    ldrh r1, [sp, #68]
-; DEFAULT-NEXT:    sub r12, lr, #1
-; DEFAULT-NEXT:    ldrh r4, [sp, #36]
-; DEFAULT-NEXT:    and r5, r1, r12
-; DEFAULT-NEXT:    rsb r1, lr, #0
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r3, r3, r1
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrh r4, [sp, #32]
-; DEFAULT-NEXT:    strh r5, [r0, #14]
-; DEFAULT-NEXT:    ldrh r5, [sp, #64]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrh r4, [sp, #28]
-; DEFAULT-NEXT:    strh r5, [r0, #12]
-; DEFAULT-NEXT:    ldrh r5, [sp, #60]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrh r4, [sp, #24]
-; DEFAULT-NEXT:    strh r5, [r0, #10]
-; DEFAULT-NEXT:    ldrh r5, [sp, #56]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrh r4, [sp, #20]
-; DEFAULT-NEXT:    strh r5, [r0, #8]
-; DEFAULT-NEXT:    ldrh r5, [sp, #52]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    ldrh r4, [sp, #16]
-; DEFAULT-NEXT:    strh r5, [r0, #6]
-; DEFAULT-NEXT:    ldrh r5, [sp, #48]
-; DEFAULT-NEXT:    and r4, r4, r1
-; DEFAULT-NEXT:    and r1, r2, r1
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r5, r4, r5
-; DEFAULT-NEXT:    strh r5, [r0, #4]
-; DEFAULT-NEXT:    ldrh r5, [sp, #44]
-; DEFAULT-NEXT:    and r5, r5, r12
-; DEFAULT-NEXT:    orr r3, r3, r5
-; DEFAULT-NEXT:    strh r3, [r0, #2]
-; DEFAULT-NEXT:    ldrh r3, [sp, #40]
-; DEFAULT-NEXT:    and r3, r3, r12
-; DEFAULT-NEXT:    orr r1, r1, r3
-; DEFAULT-NEXT:    strh r1, [r0]
+; DEFAULT-NEXT:    ldrh r12, [sp, #68]
+; DEFAULT-NEXT:    ldrh r1, [sp, #36]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strh r4, [r0, #14]
+; DEFAULT-NEXT:    ldrh r12, [sp, #64]
+; DEFAULT-NEXT:    ldrh r5, [sp, #32]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strh r4, [r0, #12]
+; DEFAULT-NEXT:    ldrh r12, [sp, #60]
+; DEFAULT-NEXT:    ldrh r5, [sp, #28]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strh r4, [r0, #10]
+; DEFAULT-NEXT:    ldrh r12, [sp, #56]
+; DEFAULT-NEXT:    ldrh r5, [sp, #24]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strh r4, [r0, #8]
+; DEFAULT-NEXT:    ldrh r12, [sp, #52]
+; DEFAULT-NEXT:    ldrh r5, [sp, #20]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strh r4, [r0, #6]
+; DEFAULT-NEXT:    ldrh r12, [sp, #48]
+; DEFAULT-NEXT:    ldrh r5, [sp, #16]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strh r4, [r0, #4]
+; DEFAULT-NEXT:    ldrh r1, [sp, #44]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strh r5, [r0, #2]
+; DEFAULT-NEXT:    ldrh r1, [sp, #40]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    strh r3, [r0]
 ; DEFAULT-NEXT:    pop {r4, r5, r11, pc}
 ;
 ; THUMB1-LABEL: ct_v8i16:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
 ; THUMB1-NEXT:    movs r4, #1
 ; THUMB1-NEXT:    ands r4, r1
-; THUMB1-NEXT:    subs r1, r4, #1
-; THUMB1-NEXT:    ldr r5, [sp, #68]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    rsbs r4, r4, #0
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #14]
-; THUMB1-NEXT:    ldr r5, [sp, #64]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #32]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #12]
-; THUMB1-NEXT:    ldr r5, [sp, #60]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #28]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #10]
-; THUMB1-NEXT:    ldr r5, [sp, #56]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #24]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #8]
-; THUMB1-NEXT:    ldr r5, [sp, #52]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #20]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #6]
-; THUMB1-NEXT:    ldr r5, [sp, #48]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ldr r6, [sp, #16]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    orrs r6, r5
-; THUMB1-NEXT:    strh r6, [r0, #4]
+; THUMB1-NEXT:    ldr r1, [sp, #76]
 ; THUMB1-NEXT:    ldr r5, [sp, #44]
-; THUMB1-NEXT:    ands r5, r1
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    orrs r3, r5
-; THUMB1-NEXT:    strh r3, [r0, #2]
-; THUMB1-NEXT:    ldr r3, [sp, #40]
-; THUMB1-NEXT:    ands r3, r1
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    strh r2, [r0]
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #14]
+; THUMB1-NEXT:    ldr r1, [sp, #72]
+; THUMB1-NEXT:    ldr r5, [sp, #40]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #12]
+; THUMB1-NEXT:    ldr r1, [sp, #68]
+; THUMB1-NEXT:    ldr r5, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #10]
+; THUMB1-NEXT:    ldr r1, [sp, #64]
+; THUMB1-NEXT:    ldr r5, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #8]
+; THUMB1-NEXT:    ldr r1, [sp, #60]
+; THUMB1-NEXT:    ldr r5, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #6]
+; THUMB1-NEXT:    ldr r1, [sp, #56]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r6, [r0, #4]
+; THUMB1-NEXT:    ldr r1, [sp, #52]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r5, [r0, #2]
+; THUMB1-NEXT:    ldr r1, [sp, #48]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    strh r3, [r0]
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v8i16:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r4, r5, r7, lr}
 ; THUMB2-NEXT:    push {r4, r5, r7, lr}
 ; THUMB2-NEXT:    and lr, r1, #1
-; THUMB2-NEXT:    ldrh.w r1, [sp, #68]
-; THUMB2-NEXT:    sub.w r12, lr, #1
-; THUMB2-NEXT:    ldrh.w r4, [sp, #36]
-; THUMB2-NEXT:    and.w r5, r1, r12
+; THUMB2-NEXT:    ldrh.w r12, [sp, #68]
+; THUMB2-NEXT:    ldrh.w r1, [sp, #36]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r4, r1, r5
+; THUMB2-NEXT:    bic.w r5, r12, r5
+; THUMB2-NEXT:    orrs r4, r5
+; THUMB2-NEXT:    strh r4, [r0, #14]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #64]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #32]
 ; THUMB2-NEXT:    rsb.w r1, lr, #0
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r3, r1
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #12]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #60]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #28]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #10]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #56]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #24]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #8]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #52]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #20]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #6]
+; THUMB2-NEXT:    ldrh.w r12, [sp, #48]
+; THUMB2-NEXT:    ldrh.w r5, [sp, #16]
+; THUMB2-NEXT:    rsb.w r1, lr, #0
+; THUMB2-NEXT:    and.w r4, r5, r1
+; THUMB2-NEXT:    bic.w r1, r12, r1
+; THUMB2-NEXT:    orrs r4, r1
+; THUMB2-NEXT:    strh r4, [r0, #4]
+; THUMB2-NEXT:    ldrh.w r1, [sp, #44]
+; THUMB2-NEXT:    rsb.w r4, lr, #0
+; THUMB2-NEXT:    and.w r5, r3, r4
+; THUMB2-NEXT:    bic.w r4, r1, r4
 ; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #32]
-; THUMB2-NEXT:    strh r5, [r0, #14]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #64]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #28]
-; THUMB2-NEXT:    strh r5, [r0, #12]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #60]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #24]
-; THUMB2-NEXT:    strh r5, [r0, #10]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #56]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #20]
-; THUMB2-NEXT:    strh r5, [r0, #8]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #52]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    ldrh.w r4, [sp, #16]
-; THUMB2-NEXT:    strh r5, [r0, #6]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #48]
-; THUMB2-NEXT:    ands r4, r1
-; THUMB2-NEXT:    ands r1, r2
-; THUMB2-NEXT:    and.w r5, r5, r12
-; THUMB2-NEXT:    orrs r5, r4
-; THUMB2-NEXT:    strh r5, [r0, #4]
-; THUMB2-NEXT:    ldrh.w r5, [sp, #44]
-; THUMB2-NEXT:    and.w r5, r5, r12
+; THUMB2-NEXT:    strh r5, [r0, #2]
+; THUMB2-NEXT:    ldrh.w r1, [sp, #40]
+; THUMB2-NEXT:    rsb.w r5, lr, #0
+; THUMB2-NEXT:    and.w r3, r2, r5
+; THUMB2-NEXT:    bic.w r5, r1, r5
 ; THUMB2-NEXT:    orrs r3, r5
-; THUMB2-NEXT:    strh r3, [r0, #2]
-; THUMB2-NEXT:    ldrh.w r3, [sp, #40]
-; THUMB2-NEXT:    and.w r3, r3, r12
-; THUMB2-NEXT:    orrs r1, r3
-; THUMB2-NEXT:    strh r1, [r0]
+; THUMB2-NEXT:    strh r3, [r0]
 ; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <8 x i16> @llvm.ct.select.v8i16(i1 %cond, <8 x i16> %a, <8 x i16> %b)
@@ -1017,95 +833,76 @@
 ; CT-NEXT:    vmov d16, r2, r3
 ; CT-NEXT:    vld1.64 {d18, d19}, [r1]
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 q11, r1
-; CT-NEXT:    vand q10, q8, q11
-; CT-NEXT:    vbic q11, q9, q11
-; CT-NEXT:    vorr q10, q10, q11
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d20
 ; CT-NEXT:    vmov r2, r3, d21
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v4i32:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    ldr r1, [sp, #16]
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    rsb lr, r0, #0
-; DEFAULT-NEXT:    and r0, r2, lr
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r0, r0, r1
-; DEFAULT-NEXT:    ldr r1, [sp, #20]
-; DEFAULT-NEXT:    and r2, r3, lr
-; DEFAULT-NEXT:    ldr r3, [sp, #8]
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r1, r2, r1
-; DEFAULT-NEXT:    ldr r2, [sp, #24]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r2, r3, r2
-; DEFAULT-NEXT:    ldr r3, [sp, #28]
-; DEFAULT-NEXT:    and r12, r3, r12
-; DEFAULT-NEXT:    ldr r3, [sp, #12]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    orr r3, r3, r12
-; DEFAULT-NEXT:    pop {r11, pc}
+; DEFAULT-NEXT:    push {r4, r5, r11, lr}
+; DEFAULT-NEXT:    and r12, r0, #1
+; DEFAULT-NEXT:    ldr r1, [sp, #24]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr r2, [sp, #28]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr r3, [sp, #16]
+; DEFAULT-NEXT:    ldr lr, [sp, #32]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr lr, [sp, #36]
+; DEFAULT-NEXT:    ldr r4, [sp, #20]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    pop {r4, r5, r11, pc}
 ;
 ; THUMB1-LABEL: ct_v4i32:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #24]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r5, r1, #0
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r1, [sp, #28]
-; THUMB1-NEXT:    ands r1, r4
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r1, r3
-; THUMB1-NEXT:    ldr r3, [sp, #32]
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    ldr r2, [sp, #16]
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    ldr r3, [sp, #20]
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r3, r6
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r3, [sp, #40]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #44]
+; THUMB1-NEXT:    ldr r6, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v4i32:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    .save {r7, lr}
-; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    ldr r1, [sp, #16]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    rsb.w lr, r0, #0
+; THUMB2-NEXT:    .save {r4, r5, r7, lr}
+; THUMB2-NEXT:    push {r4, r5, r7, lr}
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    ldr r1, [sp, #24]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
 ; THUMB2-NEXT:    and.w r0, r2, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r0, r1
-; THUMB2-NEXT:    ldr r1, [sp, #20]
-; THUMB2-NEXT:    and.w r2, r3, lr
-; THUMB2-NEXT:    ldr r3, [sp, #8]
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
-; THUMB2-NEXT:    ldr r2, [sp, #24]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r2, r3
-; THUMB2-NEXT:    ldr r3, [sp, #28]
-; THUMB2-NEXT:    and.w r12, r12, r3
-; THUMB2-NEXT:    ldr r3, [sp, #12]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    orr.w r3, r3, r12
-; THUMB2-NEXT:    pop {r7, pc}
+; THUMB2-NEXT:    bic.w lr, r1, lr
+; THUMB2-NEXT:    orr.w r0, r0, lr
+; THUMB2-NEXT:    ldr r2, [sp, #28]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
+; THUMB2-NEXT:    ldr r3, [sp, #16]
+; THUMB2-NEXT:    ldr.w lr, [sp, #32]
+; THUMB2-NEXT:    rsb.w r4, r12, #0
+; THUMB2-NEXT:    and.w r2, r3, r4
+; THUMB2-NEXT:    bic.w r4, lr, r4
+; THUMB2-NEXT:    orrs r2, r4
+; THUMB2-NEXT:    ldr.w lr, [sp, #36]
+; THUMB2-NEXT:    ldr r4, [sp, #20]
+; THUMB2-NEXT:    rsb.w r5, r12, #0
+; THUMB2-NEXT:    and.w r3, r4, r5
+; THUMB2-NEXT:    bic.w r5, lr, r5
+; THUMB2-NEXT:    orrs r3, r5
+; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <4 x i32> @llvm.ct.select.v4i32(i1 %cond, <4 x i32> %a, <4 x i32> %b)
   ret <4 x i32> %sel
@@ -1119,95 +916,76 @@
 ; CT-NEXT:    vmov d16, r2, r3
 ; CT-NEXT:    vld1.64 {d18, d19}, [r1]
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 q11, r1
-; CT-NEXT:    vand q10, q8, q11
-; CT-NEXT:    vbic q11, q9, q11
-; CT-NEXT:    vorr q10, q10, q11
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d20
 ; CT-NEXT:    vmov r2, r3, d21
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v2i64:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    ldr r1, [sp, #16]
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    rsb lr, r0, #0
-; DEFAULT-NEXT:    and r0, r2, lr
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r0, r0, r1
-; DEFAULT-NEXT:    ldr r1, [sp, #20]
-; DEFAULT-NEXT:    and r2, r3, lr
-; DEFAULT-NEXT:    ldr r3, [sp, #8]
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r1, r2, r1
-; DEFAULT-NEXT:    ldr r2, [sp, #24]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r2, r3, r2
-; DEFAULT-NEXT:    ldr r3, [sp, #28]
-; DEFAULT-NEXT:    and r12, r3, r12
-; DEFAULT-NEXT:    ldr r3, [sp, #12]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    orr r3, r3, r12
-; DEFAULT-NEXT:    pop {r11, pc}
+; DEFAULT-NEXT:    push {r4, r5, r11, lr}
+; DEFAULT-NEXT:    and r12, r0, #1
+; DEFAULT-NEXT:    ldr r1, [sp, #24]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr r2, [sp, #28]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr r3, [sp, #16]
+; DEFAULT-NEXT:    ldr lr, [sp, #32]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr lr, [sp, #36]
+; DEFAULT-NEXT:    ldr r4, [sp, #20]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    pop {r4, r5, r11, pc}
 ;
 ; THUMB1-LABEL: ct_v2i64:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #24]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r5, r1, #0
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r1, [sp, #28]
-; THUMB1-NEXT:    ands r1, r4
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r1, r3
-; THUMB1-NEXT:    ldr r3, [sp, #32]
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    ldr r2, [sp, #16]
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    ldr r3, [sp, #20]
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r3, r6
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r3, [sp, #40]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #44]
+; THUMB1-NEXT:    ldr r6, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v2i64:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    .save {r7, lr}
-; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    ldr r1, [sp, #16]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    rsb.w lr, r0, #0
+; THUMB2-NEXT:    .save {r4, r5, r7, lr}
+; THUMB2-NEXT:    push {r4, r5, r7, lr}
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    ldr r1, [sp, #24]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
 ; THUMB2-NEXT:    and.w r0, r2, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r0, r1
-; THUMB2-NEXT:    ldr r1, [sp, #20]
-; THUMB2-NEXT:    and.w r2, r3, lr
-; THUMB2-NEXT:    ldr r3, [sp, #8]
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
-; THUMB2-NEXT:    ldr r2, [sp, #24]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r2, r3
-; THUMB2-NEXT:    ldr r3, [sp, #28]
-; THUMB2-NEXT:    and.w r12, r12, r3
-; THUMB2-NEXT:    ldr r3, [sp, #12]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    orr.w r3, r3, r12
-; THUMB2-NEXT:    pop {r7, pc}
+; THUMB2-NEXT:    bic.w lr, r1, lr
+; THUMB2-NEXT:    orr.w r0, r0, lr
+; THUMB2-NEXT:    ldr r2, [sp, #28]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
+; THUMB2-NEXT:    ldr r3, [sp, #16]
+; THUMB2-NEXT:    ldr.w lr, [sp, #32]
+; THUMB2-NEXT:    rsb.w r4, r12, #0
+; THUMB2-NEXT:    and.w r2, r3, r4
+; THUMB2-NEXT:    bic.w r4, lr, r4
+; THUMB2-NEXT:    orrs r2, r4
+; THUMB2-NEXT:    ldr.w lr, [sp, #36]
+; THUMB2-NEXT:    ldr r4, [sp, #20]
+; THUMB2-NEXT:    rsb.w r5, r12, #0
+; THUMB2-NEXT:    and.w r3, r4, r5
+; THUMB2-NEXT:    bic.w r5, lr, r5
+; THUMB2-NEXT:    orrs r3, r5
+; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <2 x i64> @llvm.ct.select.v2i64(i1 %cond, <2 x i64> %a, <2 x i64> %b)
   ret <2 x i64> %sel
@@ -1221,95 +999,76 @@
 ; CT-NEXT:    vmov d16, r2, r3
 ; CT-NEXT:    vld1.64 {d18, d19}, [r1]
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 q11, r1
-; CT-NEXT:    vand q10, q8, q11
-; CT-NEXT:    vbic q11, q9, q11
-; CT-NEXT:    vorr q10, q10, q11
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d20
 ; CT-NEXT:    vmov r2, r3, d21
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v4f32:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    ldr r1, [sp, #16]
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    rsb lr, r0, #0
-; DEFAULT-NEXT:    and r0, r2, lr
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r0, r0, r1
-; DEFAULT-NEXT:    ldr r1, [sp, #20]
-; DEFAULT-NEXT:    and r2, r3, lr
-; DEFAULT-NEXT:    ldr r3, [sp, #8]
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r1, r2, r1
-; DEFAULT-NEXT:    ldr r2, [sp, #24]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r2, r3, r2
-; DEFAULT-NEXT:    ldr r3, [sp, #28]
-; DEFAULT-NEXT:    and r12, r3, r12
-; DEFAULT-NEXT:    ldr r3, [sp, #12]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    orr r3, r3, r12
-; DEFAULT-NEXT:    pop {r11, pc}
+; DEFAULT-NEXT:    push {r4, r5, r11, lr}
+; DEFAULT-NEXT:    and r12, r0, #1
+; DEFAULT-NEXT:    ldr r1, [sp, #24]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr r2, [sp, #28]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr r3, [sp, #16]
+; DEFAULT-NEXT:    ldr lr, [sp, #32]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr lr, [sp, #36]
+; DEFAULT-NEXT:    ldr r4, [sp, #20]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    pop {r4, r5, r11, pc}
 ;
 ; THUMB1-LABEL: ct_v4f32:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #24]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r5, r1, #0
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r1, [sp, #28]
-; THUMB1-NEXT:    ands r1, r4
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r1, r3
-; THUMB1-NEXT:    ldr r3, [sp, #32]
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    ldr r2, [sp, #16]
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    ldr r3, [sp, #20]
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r3, r6
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r3, [sp, #40]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #44]
+; THUMB1-NEXT:    ldr r6, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v4f32:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    .save {r7, lr}
-; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    ldr r1, [sp, #16]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    rsb.w lr, r0, #0
+; THUMB2-NEXT:    .save {r4, r5, r7, lr}
+; THUMB2-NEXT:    push {r4, r5, r7, lr}
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    ldr r1, [sp, #24]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
 ; THUMB2-NEXT:    and.w r0, r2, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r0, r1
-; THUMB2-NEXT:    ldr r1, [sp, #20]
-; THUMB2-NEXT:    and.w r2, r3, lr
-; THUMB2-NEXT:    ldr r3, [sp, #8]
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
-; THUMB2-NEXT:    ldr r2, [sp, #24]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r2, r3
-; THUMB2-NEXT:    ldr r3, [sp, #28]
-; THUMB2-NEXT:    and.w r12, r12, r3
-; THUMB2-NEXT:    ldr r3, [sp, #12]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    orr.w r3, r3, r12
-; THUMB2-NEXT:    pop {r7, pc}
+; THUMB2-NEXT:    bic.w lr, r1, lr
+; THUMB2-NEXT:    orr.w r0, r0, lr
+; THUMB2-NEXT:    ldr r2, [sp, #28]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
+; THUMB2-NEXT:    ldr r3, [sp, #16]
+; THUMB2-NEXT:    ldr.w lr, [sp, #32]
+; THUMB2-NEXT:    rsb.w r4, r12, #0
+; THUMB2-NEXT:    and.w r2, r3, r4
+; THUMB2-NEXT:    bic.w r4, lr, r4
+; THUMB2-NEXT:    orrs r2, r4
+; THUMB2-NEXT:    ldr.w lr, [sp, #36]
+; THUMB2-NEXT:    ldr r4, [sp, #20]
+; THUMB2-NEXT:    rsb.w r5, r12, #0
+; THUMB2-NEXT:    and.w r3, r4, r5
+; THUMB2-NEXT:    bic.w r5, lr, r5
+; THUMB2-NEXT:    orrs r3, r5
+; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <4 x float> @llvm.ct.select.v4f32(i1 %cond, <4 x float> %a, <4 x float> %b)
   ret <4 x float> %sel
@@ -1323,95 +1082,76 @@
 ; CT-NEXT:    vmov d16, r2, r3
 ; CT-NEXT:    vld1.64 {d18, d19}, [r1]
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 q11, r1
-; CT-NEXT:    vand q10, q8, q11
-; CT-NEXT:    vbic q11, q9, q11
-; CT-NEXT:    vorr q10, q10, q11
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d20
 ; CT-NEXT:    vmov r2, r3, d21
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v2f64:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    ldr r1, [sp, #16]
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    rsb lr, r0, #0
-; DEFAULT-NEXT:    and r0, r2, lr
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r0, r0, r1
-; DEFAULT-NEXT:    ldr r1, [sp, #20]
-; DEFAULT-NEXT:    and r2, r3, lr
-; DEFAULT-NEXT:    ldr r3, [sp, #8]
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r1, r2, r1
-; DEFAULT-NEXT:    ldr r2, [sp, #24]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r2, r3, r2
-; DEFAULT-NEXT:    ldr r3, [sp, #28]
-; DEFAULT-NEXT:    and r12, r3, r12
-; DEFAULT-NEXT:    ldr r3, [sp, #12]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    orr r3, r3, r12
-; DEFAULT-NEXT:    pop {r11, pc}
+; DEFAULT-NEXT:    push {r4, r5, r11, lr}
+; DEFAULT-NEXT:    and r12, r0, #1
+; DEFAULT-NEXT:    ldr r1, [sp, #24]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr r2, [sp, #28]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr r3, [sp, #16]
+; DEFAULT-NEXT:    ldr lr, [sp, #32]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldr lr, [sp, #36]
+; DEFAULT-NEXT:    ldr r4, [sp, #20]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    pop {r4, r5, r11, pc}
 ;
 ; THUMB1-LABEL: ct_v2f64:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #24]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r5, r1, #0
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r1, [sp, #28]
-; THUMB1-NEXT:    ands r1, r4
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r1, r3
-; THUMB1-NEXT:    ldr r3, [sp, #32]
-; THUMB1-NEXT:    ands r3, r4
-; THUMB1-NEXT:    ldr r2, [sp, #16]
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    ldr r6, [sp, #36]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    ldr r3, [sp, #20]
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r3, r6
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    .pad #4
+; THUMB1-NEXT:    sub sp, #4
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #36]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r3, [sp, #40]
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #44]
+; THUMB1-NEXT:    ldr r6, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    add sp, #4
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v2f64:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    .save {r7, lr}
-; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    ldr r1, [sp, #16]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    rsb.w lr, r0, #0
+; THUMB2-NEXT:    .save {r4, r5, r7, lr}
+; THUMB2-NEXT:    push {r4, r5, r7, lr}
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    ldr r1, [sp, #24]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
 ; THUMB2-NEXT:    and.w r0, r2, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r0, r1
-; THUMB2-NEXT:    ldr r1, [sp, #20]
-; THUMB2-NEXT:    and.w r2, r3, lr
-; THUMB2-NEXT:    ldr r3, [sp, #8]
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
-; THUMB2-NEXT:    ldr r2, [sp, #24]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r2, r3
-; THUMB2-NEXT:    ldr r3, [sp, #28]
-; THUMB2-NEXT:    and.w r12, r12, r3
-; THUMB2-NEXT:    ldr r3, [sp, #12]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    orr.w r3, r3, r12
-; THUMB2-NEXT:    pop {r7, pc}
+; THUMB2-NEXT:    bic.w lr, r1, lr
+; THUMB2-NEXT:    orr.w r0, r0, lr
+; THUMB2-NEXT:    ldr r2, [sp, #28]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
+; THUMB2-NEXT:    ldr r3, [sp, #16]
+; THUMB2-NEXT:    ldr.w lr, [sp, #32]
+; THUMB2-NEXT:    rsb.w r4, r12, #0
+; THUMB2-NEXT:    and.w r2, r3, r4
+; THUMB2-NEXT:    bic.w r4, lr, r4
+; THUMB2-NEXT:    orrs r2, r4
+; THUMB2-NEXT:    ldr.w lr, [sp, #36]
+; THUMB2-NEXT:    ldr r4, [sp, #20]
+; THUMB2-NEXT:    rsb.w r5, r12, #0
+; THUMB2-NEXT:    and.w r3, r4, r5
+; THUMB2-NEXT:    bic.w r5, lr, r5
+; THUMB2-NEXT:    orrs r3, r5
+; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <2 x double> @llvm.ct.select.v2f64(i1 %cond, <2 x double> %a, <2 x double> %b)
   ret <2 x double> %sel
@@ -1423,22 +1163,14 @@
 define <1 x i8> @ct_v1i8(i1 %cond, <1 x i8> %a, <1 x i8> %b) {
 ; CT-LABEL: ct_v1i8:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    sub r3, r0, #1
-; CT-NEXT:    rsb r0, r0, #0
-; CT-NEXT:    and r2, r2, r3
-; CT-NEXT:    and r0, r1, r0
-; CT-NEXT:    orr r0, r0, r2
+; CT-NEXT:    and r3, r0, #1
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v1i8:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    sub r3, r0, #1
-; DEFAULT-NEXT:    rsb r0, r0, #0
-; DEFAULT-NEXT:    and r2, r2, r3
-; DEFAULT-NEXT:    and r0, r1, r0
-; DEFAULT-NEXT:    orr r0, r0, r2
+; DEFAULT-NEXT:    and r3, r0, #1
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_v1i8:
@@ -1447,21 +1179,16 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    subs r4, r3, #1
-; THUMB1-NEXT:    ands r4, r2
-; THUMB1-NEXT:    rsbs r0, r3, #0
-; THUMB1-NEXT:    ands r0, r1
-; THUMB1-NEXT:    orrs r0, r4
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_v1i8:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    subs r3, r0, #1
-; THUMB2-NEXT:    rsbs r0, r0, #0
-; THUMB2-NEXT:    ands r2, r3
-; THUMB2-NEXT:    ands r0, r1
-; THUMB2-NEXT:    orrs r0, r2
+; THUMB2-NEXT:    and r3, r0, #1
+; THUMB2-NEXT:    rsb.w r12, r3, #0
+; THUMB2-NEXT:    and.w r0, r1, r12
+; THUMB2-NEXT:    bic.w r12, r2, r12
+; THUMB2-NEXT:    orr.w r0, r0, r12
 ; THUMB2-NEXT:    bx lr
 entry:
   %sel = call <1 x i8> @llvm.ct.select.i8(i1 %cond, <1 x i8> %a, <1 x i8> %b)
@@ -1471,63 +1198,47 @@
 define <2 x i8> @ct_v2i8(i1 %cond, <2 x i8> %a, <2 x i8> %b) {
 ; CT-LABEL: ct_v2i8:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    vdup.32 d16, r0
-; CT-NEXT:    vmov d18, r2, r3
-; CT-NEXT:    vldr d17, [sp]
-; CT-NEXT:    vshl.i32 d16, d16, #31
-; CT-NEXT:    vshr.s32 d16, d16, #31
-; CT-NEXT:    vbsl d16, d18, d17
-; CT-NEXT:    vmov r0, r1, d16
+; CT-NEXT:    vldr d16, [sp]
+; CT-NEXT:    vmov d17, r2, r3
+; CT-NEXT:    and r0, r0, #1
+; CT-NEXT:    BUNDLE
+; CT-NEXT:    vmov r0, r1, d18
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v2i8:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    and lr, r3, r12
-; DEFAULT-NEXT:    rsb r3, r0, #0
-; DEFAULT-NEXT:    and r0, r1, r3
-; DEFAULT-NEXT:    ldrb r1, [sp, #8]
-; DEFAULT-NEXT:    and r2, r2, r3
-; DEFAULT-NEXT:    orr r0, r0, lr
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r1, r2, r1
+; DEFAULT-NEXT:    and r12, r0, #1
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldrb r3, [sp, #8]
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    pop {r11, pc}
 ;
 ; THUMB1-LABEL: ct_v2i8:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, lr}
-; THUMB1-NEXT:    push {r4, lr}
-; THUMB1-NEXT:    mov r4, r1
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r0, r1, #1
-; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    rsbs r1, r1, #0
-; THUMB1-NEXT:    ands r4, r1
-; THUMB1-NEXT:    orrs r4, r3
-; THUMB1-NEXT:    ldr r3, [sp, #8]
-; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    ands r1, r2
-; THUMB1-NEXT:    orrs r1, r3
-; THUMB1-NEXT:    mov r0, r4
-; THUMB1-NEXT:    pop {r4, pc}
+; THUMB1-NEXT:    .save {r4, r5, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r7, lr}
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r3, [sp, #16]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    pop {r4, r5, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v2i8:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r7, lr}
 ; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    and.w lr, r3, r12
-; THUMB2-NEXT:    rsbs r3, r0, #0
-; THUMB2-NEXT:    and.w r0, r1, r3
-; THUMB2-NEXT:    ldrb.w r1, [sp, #8]
-; THUMB2-NEXT:    ands r2, r3
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r0, r1, lr
+; THUMB2-NEXT:    bic.w lr, r3, lr
 ; THUMB2-NEXT:    orr.w r0, r0, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
+; THUMB2-NEXT:    ldrb.w r3, [sp, #8]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r2, lr
+; THUMB2-NEXT:    bic.w lr, r3, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
 ; THUMB2-NEXT:    pop {r7, pc}
 entry:
   %sel = call <2 x i8> @llvm.ct.select.i16(i1 %cond, <2 x i8> %a, <2 x i8> %b)
@@ -1537,92 +1248,72 @@
 define <4 x i8> @ct_v4i8(i1 %cond, <4 x i8> %a, <4 x i8> %b) {
 ; CT-LABEL: ct_v4i8:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    vdup.16 d16, r0
-; CT-NEXT:    vmov d18, r2, r3
-; CT-NEXT:    vldr d17, [sp]
-; CT-NEXT:    vshl.i16 d16, d16, #15
-; CT-NEXT:    vshr.s16 d16, d16, #15
-; CT-NEXT:    vbsl d16, d18, d17
-; CT-NEXT:    vmov r0, r1, d16
+; CT-NEXT:    vldr d16, [sp]
+; CT-NEXT:    vmov d17, r2, r3
+; CT-NEXT:    and r0, r0, #1
+; CT-NEXT:    BUNDLE
+; CT-NEXT:    vmov r0, r1, d18
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v4i8:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and lr, r0, #1
-; DEFAULT-NEXT:    ldrb r0, [sp, #12]
-; DEFAULT-NEXT:    sub r12, lr, #1
-; DEFAULT-NEXT:    rsb lr, lr, #0
-; DEFAULT-NEXT:    and r0, r0, r12
-; DEFAULT-NEXT:    and r1, r1, lr
-; DEFAULT-NEXT:    orr r0, r1, r0
-; DEFAULT-NEXT:    ldrb r1, [sp, #16]
-; DEFAULT-NEXT:    and r2, r2, lr
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r1, r2, r1
-; DEFAULT-NEXT:    ldrb r2, [sp, #20]
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r2, r3, r2
-; DEFAULT-NEXT:    ldrb r3, [sp, #24]
-; DEFAULT-NEXT:    and r12, r3, r12
-; DEFAULT-NEXT:    ldrb r3, [sp, #8]
-; DEFAULT-NEXT:    and r3, r3, lr
-; DEFAULT-NEXT:    orr r3, r3, r12
-; DEFAULT-NEXT:    pop {r11, pc}
+; DEFAULT-NEXT:    push {r4, r5, r11, lr}
+; DEFAULT-NEXT:    and r12, r0, #1
+; DEFAULT-NEXT:    ldrb lr, [sp, #20]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldrb r4, [sp, #24]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldrb r4, [sp, #28]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldrb lr, [sp, #32]
+; DEFAULT-NEXT:    ldrb r4, [sp, #16]
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    pop {r4, r5, r11, pc}
 ;
 ; THUMB1-LABEL: ct_v4i8:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, r5, r6, lr}
-; THUMB1-NEXT:    push {r4, r5, r6, lr}
-; THUMB1-NEXT:    movs r5, #1
-; THUMB1-NEXT:    ands r5, r0
-; THUMB1-NEXT:    subs r4, r5, #1
-; THUMB1-NEXT:    ldr r0, [sp, #20]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r5, r5, #0
-; THUMB1-NEXT:    ands r1, r5
-; THUMB1-NEXT:    orrs r0, r1
-; THUMB1-NEXT:    ldr r1, [sp, #24]
-; THUMB1-NEXT:    ands r1, r4
-; THUMB1-NEXT:    ands r2, r5
-; THUMB1-NEXT:    orrs r1, r2
-; THUMB1-NEXT:    ldr r2, [sp, #28]
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r2, r3
-; THUMB1-NEXT:    ldr r6, [sp, #32]
-; THUMB1-NEXT:    ands r6, r4
-; THUMB1-NEXT:    ldr r3, [sp, #16]
-; THUMB1-NEXT:    ands r3, r5
-; THUMB1-NEXT:    orrs r3, r6
-; THUMB1-NEXT:    pop {r4, r5, r6, pc}
+; THUMB1-NEXT:    .save {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r5, [sp, #24]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #28]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #32]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r5, [sp, #36]
+; THUMB1-NEXT:    ldr r6, [sp, #20]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v4i8:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    .save {r7, lr}
-; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and lr, r0, #1
-; THUMB2-NEXT:    ldrb.w r0, [sp, #12]
-; THUMB2-NEXT:    sub.w r12, lr, #1
-; THUMB2-NEXT:    rsb.w lr, lr, #0
-; THUMB2-NEXT:    and.w r0, r0, r12
-; THUMB2-NEXT:    and.w r1, r1, lr
-; THUMB2-NEXT:    orrs r0, r1
-; THUMB2-NEXT:    ldrb.w r1, [sp, #16]
-; THUMB2-NEXT:    and.w r2, r2, lr
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
-; THUMB2-NEXT:    ldrb.w r2, [sp, #20]
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r2, r3
-; THUMB2-NEXT:    ldrb.w r3, [sp, #24]
-; THUMB2-NEXT:    and.w r12, r12, r3
-; THUMB2-NEXT:    ldrb.w r3, [sp, #8]
-; THUMB2-NEXT:    and.w r3, r3, lr
-; THUMB2-NEXT:    orr.w r3, r3, r12
-; THUMB2-NEXT:    pop {r7, pc}
+; THUMB2-NEXT:    .save {r4, r5, r7, lr}
+; THUMB2-NEXT:    push {r4, r5, r7, lr}
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    ldrb.w lr, [sp, #20]
+; THUMB2-NEXT:    rsb.w r4, r12, #0
+; THUMB2-NEXT:    and.w r0, r1, r4
+; THUMB2-NEXT:    bic.w r4, lr, r4
+; THUMB2-NEXT:    orrs r0, r4
+; THUMB2-NEXT:    ldrb.w r4, [sp, #24]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r2, lr
+; THUMB2-NEXT:    bic.w lr, r4, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
+; THUMB2-NEXT:    ldrb.w r4, [sp, #28]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r2, r3, lr
+; THUMB2-NEXT:    bic.w lr, r4, lr
+; THUMB2-NEXT:    orr.w r2, r2, lr
+; THUMB2-NEXT:    ldrb.w lr, [sp, #32]
+; THUMB2-NEXT:    ldrb.w r4, [sp, #16]
+; THUMB2-NEXT:    rsb.w r5, r12, #0
+; THUMB2-NEXT:    and.w r3, r4, r5
+; THUMB2-NEXT:    bic.w r5, lr, r5
+; THUMB2-NEXT:    orrs r3, r5
+; THUMB2-NEXT:    pop {r4, r5, r7, pc}
 entry:
   %sel = call <4 x i8> @llvm.ct.select.i32(i1 %cond, <4 x i8> %a, <4 x i8> %b)
   ret <4 x i8> %sel
@@ -1631,22 +1322,14 @@
 define <1 x i16> @ct_v1i16(i1 %cond, <1 x i16> %a, <1 x i16> %b) {
 ; CT-LABEL: ct_v1i16:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    sub r3, r0, #1
-; CT-NEXT:    rsb r0, r0, #0
-; CT-NEXT:    and r2, r2, r3
-; CT-NEXT:    and r0, r1, r0
-; CT-NEXT:    orr r0, r0, r2
+; CT-NEXT:    and r3, r0, #1
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v1i16:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    sub r3, r0, #1
-; DEFAULT-NEXT:    rsb r0, r0, #0
-; DEFAULT-NEXT:    and r2, r2, r3
-; DEFAULT-NEXT:    and r0, r1, r0
-; DEFAULT-NEXT:    orr r0, r0, r2
+; DEFAULT-NEXT:    and r3, r0, #1
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_v1i16:
@@ -1655,21 +1338,16 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    subs r4, r3, #1
-; THUMB1-NEXT:    ands r4, r2
-; THUMB1-NEXT:    rsbs r0, r3, #0
-; THUMB1-NEXT:    ands r0, r1
-; THUMB1-NEXT:    orrs r0, r4
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_v1i16:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    subs r3, r0, #1
-; THUMB2-NEXT:    rsbs r0, r0, #0
-; THUMB2-NEXT:    ands r2, r3
-; THUMB2-NEXT:    ands r0, r1
-; THUMB2-NEXT:    orrs r0, r2
+; THUMB2-NEXT:    and r3, r0, #1
+; THUMB2-NEXT:    rsb.w r12, r3, #0
+; THUMB2-NEXT:    and.w r0, r1, r12
+; THUMB2-NEXT:    bic.w r12, r2, r12
+; THUMB2-NEXT:    orr.w r0, r0, r12
 ; THUMB2-NEXT:    bx lr
 entry:
   %sel = call <1 x i16> @llvm.ct.select.i16(i1 %cond, <1 x i16> %a, <1 x i16> %b)
@@ -1679,63 +1357,47 @@
 define <2 x i16> @ct_v2i16(i1 %cond, <2 x i16> %a, <2 x i16> %b) {
 ; CT-LABEL: ct_v2i16:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    vdup.32 d16, r0
-; CT-NEXT:    vmov d18, r2, r3
-; CT-NEXT:    vldr d17, [sp]
-; CT-NEXT:    vshl.i32 d16, d16, #31
-; CT-NEXT:    vshr.s32 d16, d16, #31
-; CT-NEXT:    vbsl d16, d18, d17
-; CT-NEXT:    vmov r0, r1, d16
+; CT-NEXT:    vldr d16, [sp]
+; CT-NEXT:    vmov d17, r2, r3
+; CT-NEXT:    and r0, r0, #1
+; CT-NEXT:    BUNDLE
+; CT-NEXT:    vmov r0, r1, d18
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v2i16:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    and lr, r3, r12
-; DEFAULT-NEXT:    rsb r3, r0, #0
-; DEFAULT-NEXT:    and r0, r1, r3
-; DEFAULT-NEXT:    ldrh r1, [sp, #8]
-; DEFAULT-NEXT:    and r2, r2, r3
-; DEFAULT-NEXT:    orr r0, r0, lr
-; DEFAULT-NEXT:    and r1, r1, r12
-; DEFAULT-NEXT:    orr r1, r2, r1
+; DEFAULT-NEXT:    and r12, r0, #1
+; DEFAULT-NEXT:    BUNDLE
+; DEFAULT-NEXT:    ldrh r3, [sp, #8]
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    pop {r11, pc}
 ;
 ; THUMB1-LABEL: ct_v2i16:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, lr}
-; THUMB1-NEXT:    push {r4, lr}
-; THUMB1-NEXT:    mov r4, r1
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r0, r1, #1
-; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    rsbs r1, r1, #0
-; THUMB1-NEXT:    ands r4, r1
-; THUMB1-NEXT:    orrs r4, r3
-; THUMB1-NEXT:    ldr r3, [sp, #8]
-; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    ands r1, r2
-; THUMB1-NEXT:    orrs r1, r3
-; THUMB1-NEXT:    mov r0, r4
-; THUMB1-NEXT:    pop {r4, pc}
+; THUMB1-NEXT:    .save {r4, r5, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r7, lr}
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r3, [sp, #16]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    pop {r4, r5, r7, pc}
 ;
 ; THUMB2-LABEL: ct_v2i16:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r7, lr}
 ; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    and.w lr, r3, r12
-; THUMB2-NEXT:    rsbs r3, r0, #0
-; THUMB2-NEXT:    and.w r0, r1, r3
-; THUMB2-NEXT:    ldrh.w r1, [sp, #8]
-; THUMB2-NEXT:    ands r2, r3
+; THUMB2-NEXT:    and r12, r0, #1
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r0, r1, lr
+; THUMB2-NEXT:    bic.w lr, r3, lr
 ; THUMB2-NEXT:    orr.w r0, r0, lr
-; THUMB2-NEXT:    and.w r1, r1, r12
-; THUMB2-NEXT:    orrs r1, r2
+; THUMB2-NEXT:    ldrh.w r3, [sp, #8]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r2, lr
+; THUMB2-NEXT:    bic.w lr, r3, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
 ; THUMB2-NEXT:    pop {r7, pc}
 entry:
   %sel = call <2 x i16> @llvm.ct.select.i32(i1 %cond, <2 x i16> %a, <2 x i16> %b)
@@ -1745,22 +1407,14 @@
 define <1 x i32> @ct_v1i32(i1 %cond, <1 x i32> %a, <1 x i32> %b) {
 ; CT-LABEL: ct_v1i32:
 ; CT:       @ %bb.0: @ %entry
-; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    sub r3, r0, #1
-; CT-NEXT:    rsb r0, r0, #0
-; CT-NEXT:    and r2, r2, r3
-; CT-NEXT:    and r0, r1, r0
-; CT-NEXT:    orr r0, r0, r2
+; CT-NEXT:    and r3, r0, #1
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v1i32:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    sub r3, r0, #1
-; DEFAULT-NEXT:    rsb r0, r0, #0
-; DEFAULT-NEXT:    and r2, r2, r3
-; DEFAULT-NEXT:    and r0, r1, r0
-; DEFAULT-NEXT:    orr r0, r0, r2
+; DEFAULT-NEXT:    and r3, r0, #1
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_v1i32:
@@ -1769,21 +1423,16 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    subs r4, r3, #1
-; THUMB1-NEXT:    ands r4, r2
-; THUMB1-NEXT:    rsbs r0, r3, #0
-; THUMB1-NEXT:    ands r0, r1
-; THUMB1-NEXT:    orrs r0, r4
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_v1i32:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    subs r3, r0, #1
-; THUMB2-NEXT:    rsbs r0, r0, #0
-; THUMB2-NEXT:    ands r2, r3
-; THUMB2-NEXT:    ands r0, r1
-; THUMB2-NEXT:    orrs r0, r2
+; THUMB2-NEXT:    and r3, r0, #1
+; THUMB2-NEXT:    rsb.w r12, r3, #0
+; THUMB2-NEXT:    and.w r0, r1, r12
+; THUMB2-NEXT:    bic.w r12, r2, r12
+; THUMB2-NEXT:    orr.w r0, r0, r12
 ; THUMB2-NEXT:    bx lr
 entry:
   %sel = call <1 x i32> @llvm.ct.select.i32(i1 %cond, <1 x i32> %a, <1 x i32> %b)
@@ -1794,21 +1443,16 @@
 ; CT-LABEL: ct_v1f32:
 ; CT:       @ %bb.0: @ %entry
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    sub r3, r0, #1
-; CT-NEXT:    rsb r0, r0, #0
-; CT-NEXT:    and r2, r2, r3
-; CT-NEXT:    and r0, r1, r0
-; CT-NEXT:    orr r0, r0, r2
+; CT-NEXT:    vmov s0, r2
+; CT-NEXT:    vmov s2, r1
+; CT-NEXT:    BUNDLE
+; CT-NEXT:    vmov r0, s4
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_v1f32:
 ; DEFAULT:       @ %bb.0: @ %entry
-; DEFAULT-NEXT:    and r0, r0, #1
-; DEFAULT-NEXT:    sub r3, r0, #1
-; DEFAULT-NEXT:    rsb r0, r0, #0
-; DEFAULT-NEXT:    and r2, r2, r3
-; DEFAULT-NEXT:    and r0, r1, r0
-; DEFAULT-NEXT:    orr r0, r0, r2
+; DEFAULT-NEXT:    and r3, r0, #1
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_v1f32:
@@ -1817,21 +1461,16 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    subs r4, r3, #1
-; THUMB1-NEXT:    ands r4, r2
-; THUMB1-NEXT:    rsbs r0, r3, #0
-; THUMB1-NEXT:    ands r0, r1
-; THUMB1-NEXT:    orrs r0, r4
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_v1f32:
 ; THUMB2:       @ %bb.0: @ %entry
-; THUMB2-NEXT:    and r0, r0, #1
-; THUMB2-NEXT:    subs r3, r0, #1
-; THUMB2-NEXT:    rsbs r0, r0, #0
-; THUMB2-NEXT:    ands r2, r3
-; THUMB2-NEXT:    ands r0, r1
-; THUMB2-NEXT:    orrs r0, r2
+; THUMB2-NEXT:    and r3, r0, #1
+; THUMB2-NEXT:    rsb.w r12, r3, #0
+; THUMB2-NEXT:    and.w r0, r1, r12
+; THUMB2-NEXT:    bic.w r12, r2, r12
+; THUMB2-NEXT:    orr.w r0, r0, r12
 ; THUMB2-NEXT:    bx lr
 entry:
   %sel = call <1 x float> @llvm.ct.select.f32(i1 %cond, <1 x float> %a, <1 x float> %b)
diff --git a/llvm/test/CodeGen/ARM/ctselect.ll b/llvm/test/CodeGen/ARM/ctselect.ll
index 055e873..b6d5be4 100644
--- a/llvm/test/CodeGen/ARM/ctselect.ll
+++ b/llvm/test/CodeGen/ARM/ctselect.ll
@@ -10,19 +10,13 @@
 ; CT-LABEL: ct_i1:
 ; CT:       @ %bb.0: @ %entry
 ; CT-NEXT:    and r3, r0, #1
-; CT-NEXT:    rsb r12, r3, #0
-; CT-NEXT:    and r0, r1, r12
-; CT-NEXT:    bic r12, r2, r12
-; CT-NEXT:    orr r0, r0, r12
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_i1:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    and r3, r0, #1
-; DEFAULT-NEXT:    rsb r12, r3, #0
-; DEFAULT-NEXT:    and r0, r1, r12
-; DEFAULT-NEXT:    bic r12, r2, r12
-; DEFAULT-NEXT:    orr r0, r0, r12
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_i1:
@@ -31,13 +25,7 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    mov r4, r3
-; THUMB1-NEXT:    lsls r4, r4, #31
-; THUMB1-NEXT:    asrs r4, r4, #31
-; THUMB1-NEXT:    mov r0, r1
-; THUMB1-NEXT:    eors r0, r2
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    eors r0, r2
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_i1:
@@ -61,10 +49,7 @@
 ; CORTEX-NOTHUMB-LABEL: ct_i1:
 ; CORTEX-NOTHUMB:       @ %bb.0: @ %entry
 ; CORTEX-NOTHUMB-NEXT:    and r3, r0, #1
-; CORTEX-NOTHUMB-NEXT:    rsb r12, r3, #0
-; CORTEX-NOTHUMB-NEXT:    and r0, r1, r12
-; CORTEX-NOTHUMB-NEXT:    bic r12, r2, r12
-; CORTEX-NOTHUMB-NEXT:    orr r0, r0, r12
+; CORTEX-NOTHUMB-NEXT:    BUNDLE
 ; CORTEX-NOTHUMB-NEXT:    bx lr
 entry:
   %sel = call i1 @llvm.ct.select.i1(i1 %cond, i1 %a, i1 %b)
@@ -75,19 +60,13 @@
 ; CT-LABEL: ct_int8:
 ; CT:       @ %bb.0: @ %entry
 ; CT-NEXT:    and r3, r0, #1
-; CT-NEXT:    rsb r12, r3, #0
-; CT-NEXT:    and r0, r1, r12
-; CT-NEXT:    bic r12, r2, r12
-; CT-NEXT:    orr r0, r0, r12
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_int8:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    and r3, r0, #1
-; DEFAULT-NEXT:    rsb r12, r3, #0
-; DEFAULT-NEXT:    and r0, r1, r12
-; DEFAULT-NEXT:    bic r12, r2, r12
-; DEFAULT-NEXT:    orr r0, r0, r12
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_int8:
@@ -96,13 +75,7 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    mov r4, r3
-; THUMB1-NEXT:    lsls r4, r4, #31
-; THUMB1-NEXT:    asrs r4, r4, #31
-; THUMB1-NEXT:    mov r0, r1
-; THUMB1-NEXT:    eors r0, r2
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    eors r0, r2
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_int8:
@@ -126,10 +99,7 @@
 ; CORTEX-NOTHUMB-LABEL: ct_int8:
 ; CORTEX-NOTHUMB:       @ %bb.0: @ %entry
 ; CORTEX-NOTHUMB-NEXT:    and r3, r0, #1
-; CORTEX-NOTHUMB-NEXT:    rsb r12, r3, #0
-; CORTEX-NOTHUMB-NEXT:    and r0, r1, r12
-; CORTEX-NOTHUMB-NEXT:    bic r12, r2, r12
-; CORTEX-NOTHUMB-NEXT:    orr r0, r0, r12
+; CORTEX-NOTHUMB-NEXT:    BUNDLE
 ; CORTEX-NOTHUMB-NEXT:    bx lr
 entry:
   %sel = call i8 @llvm.ct.select.i8(i1 %cond, i8 %a, i8 %b)
@@ -140,19 +110,13 @@
 ; CT-LABEL: ct_int16:
 ; CT:       @ %bb.0: @ %entry
 ; CT-NEXT:    and r3, r0, #1
-; CT-NEXT:    rsb r12, r3, #0
-; CT-NEXT:    and r0, r1, r12
-; CT-NEXT:    bic r12, r2, r12
-; CT-NEXT:    orr r0, r0, r12
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_int16:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    and r3, r0, #1
-; DEFAULT-NEXT:    rsb r12, r3, #0
-; DEFAULT-NEXT:    and r0, r1, r12
-; DEFAULT-NEXT:    bic r12, r2, r12
-; DEFAULT-NEXT:    orr r0, r0, r12
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_int16:
@@ -161,13 +125,7 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    mov r4, r3
-; THUMB1-NEXT:    lsls r4, r4, #31
-; THUMB1-NEXT:    asrs r4, r4, #31
-; THUMB1-NEXT:    mov r0, r1
-; THUMB1-NEXT:    eors r0, r2
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    eors r0, r2
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_int16:
@@ -191,10 +149,7 @@
 ; CORTEX-NOTHUMB-LABEL: ct_int16:
 ; CORTEX-NOTHUMB:       @ %bb.0: @ %entry
 ; CORTEX-NOTHUMB-NEXT:    and r3, r0, #1
-; CORTEX-NOTHUMB-NEXT:    rsb r12, r3, #0
-; CORTEX-NOTHUMB-NEXT:    and r0, r1, r12
-; CORTEX-NOTHUMB-NEXT:    bic r12, r2, r12
-; CORTEX-NOTHUMB-NEXT:    orr r0, r0, r12
+; CORTEX-NOTHUMB-NEXT:    BUNDLE
 ; CORTEX-NOTHUMB-NEXT:    bx lr
 entry:
   %sel = call i16 @llvm.ct.select.i16(i1 %cond, i16 %a, i16 %b)
@@ -205,19 +160,13 @@
 ; CT-LABEL: ct_int32:
 ; CT:       @ %bb.0: @ %entry
 ; CT-NEXT:    and r3, r0, #1
-; CT-NEXT:    rsb r12, r3, #0
-; CT-NEXT:    and r0, r1, r12
-; CT-NEXT:    bic r12, r2, r12
-; CT-NEXT:    orr r0, r0, r12
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_int32:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    and r3, r0, #1
-; DEFAULT-NEXT:    rsb r12, r3, #0
-; DEFAULT-NEXT:    and r0, r1, r12
-; DEFAULT-NEXT:    bic r12, r2, r12
-; DEFAULT-NEXT:    orr r0, r0, r12
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_int32:
@@ -226,13 +175,7 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    mov r4, r3
-; THUMB1-NEXT:    lsls r4, r4, #31
-; THUMB1-NEXT:    asrs r4, r4, #31
-; THUMB1-NEXT:    mov r0, r1
-; THUMB1-NEXT:    eors r0, r2
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    eors r0, r2
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_int32:
@@ -256,10 +199,7 @@
 ; CORTEX-NOTHUMB-LABEL: ct_int32:
 ; CORTEX-NOTHUMB:       @ %bb.0: @ %entry
 ; CORTEX-NOTHUMB-NEXT:    and r3, r0, #1
-; CORTEX-NOTHUMB-NEXT:    rsb r12, r3, #0
-; CORTEX-NOTHUMB-NEXT:    and r0, r1, r12
-; CORTEX-NOTHUMB-NEXT:    bic r12, r2, r12
-; CORTEX-NOTHUMB-NEXT:    orr r0, r0, r12
+; CORTEX-NOTHUMB-NEXT:    BUNDLE
 ; CORTEX-NOTHUMB-NEXT:    bx lr
 entry:
   %sel = call i32 @llvm.ct.select.i32(i1 %cond, i32 %a, i32 %b)
@@ -274,14 +214,8 @@
 ; CT-NEXT:    ldr r1, [sp, #8]
 ; CT-NEXT:    and lr, r0, #1
 ; CT-NEXT:    ldr r12, [sp, #12]
-; CT-NEXT:    rsb r4, lr, #0
-; CT-NEXT:    and r0, r2, r4
-; CT-NEXT:    bic r4, r1, r4
-; CT-NEXT:    orr r0, r0, r4
-; CT-NEXT:    rsb r2, lr, #0
-; CT-NEXT:    and r1, r3, r2
-; CT-NEXT:    bic r2, r12, r2
-; CT-NEXT:    orr r1, r1, r2
+; CT-NEXT:    BUNDLE
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    pop {r4, pc}
 ;
 ; DEFAULT-LABEL: ct_int64:
@@ -289,15 +223,9 @@
 ; DEFAULT-NEXT:    push {r11, lr}
 ; DEFAULT-NEXT:    and r12, r0, #1
 ; DEFAULT-NEXT:    ldr r1, [sp, #8]
-; DEFAULT-NEXT:    rsb lr, r12, #0
-; DEFAULT-NEXT:    and r0, r2, lr
-; DEFAULT-NEXT:    bic lr, r1, lr
-; DEFAULT-NEXT:    orr r0, r0, lr
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    ldr r2, [sp, #12]
-; DEFAULT-NEXT:    rsb lr, r12, #0
-; DEFAULT-NEXT:    and r1, r3, lr
-; DEFAULT-NEXT:    bic lr, r2, lr
-; DEFAULT-NEXT:    orr r1, r1, lr
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    pop {r11, pc}
 ;
 ; THUMB1-LABEL: ct_int64:
@@ -307,21 +235,9 @@
 ; THUMB1-NEXT:    movs r4, #1
 ; THUMB1-NEXT:    ands r4, r0
 ; THUMB1-NEXT:    ldr r1, [sp, #16]
-; THUMB1-NEXT:    mov r5, r4
-; THUMB1-NEXT:    lsls r5, r5, #31
-; THUMB1-NEXT:    asrs r5, r5, #31
-; THUMB1-NEXT:    mov r0, r2
-; THUMB1-NEXT:    eors r0, r1
-; THUMB1-NEXT:    ands r0, r5
-; THUMB1-NEXT:    eors r0, r1
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    ldr r2, [sp, #20]
-; THUMB1-NEXT:    mov r5, r4
-; THUMB1-NEXT:    lsls r5, r5, #31
-; THUMB1-NEXT:    asrs r5, r5, #31
-; THUMB1-NEXT:    mov r1, r3
-; THUMB1-NEXT:    eors r1, r2
-; THUMB1-NEXT:    ands r1, r5
-; THUMB1-NEXT:    eors r1, r2
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, r5, r7, pc}
 ;
 ; THUMB2-LABEL: ct_int64:
@@ -364,14 +280,8 @@
 ; CORTEX-NOTHUMB-NEXT:    ldr r12, [sp, #12]
 ; CORTEX-NOTHUMB-NEXT:    and lr, r0, #1
 ; CORTEX-NOTHUMB-NEXT:    ldr r1, [sp, #8]
-; CORTEX-NOTHUMB-NEXT:    rsb r4, lr, #0
-; CORTEX-NOTHUMB-NEXT:    and r0, r2, r4
-; CORTEX-NOTHUMB-NEXT:    bic r4, r1, r4
-; CORTEX-NOTHUMB-NEXT:    orr r0, r0, r4
-; CORTEX-NOTHUMB-NEXT:    rsb r2, lr, #0
-; CORTEX-NOTHUMB-NEXT:    and r1, r3, r2
-; CORTEX-NOTHUMB-NEXT:    bic r2, r12, r2
-; CORTEX-NOTHUMB-NEXT:    orr r1, r1, r2
+; CORTEX-NOTHUMB-NEXT:    BUNDLE
+; CORTEX-NOTHUMB-NEXT:    BUNDLE
 ; CORTEX-NOTHUMB-NEXT:    pop {r4, pc}
 entry:
   %sel = call i64 @llvm.ct.select.i64(i1 %cond, i64 %a, i64 %b)
@@ -384,23 +294,14 @@
 ; CT-NEXT:    and r0, r0, #1
 ; CT-NEXT:    vmov s0, r2
 ; CT-NEXT:    vmov s2, r1
-; CT-NEXT:    vmov r2, s2
-; CT-NEXT:    vmov r3, s0
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    and r2, r2, r1
-; CT-NEXT:    bic r1, r3, r1
-; CT-NEXT:    orr r2, r2, r1
-; CT-NEXT:    vmov s4, r2
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, s4
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_float:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    and r3, r0, #1
-; DEFAULT-NEXT:    rsb r12, r3, #0
-; DEFAULT-NEXT:    and r0, r1, r12
-; DEFAULT-NEXT:    bic r12, r2, r12
-; DEFAULT-NEXT:    orr r0, r0, r12
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    bx lr
 ;
 ; THUMB1-LABEL: ct_float:
@@ -409,13 +310,7 @@
 ; THUMB1-NEXT:    push {r4, lr}
 ; THUMB1-NEXT:    movs r3, #1
 ; THUMB1-NEXT:    ands r3, r0
-; THUMB1-NEXT:    mov r4, r3
-; THUMB1-NEXT:    lsls r4, r4, #31
-; THUMB1-NEXT:    asrs r4, r4, #31
-; THUMB1-NEXT:    mov r0, r1
-; THUMB1-NEXT:    eors r0, r2
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    eors r0, r2
+; THUMB1-NEXT:    BUNDLE
 ; THUMB1-NEXT:    pop {r4, pc}
 ;
 ; THUMB2-LABEL: ct_float:
@@ -443,13 +338,7 @@
 ; CORTEX-NOTHUMB-LABEL: ct_float:
 ; CORTEX-NOTHUMB:       @ %bb.0: @ %entry
 ; CORTEX-NOTHUMB-NEXT:    and r0, r0, #1
-; CORTEX-NOTHUMB-NEXT:    vmov r2, s0
-; CORTEX-NOTHUMB-NEXT:    vmov r3, s1
-; CORTEX-NOTHUMB-NEXT:    rsb r1, r0, #0
-; CORTEX-NOTHUMB-NEXT:    and r2, r2, r1
-; CORTEX-NOTHUMB-NEXT:    bic r1, r3, r1
-; CORTEX-NOTHUMB-NEXT:    orr r2, r2, r1
-; CORTEX-NOTHUMB-NEXT:    vmov s2, r2
+; CORTEX-NOTHUMB-NEXT:    BUNDLE
 ; CORTEX-NOTHUMB-NEXT:    vmov.f32 s0, s2
 ; CORTEX-NOTHUMB-NEXT:    bx lr
 entry:
@@ -463,63 +352,47 @@
 ; CT-NEXT:    vldr d16, [sp]
 ; CT-NEXT:    vmov d17, r2, r3
 ; CT-NEXT:    and r0, r0, #1
-; CT-NEXT:    rsb r1, r0, #0
-; CT-NEXT:    vdup.32 d19, r1
-; CT-NEXT:    vand d18, d17, d19
-; CT-NEXT:    vbic d19, d16, d19
-; CT-NEXT:    vorr d18, d18, d19
+; CT-NEXT:    BUNDLE
 ; CT-NEXT:    vmov r0, r1, d18
 ; CT-NEXT:    bx lr
 ;
 ; DEFAULT-LABEL: ct_f64:
 ; DEFAULT:       @ %bb.0: @ %entry
 ; DEFAULT-NEXT:    push {r11, lr}
-; DEFAULT-NEXT:    and r0, r0, #1
+; DEFAULT-NEXT:    and r12, r0, #1
 ; DEFAULT-NEXT:    ldr r1, [sp, #8]
-; DEFAULT-NEXT:    sub r12, r0, #1
-; DEFAULT-NEXT:    and lr, r1, r12
-; DEFAULT-NEXT:    rsb r1, r0, #0
-; DEFAULT-NEXT:    and r0, r2, r1
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    ldr r2, [sp, #12]
-; DEFAULT-NEXT:    and r1, r3, r1
-; DEFAULT-NEXT:    orr r0, r0, lr
-; DEFAULT-NEXT:    and r2, r2, r12
-; DEFAULT-NEXT:    orr r1, r1, r2
+; DEFAULT-NEXT:    BUNDLE
 ; DEFAULT-NEXT:    pop {r11, pc}
 ;
 ; THUMB1-LABEL: ct_f64:
 ; THUMB1:       @ %bb.0: @ %entry
-; THUMB1-NEXT:    .save {r4, lr}
-; THUMB1-NEXT:    push {r4, lr}
-; THUMB1-NEXT:    movs r1, #1
-; THUMB1-NEXT:    ands r1, r0
-; THUMB1-NEXT:    subs r4, r1, #1
-; THUMB1-NEXT:    ldr r0, [sp, #8]
-; THUMB1-NEXT:    ands r0, r4
-; THUMB1-NEXT:    rsbs r1, r1, #0
-; THUMB1-NEXT:    ands r2, r1
-; THUMB1-NEXT:    orrs r0, r2
-; THUMB1-NEXT:    ldr r2, [sp, #12]
-; THUMB1-NEXT:    ands r2, r4
-; THUMB1-NEXT:    ands r1, r3
-; THUMB1-NEXT:    orrs r1, r2
-; THUMB1-NEXT:    pop {r4, pc}
+; THUMB1-NEXT:    .save {r4, r5, r7, lr}
+; THUMB1-NEXT:    push {r4, r5, r7, lr}
+; THUMB1-NEXT:    movs r4, #1
+; THUMB1-NEXT:    ands r4, r0
+; THUMB1-NEXT:    ldr r1, [sp, #16]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    ldr r2, [sp, #20]
+; THUMB1-NEXT:    BUNDLE
+; THUMB1-NEXT:    pop {r4, r5, r7, pc}
 ;
 ; THUMB2-LABEL: ct_f64:
 ; THUMB2:       @ %bb.0: @ %entry
 ; THUMB2-NEXT:    .save {r7, lr}
 ; THUMB2-NEXT:    push {r7, lr}
-; THUMB2-NEXT:    and r0, r0, #1
+; THUMB2-NEXT:    and r12, r0, #1
 ; THUMB2-NEXT:    ldr r1, [sp, #8]
-; THUMB2-NEXT:    sub.w r12, r0, #1
-; THUMB2-NEXT:    and.w lr, r1, r12
-; THUMB2-NEXT:    rsbs r1, r0, #0
-; THUMB2-NEXT:    and.w r0, r2, r1
-; THUMB2-NEXT:    ldr r2, [sp, #12]
-; THUMB2-NEXT:    ands r1, r3
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r0, r2, lr
+; THUMB2-NEXT:    bic.w lr, r1, lr
 ; THUMB2-NEXT:    orr.w r0, r0, lr
-; THUMB2-NEXT:    and.w r2, r2, r12
-; THUMB2-NEXT:    orrs r1, r2
+; THUMB2-NEXT:    ldr r2, [sp, #12]
+; THUMB2-NEXT:    rsb.w lr, r12, #0
+; THUMB2-NEXT:    and.w r1, r3, lr
+; THUMB2-NEXT:    bic.w lr, r2, lr
+; THUMB2-NEXT:    orr.w r1, r1, lr
 ; THUMB2-NEXT:    pop {r7, pc}
 ;
 ; CORTEXA9-LABEL: ct_f64:
@@ -536,11 +409,7 @@
 ; CORTEX-NOTHUMB-LABEL: ct_f64:
 ; CORTEX-NOTHUMB:       @ %bb.0: @ %entry
 ; CORTEX-NOTHUMB-NEXT:    and r0, r0, #1
-; CORTEX-NOTHUMB-NEXT:    rsb r1, r0, #0
-; CORTEX-NOTHUMB-NEXT:    vdup.32 d17, r1
-; CORTEX-NOTHUMB-NEXT:    vand d16, d0, d17
-; CORTEX-NOTHUMB-NEXT:    vbic d17, d1, d17
-; CORTEX-NOTHUMB-NEXT:    vorr d16, d16, d17
+; CORTEX-NOTHUMB-NEXT:    BUNDLE
 ; CORTEX-NOTHUMB-NEXT:    vmov.f64 d0, d16
 ; CORTEX-NOTHUMB-NEXT:    bx lr
 entry: