[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: