| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=armv7-linux-gnueabi < %s | FileCheck %s --check-prefix=ARM |
| ; RUN: llc -mtriple=thumbv7m-none-eabi < %s | FileCheck %s --check-prefix=THUMB-M |
| ; RUN: llc -mtriple=thumbv8a-linux-gnueabi < %s | FileCheck %s --check-prefix=THUMB-A |
| |
| define half @test_bitextract_half_full(b16 %src) { |
| ; ARM-LABEL: test_bitextract_half_full: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_half_full: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_half_full: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract half, b16 %src, i32 0 |
| ret half %result |
| } |
| |
| define float @test_bitextract_float_full(b32 %src) { |
| ; ARM-LABEL: test_bitextract_float_full: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_float_full: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_float_full: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract float, b32 %src, i32 0 |
| ret float %result |
| } |
| |
| define float @test_bitextract_float_const(b64 %src) { |
| ; ARM-LABEL: test_bitextract_float_const: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: mov r0, r1 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_float_const: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: mov r0, r1 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_float_const: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: mov r0, r1 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract float, b64 %src, i32 32 |
| ret float %result |
| } |
| |
| define float @test_bitextract_float_var(b64 %src, i32 %off) { |
| ; ARM-LABEL: test_bitextract_float_var: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: rsb r3, r2, #32 |
| ; ARM-NEXT: lsr r0, r0, r2 |
| ; ARM-NEXT: subs r2, r2, #32 |
| ; ARM-NEXT: orr r0, r0, r1, lsl r3 |
| ; ARM-NEXT: lsrpl r0, r1, r2 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_float_var: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: rsb.w r3, r2, #32 |
| ; THUMB-M-NEXT: lsrs r0, r2 |
| ; THUMB-M-NEXT: subs r2, #32 |
| ; THUMB-M-NEXT: lsl.w r3, r1, r3 |
| ; THUMB-M-NEXT: orr.w r0, r0, r3 |
| ; THUMB-M-NEXT: it pl |
| ; THUMB-M-NEXT: lsrpl.w r0, r1, r2 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_float_var: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: rsb.w r3, r2, #32 |
| ; THUMB-A-NEXT: lsrs r0, r2 |
| ; THUMB-A-NEXT: subs r2, #32 |
| ; THUMB-A-NEXT: lsl.w r3, r1, r3 |
| ; THUMB-A-NEXT: orr.w r0, r0, r3 |
| ; THUMB-A-NEXT: it pl |
| ; THUMB-A-NEXT: lsrpl.w r0, r1, r2 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract float, b64 %src, i32 %off |
| ret float %result |
| } |
| |
| define float @test_bitextract_float_b87_var(b87 %src, i32 %off) { |
| ; ARM-LABEL: test_bitextract_float_b87_var: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: .pad #32 |
| ; ARM-NEXT: sub sp, sp, #32 |
| ; ARM-NEXT: mov r12, #0 |
| ; ARM-NEXT: bfc r2, #23, #9 |
| ; ARM-NEXT: stm sp, {r0, r1, r2} |
| ; ARM-NEXT: ubfx r0, r3, #5, #2 |
| ; ARM-NEXT: mov r1, sp |
| ; ARM-NEXT: str r12, [sp, #28] |
| ; ARM-NEXT: str r12, [sp, #24] |
| ; ARM-NEXT: str r12, [sp, #20] |
| ; ARM-NEXT: str r12, [sp, #16] |
| ; ARM-NEXT: str r12, [sp, #12] |
| ; ARM-NEXT: ldr r2, [r1, r0, lsl #2] |
| ; ARM-NEXT: add r0, r1, r0, lsl #2 |
| ; ARM-NEXT: and r1, r3, #31 |
| ; ARM-NEXT: ldr r0, [r0, #4] |
| ; ARM-NEXT: lsr r2, r2, r1 |
| ; ARM-NEXT: eor r1, r1, #31 |
| ; ARM-NEXT: lsl r0, r0, #1 |
| ; ARM-NEXT: orr r0, r2, r0, lsl r1 |
| ; ARM-NEXT: add sp, sp, #32 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_float_b87_var: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: .pad #32 |
| ; THUMB-M-NEXT: sub sp, #32 |
| ; THUMB-M-NEXT: mov.w r12, #0 |
| ; THUMB-M-NEXT: strd r0, r1, [sp] |
| ; THUMB-M-NEXT: ubfx r0, r3, #5, #2 |
| ; THUMB-M-NEXT: bfc r2, #23, #9 |
| ; THUMB-M-NEXT: str.w r12, [sp, #28] |
| ; THUMB-M-NEXT: mov r1, sp |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #20] |
| ; THUMB-M-NEXT: and r3, r3, #31 |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #12] |
| ; THUMB-M-NEXT: str r2, [sp, #8] |
| ; THUMB-M-NEXT: ldr.w r2, [r1, r0, lsl #2] |
| ; THUMB-M-NEXT: add.w r0, r1, r0, lsl #2 |
| ; THUMB-M-NEXT: eor r1, r3, #31 |
| ; THUMB-M-NEXT: ldr r0, [r0, #4] |
| ; THUMB-M-NEXT: lsrs r2, r3 |
| ; THUMB-M-NEXT: lsls r0, r0, #1 |
| ; THUMB-M-NEXT: lsls r0, r1 |
| ; THUMB-M-NEXT: orrs r0, r2 |
| ; THUMB-M-NEXT: add sp, #32 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_float_b87_var: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: .pad #32 |
| ; THUMB-A-NEXT: sub sp, #32 |
| ; THUMB-A-NEXT: mov.w r12, #0 |
| ; THUMB-A-NEXT: bfc r2, #23, #9 |
| ; THUMB-A-NEXT: stm.w sp, {r0, r1, r2} |
| ; THUMB-A-NEXT: ubfx r0, r3, #5, #2 |
| ; THUMB-A-NEXT: mov r1, sp |
| ; THUMB-A-NEXT: str.w r12, [sp, #28] |
| ; THUMB-A-NEXT: strd r12, r12, [sp, #20] |
| ; THUMB-A-NEXT: strd r12, r12, [sp, #12] |
| ; THUMB-A-NEXT: ldr.w r2, [r1, r0, lsl #2] |
| ; THUMB-A-NEXT: add.w r0, r1, r0, lsl #2 |
| ; THUMB-A-NEXT: and r1, r3, #31 |
| ; THUMB-A-NEXT: ldr r0, [r0, #4] |
| ; THUMB-A-NEXT: lsrs r2, r1 |
| ; THUMB-A-NEXT: eor r1, r1, #31 |
| ; THUMB-A-NEXT: lsls r0, r0, #1 |
| ; THUMB-A-NEXT: lsls r0, r1 |
| ; THUMB-A-NEXT: orrs r0, r2 |
| ; THUMB-A-NEXT: add sp, #32 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract float, b87 %src, i32 %off |
| ret float %result |
| } |
| |
| define float @test_bitextract_float_b87_crossword(b87 %src) { |
| ; ARM-LABEL: test_bitextract_float_b87_crossword: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: lsr r0, r1, #23 |
| ; ARM-NEXT: orr r0, r0, r2, lsl #9 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_float_b87_crossword: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: lsrs r0, r1, #23 |
| ; THUMB-M-NEXT: orr.w r0, r0, r2, lsl #9 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_float_b87_crossword: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: lsrs r0, r1, #23 |
| ; THUMB-A-NEXT: orr.w r0, r0, r2, lsl #9 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract float, b87 %src, i32 55 |
| ret float %result |
| } |
| |
| define double @test_bitextract_double_full(b64 %src) { |
| ; ARM-LABEL: test_bitextract_double_full: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_double_full: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_double_full: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract double, b64 %src, i32 0 |
| ret double %result |
| } |
| |
| define double @test_bitextract_double_const(b128 %src) { |
| ; ARM-LABEL: test_bitextract_double_const: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: mov r1, r3 |
| ; ARM-NEXT: mov r0, r2 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitextract_double_const: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: mov r1, r3 |
| ; THUMB-M-NEXT: mov r0, r2 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitextract_double_const: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: mov r1, r3 |
| ; THUMB-A-NEXT: mov r0, r2 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitextract double, b128 %src, i32 64 |
| ret double %result |
| } |
| |
| define double @test_bitextract_double_var(b128 %src, i32 %off) { |
| ; ARM-LABEL: test_bitextract_double_var: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: .save {r4, r5, r11, lr} |
| ; ARM-NEXT: push {r4, r5, r11, lr} |
| ; ARM-NEXT: .pad #32 |
| ; ARM-NEXT: sub sp, sp, #32 |
| ; ARM-NEXT: ldr r12, [sp, #48] |
| ; ARM-NEXT: mov lr, #0 |
| ; ARM-NEXT: stm sp, {r0, r1, r2, r3, lr} |
| ; ARM-NEXT: mov r1, sp |
| ; ARM-NEXT: ubfx r0, r12, #5, #2 |
| ; ARM-NEXT: str lr, [sp, #28] |
| ; ARM-NEXT: str lr, [sp, #24] |
| ; ARM-NEXT: str lr, [sp, #20] |
| ; ARM-NEXT: ldr r2, [r1, r0, lsl #2] |
| ; ARM-NEXT: add r0, r1, r0, lsl #2 |
| ; ARM-NEXT: and r1, r12, #31 |
| ; ARM-NEXT: ldrd r4, r5, [r0, #4] |
| ; ARM-NEXT: eor r3, r1, #31 |
| ; ARM-NEXT: lsr r0, r2, r1 |
| ; ARM-NEXT: lsl r2, r4, #1 |
| ; ARM-NEXT: lsr r1, r4, r1 |
| ; ARM-NEXT: orr r0, r0, r2, lsl r3 |
| ; ARM-NEXT: lsl r2, r5, #1 |
| ; ARM-NEXT: orr r1, r1, r2, lsl r3 |
| ; ARM-NEXT: add sp, sp, #32 |
| ; ARM-NEXT: pop {r4, r5, r11, pc} |
| ; |
| ; THUMB-M-LABEL: test_bitextract_double_var: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: .save {r7, lr} |
| ; THUMB-M-NEXT: push {r7, lr} |
| ; THUMB-M-NEXT: .pad #32 |
| ; THUMB-M-NEXT: sub sp, #32 |
| ; THUMB-M-NEXT: mov.w r12, #0 |
| ; THUMB-M-NEXT: stm.w sp, {r0, r1, r2, r3, r12} |
| ; THUMB-M-NEXT: ldr r0, [sp, #40] |
| ; THUMB-M-NEXT: str.w r12, [sp, #28] |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #20] |
| ; THUMB-M-NEXT: mov r12, sp |
| ; THUMB-M-NEXT: ubfx r1, r0, #5, #2 |
| ; THUMB-M-NEXT: and r2, r0, #31 |
| ; THUMB-M-NEXT: ldr.w r3, [r12, r1, lsl #2] |
| ; THUMB-M-NEXT: add.w r1, r12, r1, lsl #2 |
| ; THUMB-M-NEXT: ldrd r1, r12, [r1, #4] |
| ; THUMB-M-NEXT: lsr.w lr, r3, r2 |
| ; THUMB-M-NEXT: eor r3, r2, #31 |
| ; THUMB-M-NEXT: lsls r0, r1, #1 |
| ; THUMB-M-NEXT: lsrs r1, r2 |
| ; THUMB-M-NEXT: lsls r0, r3 |
| ; THUMB-M-NEXT: lsl.w r2, r12, #1 |
| ; THUMB-M-NEXT: lsls r2, r3 |
| ; THUMB-M-NEXT: orr.w r0, r0, lr |
| ; THUMB-M-NEXT: orrs r1, r2 |
| ; THUMB-M-NEXT: add sp, #32 |
| ; THUMB-M-NEXT: pop {r7, pc} |
| ; |
| ; THUMB-A-LABEL: test_bitextract_double_var: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: .save {r7, lr} |
| ; THUMB-A-NEXT: push {r7, lr} |
| ; THUMB-A-NEXT: .pad #32 |
| ; THUMB-A-NEXT: sub sp, #32 |
| ; THUMB-A-NEXT: ldr.w r12, [sp, #40] |
| ; THUMB-A-NEXT: mov.w lr, #0 |
| ; THUMB-A-NEXT: stm.w sp, {r0, r1, r2, r3, lr} |
| ; THUMB-A-NEXT: mov r1, sp |
| ; THUMB-A-NEXT: and r3, r12, #31 |
| ; THUMB-A-NEXT: ubfx r0, r12, #5, #2 |
| ; THUMB-A-NEXT: str.w lr, [sp, #28] |
| ; THUMB-A-NEXT: strd lr, lr, [sp, #20] |
| ; THUMB-A-NEXT: ldr.w r2, [r1, r0, lsl #2] |
| ; THUMB-A-NEXT: add.w r0, r1, r0, lsl #2 |
| ; THUMB-A-NEXT: ldrd r1, lr, [r0, #4] |
| ; THUMB-A-NEXT: lsr.w r12, r2, r3 |
| ; THUMB-A-NEXT: eor r2, r3, #31 |
| ; THUMB-A-NEXT: lsls r0, r1, #1 |
| ; THUMB-A-NEXT: lsrs r1, r3 |
| ; THUMB-A-NEXT: lsls r0, r2 |
| ; THUMB-A-NEXT: lsl.w r3, lr, #1 |
| ; THUMB-A-NEXT: lsl.w r2, r3, r2 |
| ; THUMB-A-NEXT: orr.w r0, r0, r12 |
| ; THUMB-A-NEXT: orrs r1, r2 |
| ; THUMB-A-NEXT: add sp, #32 |
| ; THUMB-A-NEXT: pop {r7, pc} |
| %result = bitextract double, b128 %src, i32 %off |
| ret double %result |
| } |
| |
| define double @test_bitextract_double_b231_var(b231 %src, i32 %off) { |
| ; ARM-LABEL: test_bitextract_double_b231_var: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: .save {r4, r5, r6, r7, r11, lr} |
| ; ARM-NEXT: push {r4, r5, r6, r7, r11, lr} |
| ; ARM-NEXT: .pad #64 |
| ; ARM-NEXT: sub sp, sp, #64 |
| ; ARM-NEXT: add lr, sp, #92 |
| ; ARM-NEXT: ldr r4, [sp, #104] |
| ; ARM-NEXT: ldr r12, [sp, #88] |
| ; ARM-NEXT: mov r7, #0 |
| ; ARM-NEXT: ldm lr, {r5, r6, lr} |
| ; ARM-NEXT: stm sp, {r0, r1, r2, r3, r12} |
| ; ARM-NEXT: and r0, lr, #127 |
| ; ARM-NEXT: mov r1, sp |
| ; ARM-NEXT: str r0, [sp, #28] |
| ; ARM-NEXT: ubfx r0, r4, #5, #3 |
| ; ARM-NEXT: str r7, [sp, #60] |
| ; ARM-NEXT: str r7, [sp, #56] |
| ; ARM-NEXT: str r7, [sp, #52] |
| ; ARM-NEXT: str r7, [sp, #48] |
| ; ARM-NEXT: str r7, [sp, #44] |
| ; ARM-NEXT: str r7, [sp, #40] |
| ; ARM-NEXT: str r7, [sp, #36] |
| ; ARM-NEXT: str r7, [sp, #32] |
| ; ARM-NEXT: str r6, [sp, #24] |
| ; ARM-NEXT: str r5, [sp, #20] |
| ; ARM-NEXT: ldr r2, [r1, r0, lsl #2] |
| ; ARM-NEXT: add r0, r1, r0, lsl #2 |
| ; ARM-NEXT: and r1, r4, #31 |
| ; ARM-NEXT: ldrd r6, r7, [r0, #4] |
| ; ARM-NEXT: eor r3, r1, #31 |
| ; ARM-NEXT: lsr r0, r2, r1 |
| ; ARM-NEXT: lsl r2, r6, #1 |
| ; ARM-NEXT: lsr r1, r6, r1 |
| ; ARM-NEXT: orr r0, r0, r2, lsl r3 |
| ; ARM-NEXT: lsl r2, r7, #1 |
| ; ARM-NEXT: orr r1, r1, r2, lsl r3 |
| ; ARM-NEXT: add sp, sp, #64 |
| ; ARM-NEXT: pop {r4, r5, r6, r7, r11, pc} |
| ; |
| ; THUMB-M-LABEL: test_bitextract_double_b231_var: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: .save {r7, lr} |
| ; THUMB-M-NEXT: push {r7, lr} |
| ; THUMB-M-NEXT: .pad #64 |
| ; THUMB-M-NEXT: sub sp, #64 |
| ; THUMB-M-NEXT: mov.w r12, #0 |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #56] |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #48] |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #40] |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #32] |
| ; THUMB-M-NEXT: ldr.w r12, [sp, #80] |
| ; THUMB-M-NEXT: str.w r12, [sp, #24] |
| ; THUMB-M-NEXT: ldr.w r12, [sp, #76] |
| ; THUMB-M-NEXT: str.w r12, [sp, #20] |
| ; THUMB-M-NEXT: ldr.w r12, [sp, #72] |
| ; THUMB-M-NEXT: stm.w sp, {r0, r1, r2, r3, r12} |
| ; THUMB-M-NEXT: mov r12, sp |
| ; THUMB-M-NEXT: ldr r0, [sp, #84] |
| ; THUMB-M-NEXT: and r0, r0, #127 |
| ; THUMB-M-NEXT: str r0, [sp, #28] |
| ; THUMB-M-NEXT: ldr r0, [sp, #88] |
| ; THUMB-M-NEXT: and r2, r0, #31 |
| ; THUMB-M-NEXT: ubfx r1, r0, #5, #3 |
| ; THUMB-M-NEXT: ldr.w r3, [r12, r1, lsl #2] |
| ; THUMB-M-NEXT: add.w r1, r12, r1, lsl #2 |
| ; THUMB-M-NEXT: ldrd r1, r12, [r1, #4] |
| ; THUMB-M-NEXT: lsr.w lr, r3, r2 |
| ; THUMB-M-NEXT: eor r3, r2, #31 |
| ; THUMB-M-NEXT: lsls r0, r1, #1 |
| ; THUMB-M-NEXT: lsrs r1, r2 |
| ; THUMB-M-NEXT: lsls r0, r3 |
| ; THUMB-M-NEXT: lsl.w r2, r12, #1 |
| ; THUMB-M-NEXT: lsls r2, r3 |
| ; THUMB-M-NEXT: orr.w r0, r0, lr |
| ; THUMB-M-NEXT: orrs r1, r2 |
| ; THUMB-M-NEXT: add sp, #64 |
| ; THUMB-M-NEXT: pop {r7, pc} |
| ; |
| ; THUMB-A-LABEL: test_bitextract_double_b231_var: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: .save {r4, r5, r6, r7, lr} |
| ; THUMB-A-NEXT: push {r4, r5, r6, r7, lr} |
| ; THUMB-A-NEXT: .pad #68 |
| ; THUMB-A-NEXT: sub sp, #68 |
| ; THUMB-A-NEXT: ldr r4, [sp, #104] |
| ; THUMB-A-NEXT: movs r7, #0 |
| ; THUMB-A-NEXT: ldrd r6, lr, [sp, #96] |
| ; THUMB-A-NEXT: ldrd r12, r5, [sp, #88] |
| ; THUMB-A-NEXT: stm.w sp, {r0, r1, r2, r3, r12} |
| ; THUMB-A-NEXT: and r0, lr, #127 |
| ; THUMB-A-NEXT: mov r1, sp |
| ; THUMB-A-NEXT: str r0, [sp, #28] |
| ; THUMB-A-NEXT: ubfx r0, r4, #5, #3 |
| ; THUMB-A-NEXT: strd r7, r7, [sp, #56] |
| ; THUMB-A-NEXT: strd r7, r7, [sp, #48] |
| ; THUMB-A-NEXT: strd r7, r7, [sp, #40] |
| ; THUMB-A-NEXT: strd r7, r7, [sp, #32] |
| ; THUMB-A-NEXT: and r7, r4, #31 |
| ; THUMB-A-NEXT: strd r5, r6, [sp, #20] |
| ; THUMB-A-NEXT: eor r6, r7, #31 |
| ; THUMB-A-NEXT: ldr.w r2, [r1, r0, lsl #2] |
| ; THUMB-A-NEXT: add.w r0, r1, r0, lsl #2 |
| ; THUMB-A-NEXT: ldrd r1, r3, [r0, #4] |
| ; THUMB-A-NEXT: lsr.w r0, r2, r7 |
| ; THUMB-A-NEXT: lsls r2, r1, #1 |
| ; THUMB-A-NEXT: lsls r2, r6 |
| ; THUMB-A-NEXT: orrs r0, r2 |
| ; THUMB-A-NEXT: lsls r2, r3, #1 |
| ; THUMB-A-NEXT: lsrs r1, r7 |
| ; THUMB-A-NEXT: lsls r2, r6 |
| ; THUMB-A-NEXT: orrs r1, r2 |
| ; THUMB-A-NEXT: add sp, #68 |
| ; THUMB-A-NEXT: pop {r4, r5, r6, r7, pc} |
| %result = bitextract double, b231 %src, i32 %off |
| ret double %result |
| } |
| |
| |
| define b16 @test_bitinsert_half_full(b16 %base, half %val) { |
| ; ARM-LABEL: test_bitinsert_half_full: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: mov r0, r1 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_half_full: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: mov r0, r1 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_half_full: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: mov r0, r1 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitinsert b16 %base, half %val, i32 0 |
| ret b16 %result |
| } |
| |
| define b32 @test_bitinsert_half_var(b32 %base, half %val, i32 %off) { |
| ; ARM-LABEL: test_bitinsert_half_var: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: movw r3, #65535 |
| ; ARM-NEXT: uxth r1, r1 |
| ; ARM-NEXT: bic r0, r0, r3, lsl r2 |
| ; ARM-NEXT: orr r0, r0, r1, lsl r2 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_half_var: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: uxth r1, r1 |
| ; THUMB-M-NEXT: movw r3, #65535 |
| ; THUMB-M-NEXT: lsls r1, r2 |
| ; THUMB-M-NEXT: lsl.w r2, r3, r2 |
| ; THUMB-M-NEXT: bics r0, r2 |
| ; THUMB-M-NEXT: orrs r0, r1 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_half_var: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: movw r3, #65535 |
| ; THUMB-A-NEXT: uxth r1, r1 |
| ; THUMB-A-NEXT: lsls r3, r2 |
| ; THUMB-A-NEXT: bics r0, r3 |
| ; THUMB-A-NEXT: lsls r1, r2 |
| ; THUMB-A-NEXT: orrs r0, r1 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitinsert b32 %base, half %val, i32 %off |
| ret b32 %result |
| } |
| |
| define b32 @test_bitinsert_float_full(b32 %base, float %val) { |
| ; ARM-LABEL: test_bitinsert_float_full: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: mov r0, r1 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_float_full: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: mov r0, r1 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_float_full: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: mov r0, r1 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitinsert b32 %base, float %val, i32 0 |
| ret b32 %result |
| } |
| |
| define b64 @test_bitinsert_float_const(b64 %base, float %val) { |
| ; ARM-LABEL: test_bitinsert_float_const: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: mov r1, r2 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_float_const: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: mov r1, r2 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_float_const: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: mov r1, r2 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitinsert b64 %base, float %val, i32 32 |
| ret b64 %result |
| } |
| |
| define b64 @test_bitinsert_float_var(b64 %base, float %val, i32 %off) { |
| ; ARM-LABEL: test_bitinsert_float_var: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: .save {r4, r5, r11, lr} |
| ; ARM-NEXT: push {r4, r5, r11, lr} |
| ; ARM-NEXT: mvn r4, #0 |
| ; ARM-NEXT: lsl r12, r2, r3 |
| ; ARM-NEXT: subs lr, r3, #32 |
| ; ARM-NEXT: lsl r5, r4, r3 |
| ; ARM-NEXT: rsb r3, r3, #32 |
| ; ARM-NEXT: movwpl r5, #0 |
| ; ARM-NEXT: bic r0, r0, r5 |
| ; ARM-NEXT: movwpl r12, #0 |
| ; ARM-NEXT: lsr r5, r2, r3 |
| ; ARM-NEXT: orr r0, r0, r12 |
| ; ARM-NEXT: lslpl r5, r2, lr |
| ; ARM-NEXT: lsr r2, r4, r3 |
| ; ARM-NEXT: lslpl r2, r4, lr |
| ; ARM-NEXT: bic r1, r1, r2 |
| ; ARM-NEXT: orr r1, r1, r5 |
| ; ARM-NEXT: pop {r4, r5, r11, pc} |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_float_var: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: .save {r4, r5, r6, lr} |
| ; THUMB-M-NEXT: push {r4, r5, r6, lr} |
| ; THUMB-M-NEXT: rsb.w lr, r3, #32 |
| ; THUMB-M-NEXT: mov.w r6, #-1 |
| ; THUMB-M-NEXT: subs.w r12, r3, #32 |
| ; THUMB-M-NEXT: lsr.w r4, r2, lr |
| ; THUMB-M-NEXT: lsr.w r5, r6, lr |
| ; THUMB-M-NEXT: it pl |
| ; THUMB-M-NEXT: lslpl.w r4, r2, r12 |
| ; THUMB-M-NEXT: lsl.w r2, r2, r3 |
| ; THUMB-M-NEXT: lsl.w r3, r6, r3 |
| ; THUMB-M-NEXT: it pl |
| ; THUMB-M-NEXT: lslpl.w r5, r6, r12 |
| ; THUMB-M-NEXT: bic.w r1, r1, r5 |
| ; THUMB-M-NEXT: it pl |
| ; THUMB-M-NEXT: movpl r2, #0 |
| ; THUMB-M-NEXT: it pl |
| ; THUMB-M-NEXT: movpl r3, #0 |
| ; THUMB-M-NEXT: bics r0, r3 |
| ; THUMB-M-NEXT: orrs r1, r4 |
| ; THUMB-M-NEXT: orrs r0, r2 |
| ; THUMB-M-NEXT: pop {r4, r5, r6, pc} |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_float_var: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: .save {r4, r5, r6, lr} |
| ; THUMB-A-NEXT: push {r4, r5, r6, lr} |
| ; THUMB-A-NEXT: rsb.w lr, r3, #32 |
| ; THUMB-A-NEXT: mov.w r6, #-1 |
| ; THUMB-A-NEXT: subs.w r12, r3, #32 |
| ; THUMB-A-NEXT: lsr.w r4, r2, lr |
| ; THUMB-A-NEXT: lsr.w r5, r6, lr |
| ; THUMB-A-NEXT: it pl |
| ; THUMB-A-NEXT: lslpl.w r4, r2, r12 |
| ; THUMB-A-NEXT: lsl.w r2, r2, r3 |
| ; THUMB-A-NEXT: lsl.w r3, r6, r3 |
| ; THUMB-A-NEXT: it pl |
| ; THUMB-A-NEXT: lslpl.w r5, r6, r12 |
| ; THUMB-A-NEXT: bic.w r1, r1, r5 |
| ; THUMB-A-NEXT: it pl |
| ; THUMB-A-NEXT: movpl r2, #0 |
| ; THUMB-A-NEXT: it pl |
| ; THUMB-A-NEXT: movpl r3, #0 |
| ; THUMB-A-NEXT: bics r0, r3 |
| ; THUMB-A-NEXT: orrs r1, r4 |
| ; THUMB-A-NEXT: orrs r0, r2 |
| ; THUMB-A-NEXT: pop {r4, r5, r6, pc} |
| %result = bitinsert b64 %base, float %val, i32 %off |
| ret b64 %result |
| } |
| |
| define b87 @test_bitinsert_float_b87_var(b87 %base, float %val, i32 %off) { |
| ; ARM-LABEL: test_bitinsert_float_b87_var: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; ARM-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; ARM-NEXT: .pad #68 |
| ; ARM-NEXT: sub sp, sp, #68 |
| ; ARM-NEXT: ldr r12, [sp, #104] |
| ; ARM-NEXT: mov lr, #0 |
| ; ARM-NEXT: str r3, [sp, #16] |
| ; ARM-NEXT: mov r3, #12 |
| ; ARM-NEXT: str lr, [sp, #28] |
| ; ARM-NEXT: mvn r6, #0 |
| ; ARM-NEXT: and r4, r3, r12, lsr #3 |
| ; ARM-NEXT: mov r3, sp |
| ; ARM-NEXT: add r5, r3, #16 |
| ; ARM-NEXT: str lr, [sp, #24] |
| ; ARM-NEXT: str lr, [sp, #20] |
| ; ARM-NEXT: str lr, [sp, #12] |
| ; ARM-NEXT: str lr, [sp, #8] |
| ; ARM-NEXT: str lr, [sp, #4] |
| ; ARM-NEXT: str lr, [sp] |
| ; ARM-NEXT: str lr, [sp, #60] |
| ; ARM-NEXT: str lr, [sp, #56] |
| ; ARM-NEXT: str lr, [sp, #52] |
| ; ARM-NEXT: ldr r10, [r5, -r4]! |
| ; ARM-NEXT: str r6, [sp, #48] |
| ; ARM-NEXT: add r6, sp, #32 |
| ; ARM-NEXT: add r6, r6, #16 |
| ; ARM-NEXT: str lr, [sp, #44] |
| ; ARM-NEXT: str lr, [sp, #40] |
| ; ARM-NEXT: lsr r7, r10, #1 |
| ; ARM-NEXT: str lr, [sp, #36] |
| ; ARM-NEXT: str lr, [sp, #32] |
| ; ARM-NEXT: ldrd r8, r9, [r5, #4] |
| ; ARM-NEXT: and r5, r12, #31 |
| ; ARM-NEXT: ldr r12, [r6, -r4]! |
| ; ARM-NEXT: eor r4, r5, #31 |
| ; ARM-NEXT: ldr r11, [r6, #8] |
| ; ARM-NEXT: lsl r3, r8, r5 |
| ; ARM-NEXT: ldr r6, [r6, #4] |
| ; ARM-NEXT: orr lr, r3, r7, lsr r4 |
| ; ARM-NEXT: lsr r3, r12, #1 |
| ; ARM-NEXT: bic r0, r0, r12, lsl r5 |
| ; ARM-NEXT: orr r0, r0, r10, lsl r5 |
| ; ARM-NEXT: lsl r7, r6, r5 |
| ; ARM-NEXT: orr r3, r7, r3, lsr r4 |
| ; ARM-NEXT: bic r1, r1, r3 |
| ; ARM-NEXT: lsrs r7, r8, #1 |
| ; ARM-NEXT: lsl r3, r9, r5 |
| ; ARM-NEXT: lsrs r6, r6, #1 |
| ; ARM-NEXT: orr r3, r3, r7, lsr r4 |
| ; ARM-NEXT: lsl r7, r11, r5 |
| ; ARM-NEXT: orr r7, r7, r6, lsr r4 |
| ; ARM-NEXT: orr r1, r1, lr |
| ; ARM-NEXT: bic r2, r2, r7 |
| ; ARM-NEXT: orr r2, r2, r3 |
| ; ARM-NEXT: bfc r2, #23, #9 |
| ; ARM-NEXT: add sp, sp, #68 |
| ; ARM-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_float_b87_var: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-M-NEXT: .pad #68 |
| ; THUMB-M-NEXT: sub sp, #68 |
| ; THUMB-M-NEXT: mov.w r12, #0 |
| ; THUMB-M-NEXT: ldr.w lr, [sp, #104] |
| ; THUMB-M-NEXT: strd r3, r12, [sp, #16] |
| ; THUMB-M-NEXT: mov.w r3, #-1 |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #24] |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #8] |
| ; THUMB-M-NEXT: strd r12, r12, [sp] |
| ; THUMB-M-NEXT: str r3, [sp, #48] |
| ; THUMB-M-NEXT: movs r3, #12 |
| ; THUMB-M-NEXT: and.w r4, r3, lr, lsr #3 |
| ; THUMB-M-NEXT: mov r3, sp |
| ; THUMB-M-NEXT: adds r3, #16 |
| ; THUMB-M-NEXT: str.w r12, [sp, #60] |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #52] |
| ; THUMB-M-NEXT: subs r3, r3, r4 |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #40] |
| ; THUMB-M-NEXT: strd r12, r12, [sp, #32] |
| ; THUMB-M-NEXT: ldrd r12, r9, [r3] |
| ; THUMB-M-NEXT: ldr.w r8, [r3, #8] |
| ; THUMB-M-NEXT: and r3, lr, #31 |
| ; THUMB-M-NEXT: eor r5, r3, #31 |
| ; THUMB-M-NEXT: lsr.w r7, r12, #1 |
| ; THUMB-M-NEXT: lsl.w r6, r9, r3 |
| ; THUMB-M-NEXT: lsrs r7, r5 |
| ; THUMB-M-NEXT: orr.w lr, r6, r7 |
| ; THUMB-M-NEXT: add r6, sp, #32 |
| ; THUMB-M-NEXT: adds r6, #16 |
| ; THUMB-M-NEXT: subs r6, r6, r4 |
| ; THUMB-M-NEXT: ldrd r11, r7, [r6] |
| ; THUMB-M-NEXT: ldr.w r10, [r6, #8] |
| ; THUMB-M-NEXT: lsl.w r6, r7, r3 |
| ; THUMB-M-NEXT: lsrs.w r7, r7, #1 |
| ; THUMB-M-NEXT: lsr.w r4, r11, #1 |
| ; THUMB-M-NEXT: lsrs r7, r5 |
| ; THUMB-M-NEXT: lsrs r4, r5 |
| ; THUMB-M-NEXT: orrs r4, r6 |
| ; THUMB-M-NEXT: lsl.w r6, r8, r3 |
| ; THUMB-M-NEXT: bics r1, r4 |
| ; THUMB-M-NEXT: lsrs.w r4, r9, #1 |
| ; THUMB-M-NEXT: lsrs r4, r5 |
| ; THUMB-M-NEXT: orrs r6, r4 |
| ; THUMB-M-NEXT: lsl.w r4, r10, r3 |
| ; THUMB-M-NEXT: orrs r7, r4 |
| ; THUMB-M-NEXT: bics r2, r7 |
| ; THUMB-M-NEXT: lsl.w r7, r12, r3 |
| ; THUMB-M-NEXT: orrs r2, r6 |
| ; THUMB-M-NEXT: lsl.w r3, r11, r3 |
| ; THUMB-M-NEXT: bics r0, r3 |
| ; THUMB-M-NEXT: orr.w r1, r1, lr |
| ; THUMB-M-NEXT: bfc r2, #23, #9 |
| ; THUMB-M-NEXT: orrs r0, r7 |
| ; THUMB-M-NEXT: add sp, #68 |
| ; THUMB-M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc} |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_float_b87_var: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-A-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-A-NEXT: .pad #68 |
| ; THUMB-A-NEXT: sub sp, #68 |
| ; THUMB-A-NEXT: ldr.w lr, [sp, #104] |
| ; THUMB-A-NEXT: movs r4, #0 |
| ; THUMB-A-NEXT: strd r3, r4, [sp, #16] |
| ; THUMB-A-NEXT: movs r3, #12 |
| ; THUMB-A-NEXT: strd r4, r4, [sp, #24] |
| ; THUMB-A-NEXT: and.w r5, r3, lr, lsr #3 |
| ; THUMB-A-NEXT: mov r3, sp |
| ; THUMB-A-NEXT: adds r3, #16 |
| ; THUMB-A-NEXT: strd r4, r4, [sp, #8] |
| ; THUMB-A-NEXT: subs r3, r3, r5 |
| ; THUMB-A-NEXT: strd r4, r4, [sp] |
| ; THUMB-A-NEXT: str r4, [sp, #60] |
| ; THUMB-A-NEXT: strd r4, r4, [sp, #52] |
| ; THUMB-A-NEXT: ldrd r12, r9, [r3] |
| ; THUMB-A-NEXT: ldr.w r8, [r3, #8] |
| ; THUMB-A-NEXT: mov.w r3, #-1 |
| ; THUMB-A-NEXT: str r3, [sp, #48] |
| ; THUMB-A-NEXT: and r3, lr, #31 |
| ; THUMB-A-NEXT: eor r7, r3, #31 |
| ; THUMB-A-NEXT: strd r4, r4, [sp, #40] |
| ; THUMB-A-NEXT: strd r4, r4, [sp, #32] |
| ; THUMB-A-NEXT: lsr.w r4, r12, #1 |
| ; THUMB-A-NEXT: lsrs r4, r7 |
| ; THUMB-A-NEXT: lsl.w r6, r9, r3 |
| ; THUMB-A-NEXT: orr.w lr, r6, r4 |
| ; THUMB-A-NEXT: add r4, sp, #32 |
| ; THUMB-A-NEXT: adds r4, #16 |
| ; THUMB-A-NEXT: subs r5, r4, r5 |
| ; THUMB-A-NEXT: ldrd r11, r6, [r5] |
| ; THUMB-A-NEXT: ldr.w r10, [r5, #8] |
| ; THUMB-A-NEXT: lsl.w r4, r6, r3 |
| ; THUMB-A-NEXT: lsrs.w r6, r6, #1 |
| ; THUMB-A-NEXT: lsr.w r5, r11, #1 |
| ; THUMB-A-NEXT: lsrs r5, r7 |
| ; THUMB-A-NEXT: orrs r4, r5 |
| ; THUMB-A-NEXT: bics r1, r4 |
| ; THUMB-A-NEXT: lsrs.w r4, r9, #1 |
| ; THUMB-A-NEXT: lsrs r4, r7 |
| ; THUMB-A-NEXT: lsl.w r5, r8, r3 |
| ; THUMB-A-NEXT: lsr.w r7, r6, r7 |
| ; THUMB-A-NEXT: orrs r5, r4 |
| ; THUMB-A-NEXT: lsl.w r4, r10, r3 |
| ; THUMB-A-NEXT: orrs r7, r4 |
| ; THUMB-A-NEXT: bics r2, r7 |
| ; THUMB-A-NEXT: lsl.w r7, r11, r3 |
| ; THUMB-A-NEXT: orrs r2, r5 |
| ; THUMB-A-NEXT: bics r0, r7 |
| ; THUMB-A-NEXT: lsl.w r3, r12, r3 |
| ; THUMB-A-NEXT: orr.w r1, r1, lr |
| ; THUMB-A-NEXT: bfc r2, #23, #9 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: add sp, #68 |
| ; THUMB-A-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc} |
| %result = bitinsert b87 %base, float %val, i32 %off |
| ret b87 %result |
| } |
| |
| |
| define b64 @test_bitinsert_double_full(b64 %base, double %val) { |
| ; ARM-LABEL: test_bitinsert_double_full: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: mov r1, r3 |
| ; ARM-NEXT: mov r0, r2 |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_double_full: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: mov r1, r3 |
| ; THUMB-M-NEXT: mov r0, r2 |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_double_full: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: mov r1, r3 |
| ; THUMB-A-NEXT: mov r0, r2 |
| ; THUMB-A-NEXT: bx lr |
| %result = bitinsert b64 %base, double %val, i32 0 |
| ret b64 %result |
| } |
| |
| define b128 @test_bitinsert_double_const(b128 %base, double %val) { |
| ; ARM-LABEL: test_bitinsert_double_const: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: ldm sp, {r2, r3} |
| ; ARM-NEXT: bx lr |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_double_const: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: ldrd r2, r3, [sp] |
| ; THUMB-M-NEXT: bx lr |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_double_const: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: ldrd r2, r3, [sp] |
| ; THUMB-A-NEXT: bx lr |
| %result = bitinsert b128 %base, double %val, i32 64 |
| ret b128 %result |
| } |
| |
| define b128 @test_bitinsert_double_var(b128 %base, double %val, i32 %off) { |
| ; ARM-LABEL: test_bitinsert_double_var: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; ARM-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; ARM-NEXT: .pad #84 |
| ; ARM-NEXT: sub sp, sp, #84 |
| ; ARM-NEXT: ldr lr, [sp, #128] |
| ; ARM-NEXT: mov r5, #0 |
| ; ARM-NEXT: ldr r4, [sp, #124] |
| ; ARM-NEXT: str r2, [sp, #4] @ 4-byte Spill |
| ; ARM-NEXT: mov r2, r1 |
| ; ARM-NEXT: str r3, [sp, #12] @ 4-byte Spill |
| ; ARM-NEXT: str r0, [sp, #8] @ 4-byte Spill |
| ; ARM-NEXT: str r4, [sp, #36] |
| ; ARM-NEXT: mov r4, #12 |
| ; ARM-NEXT: and r10, r4, lr, lsr #3 |
| ; ARM-NEXT: add r4, sp, #16 |
| ; ARM-NEXT: ldr r12, [sp, #120] |
| ; ARM-NEXT: add r7, r4, #16 |
| ; ARM-NEXT: str r5, [sp, #44] |
| ; ARM-NEXT: mvn r4, #0 |
| ; ARM-NEXT: str r5, [sp, #40] |
| ; ARM-NEXT: and lr, lr, #31 |
| ; ARM-NEXT: str r12, [sp, #32] |
| ; ARM-NEXT: eor r6, lr, #31 |
| ; ARM-NEXT: str r5, [sp, #28] |
| ; ARM-NEXT: str r5, [sp, #24] |
| ; ARM-NEXT: str r5, [sp, #20] |
| ; ARM-NEXT: str r5, [sp, #16] |
| ; ARM-NEXT: str r5, [sp, #76] |
| ; ARM-NEXT: str r5, [sp, #72] |
| ; ARM-NEXT: ldr r12, [r7, -r10]! |
| ; ARM-NEXT: str r4, [sp, #68] |
| ; ARM-NEXT: str r4, [sp, #64] |
| ; ARM-NEXT: str r5, [sp, #60] |
| ; ARM-NEXT: str r5, [sp, #56] |
| ; ARM-NEXT: str r5, [sp, #52] |
| ; ARM-NEXT: ldmib r7, {r4, r8, r9} |
| ; ARM-NEXT: lsr r7, r12, #1 |
| ; ARM-NEXT: str r5, [sp, #48] |
| ; ARM-NEXT: lsl r5, r4, lr |
| ; ARM-NEXT: orr r11, r5, r7, lsr r6 |
| ; ARM-NEXT: add r7, sp, #48 |
| ; ARM-NEXT: add r7, r7, #16 |
| ; ARM-NEXT: ldr r10, [r7, -r10]! |
| ; ARM-NEXT: ldr r5, [r7, #4] |
| ; ARM-NEXT: lsr r3, r10, #1 |
| ; ARM-NEXT: ldr r1, [r7, #8] |
| ; ARM-NEXT: ldr r7, [r7, #12] |
| ; ARM-NEXT: lsl r0, r5, lr |
| ; ARM-NEXT: orr r0, r0, r3, lsr r6 |
| ; ARM-NEXT: bic r0, r2, r0 |
| ; ARM-NEXT: lsrs r2, r4, #1 |
| ; ARM-NEXT: orr r11, r0, r11 |
| ; ARM-NEXT: lsl r0, r8, lr |
| ; ARM-NEXT: orr r0, r0, r2, lsr r6 |
| ; ARM-NEXT: lsl r2, r1, lr |
| ; ARM-NEXT: lsrs r3, r5, #1 |
| ; ARM-NEXT: lsr r1, r1, #1 |
| ; ARM-NEXT: orr r2, r2, r3, lsr r6 |
| ; ARM-NEXT: ldr r3, [sp, #4] @ 4-byte Reload |
| ; ARM-NEXT: bic r2, r3, r2 |
| ; ARM-NEXT: lsr r3, r8, #1 |
| ; ARM-NEXT: orr r2, r2, r0 |
| ; ARM-NEXT: lsl r0, r9, lr |
| ; ARM-NEXT: orr r0, r0, r3, lsr r6 |
| ; ARM-NEXT: lsl r3, r7, lr |
| ; ARM-NEXT: orr r1, r3, r1, lsr r6 |
| ; ARM-NEXT: ldr r3, [sp, #12] @ 4-byte Reload |
| ; ARM-NEXT: bic r1, r3, r1 |
| ; ARM-NEXT: orr r3, r1, r0 |
| ; ARM-NEXT: ldr r0, [sp, #8] @ 4-byte Reload |
| ; ARM-NEXT: mov r1, r11 |
| ; ARM-NEXT: bic r0, r0, r10, lsl lr |
| ; ARM-NEXT: orr r0, r0, r12, lsl lr |
| ; ARM-NEXT: add sp, sp, #84 |
| ; ARM-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_double_var: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-M-NEXT: .pad #84 |
| ; THUMB-M-NEXT: sub sp, #84 |
| ; THUMB-M-NEXT: ldr r6, [sp, #124] |
| ; THUMB-M-NEXT: movs r7, #0 |
| ; THUMB-M-NEXT: strd r2, r3, [sp, #4] @ 8-byte Folded Spill |
| ; THUMB-M-NEXT: add r5, sp, #16 |
| ; THUMB-M-NEXT: str r0, [sp, #12] @ 4-byte Spill |
| ; THUMB-M-NEXT: adds r5, #16 |
| ; THUMB-M-NEXT: str r6, [sp, #36] |
| ; THUMB-M-NEXT: mov r2, r1 |
| ; THUMB-M-NEXT: ldr r6, [sp, #120] |
| ; THUMB-M-NEXT: str r6, [sp, #32] |
| ; THUMB-M-NEXT: mov.w r6, #-1 |
| ; THUMB-M-NEXT: strd r7, r7, [sp, #40] |
| ; THUMB-M-NEXT: strd r7, r7, [sp, #24] |
| ; THUMB-M-NEXT: strd r7, r7, [sp, #16] |
| ; THUMB-M-NEXT: strd r6, r6, [sp, #64] |
| ; THUMB-M-NEXT: ldr r6, [sp, #128] |
| ; THUMB-M-NEXT: strd r7, r7, [sp, #72] |
| ; THUMB-M-NEXT: strd r7, r7, [sp, #56] |
| ; THUMB-M-NEXT: and lr, r6, #31 |
| ; THUMB-M-NEXT: strd r7, r7, [sp, #48] |
| ; THUMB-M-NEXT: movs r7, #12 |
| ; THUMB-M-NEXT: and.w r7, r7, r6, lsr #3 |
| ; THUMB-M-NEXT: subs r5, r5, r7 |
| ; THUMB-M-NEXT: ldrd r12, r10, [r5] |
| ; THUMB-M-NEXT: ldrd r9, r8, [r5, #8] |
| ; THUMB-M-NEXT: eor r5, lr, #31 |
| ; THUMB-M-NEXT: lsl.w r6, r10, lr |
| ; THUMB-M-NEXT: lsr.w r4, r12, #1 |
| ; THUMB-M-NEXT: lsrs r4, r5 |
| ; THUMB-M-NEXT: orr.w r11, r6, r4 |
| ; THUMB-M-NEXT: add r6, sp, #48 |
| ; THUMB-M-NEXT: adds r6, #16 |
| ; THUMB-M-NEXT: subs r7, r6, r7 |
| ; THUMB-M-NEXT: ldrd r6, r4, [r7] |
| ; THUMB-M-NEXT: lsl.w r0, r4, lr |
| ; THUMB-M-NEXT: ldrd r1, r7, [r7, #8] |
| ; THUMB-M-NEXT: lsrs r3, r6, #1 |
| ; THUMB-M-NEXT: lsrs r3, r5 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: bic.w r0, r2, r0 |
| ; THUMB-M-NEXT: lsrs.w r2, r10, #1 |
| ; THUMB-M-NEXT: lsrs.w r3, r4, #1 |
| ; THUMB-M-NEXT: orr.w r11, r11, r0 |
| ; THUMB-M-NEXT: lsl.w r0, r9, lr |
| ; THUMB-M-NEXT: lsrs r2, r5 |
| ; THUMB-M-NEXT: orrs r0, r2 |
| ; THUMB-M-NEXT: lsl.w r2, r1, lr |
| ; THUMB-M-NEXT: lsrs r3, r5 |
| ; THUMB-M-NEXT: orrs r2, r3 |
| ; THUMB-M-NEXT: ldr r3, [sp, #4] @ 4-byte Reload |
| ; THUMB-M-NEXT: lsrs r1, r1, #1 |
| ; THUMB-M-NEXT: lsrs r1, r5 |
| ; THUMB-M-NEXT: bic.w r2, r3, r2 |
| ; THUMB-M-NEXT: lsr.w r3, r9, #1 |
| ; THUMB-M-NEXT: orrs r2, r0 |
| ; THUMB-M-NEXT: lsl.w r0, r8, lr |
| ; THUMB-M-NEXT: lsrs r3, r5 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: lsl.w r3, r7, lr |
| ; THUMB-M-NEXT: orrs r1, r3 |
| ; THUMB-M-NEXT: ldr r3, [sp, #8] @ 4-byte Reload |
| ; THUMB-M-NEXT: ldr r7, [sp, #12] @ 4-byte Reload |
| ; THUMB-M-NEXT: bic.w r1, r3, r1 |
| ; THUMB-M-NEXT: orr.w r3, r1, r0 |
| ; THUMB-M-NEXT: lsl.w r1, r6, lr |
| ; THUMB-M-NEXT: lsl.w r0, r12, lr |
| ; THUMB-M-NEXT: bic.w r1, r7, r1 |
| ; THUMB-M-NEXT: orrs r0, r1 |
| ; THUMB-M-NEXT: mov r1, r11 |
| ; THUMB-M-NEXT: add sp, #84 |
| ; THUMB-M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc} |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_double_var: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-A-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-A-NEXT: .pad #84 |
| ; THUMB-A-NEXT: sub sp, #84 |
| ; THUMB-A-NEXT: ldr.w lr, [sp, #128] |
| ; THUMB-A-NEXT: movs r6, #0 |
| ; THUMB-A-NEXT: ldrd r7, r5, [sp, #120] |
| ; THUMB-A-NEXT: strd r3, r0, [sp, #8] @ 8-byte Folded Spill |
| ; THUMB-A-NEXT: strd r7, r5, [sp, #32] |
| ; THUMB-A-NEXT: movs r7, #12 |
| ; THUMB-A-NEXT: and.w r5, r7, lr, lsr #3 |
| ; THUMB-A-NEXT: add r7, sp, #16 |
| ; THUMB-A-NEXT: adds r7, #16 |
| ; THUMB-A-NEXT: strd r6, r6, [sp, #40] |
| ; THUMB-A-NEXT: subs r4, r7, r5 |
| ; THUMB-A-NEXT: strd r6, r6, [sp, #24] |
| ; THUMB-A-NEXT: strd r6, r6, [sp, #16] |
| ; THUMB-A-NEXT: and lr, lr, #31 |
| ; THUMB-A-NEXT: strd r6, r6, [sp, #72] |
| ; THUMB-A-NEXT: ldr r0, [r4] |
| ; THUMB-A-NEXT: str r0, [sp, #4] @ 4-byte Spill |
| ; THUMB-A-NEXT: ldrd r10, r9, [r4, #4] |
| ; THUMB-A-NEXT: ldr r3, [r4, #12] |
| ; THUMB-A-NEXT: mov.w r4, #-1 |
| ; THUMB-A-NEXT: str r3, [sp] @ 4-byte Spill |
| ; THUMB-A-NEXT: strd r6, r6, [sp, #56] |
| ; THUMB-A-NEXT: lsl.w r7, r10, lr |
| ; THUMB-A-NEXT: strd r6, r6, [sp, #48] |
| ; THUMB-A-NEXT: eor r6, lr, #31 |
| ; THUMB-A-NEXT: strd r4, r4, [sp, #64] |
| ; THUMB-A-NEXT: lsrs r4, r0, #1 |
| ; THUMB-A-NEXT: lsrs r4, r6 |
| ; THUMB-A-NEXT: orr.w r11, r7, r4 |
| ; THUMB-A-NEXT: add r7, sp, #48 |
| ; THUMB-A-NEXT: adds r7, #16 |
| ; THUMB-A-NEXT: subs r7, r7, r5 |
| ; THUMB-A-NEXT: ldrd r5, r4, [r7] |
| ; THUMB-A-NEXT: ldrd r0, r12, [r7, #8] |
| ; THUMB-A-NEXT: lsl.w r3, r4, lr |
| ; THUMB-A-NEXT: lsrs.w r7, r10, #1 |
| ; THUMB-A-NEXT: lsrs.w r4, r4, #1 |
| ; THUMB-A-NEXT: lsr.w r8, r5, #1 |
| ; THUMB-A-NEXT: lsrs r7, r6 |
| ; THUMB-A-NEXT: lsr.w r8, r8, r6 |
| ; THUMB-A-NEXT: orr.w r3, r3, r8 |
| ; THUMB-A-NEXT: bics r1, r3 |
| ; THUMB-A-NEXT: lsl.w r3, r9, lr |
| ; THUMB-A-NEXT: lsrs r4, r6 |
| ; THUMB-A-NEXT: orrs r3, r7 |
| ; THUMB-A-NEXT: lsl.w r7, r0, lr |
| ; THUMB-A-NEXT: orrs r4, r7 |
| ; THUMB-A-NEXT: bics r2, r4 |
| ; THUMB-A-NEXT: lsrs r0, r0, #1 |
| ; THUMB-A-NEXT: orrs r2, r3 |
| ; THUMB-A-NEXT: ldr r3, [sp] @ 4-byte Reload |
| ; THUMB-A-NEXT: lsl.w r7, r12, lr |
| ; THUMB-A-NEXT: lsrs r0, r6 |
| ; THUMB-A-NEXT: orrs r0, r7 |
| ; THUMB-A-NEXT: ldr r7, [sp, #8] @ 4-byte Reload |
| ; THUMB-A-NEXT: lsr.w r4, r9, #1 |
| ; THUMB-A-NEXT: lsl.w r3, r3, lr |
| ; THUMB-A-NEXT: lsrs r4, r6 |
| ; THUMB-A-NEXT: bic.w r0, r7, r0 |
| ; THUMB-A-NEXT: orrs r3, r4 |
| ; THUMB-A-NEXT: ldr r7, [sp, #12] @ 4-byte Reload |
| ; THUMB-A-NEXT: orrs r3, r0 |
| ; THUMB-A-NEXT: lsl.w r0, r5, lr |
| ; THUMB-A-NEXT: bic.w r0, r7, r0 |
| ; THUMB-A-NEXT: ldr r7, [sp, #4] @ 4-byte Reload |
| ; THUMB-A-NEXT: orr.w r1, r1, r11 |
| ; THUMB-A-NEXT: lsl.w r7, r7, lr |
| ; THUMB-A-NEXT: orrs r0, r7 |
| ; THUMB-A-NEXT: add sp, #84 |
| ; THUMB-A-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc} |
| %result = bitinsert b128 %base, double %val, i32 %off |
| ret b128 %result |
| } |
| |
| define b231 @test_bitinsert_double_b231_var(b231 %base, double %val, i32 %off) { |
| ; ARM-LABEL: test_bitinsert_double_b231_var: |
| ; ARM: @ %bb.0: |
| ; ARM-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; ARM-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; ARM-NEXT: .pad #164 |
| ; ARM-NEXT: sub sp, sp, #164 |
| ; ARM-NEXT: mov r4, #0 |
| ; ARM-NEXT: mov r5, r0 |
| ; ARM-NEXT: mvn r0, #0 |
| ; ARM-NEXT: ldr r7, [sp, #224] |
| ; ARM-NEXT: ldr r1, [sp, #232] |
| ; ARM-NEXT: str r4, [sp, #156] |
| ; ARM-NEXT: str r4, [sp, #152] |
| ; ARM-NEXT: str r4, [sp, #148] |
| ; ARM-NEXT: str r4, [sp, #144] |
| ; ARM-NEXT: str r4, [sp, #140] |
| ; ARM-NEXT: str r4, [sp, #136] |
| ; ARM-NEXT: str r0, [sp, #132] |
| ; ARM-NEXT: str r0, [sp, #128] |
| ; ARM-NEXT: mov r0, #28 |
| ; ARM-NEXT: str r4, [sp, #124] |
| ; ARM-NEXT: and r0, r0, r1, lsr #3 |
| ; ARM-NEXT: str r4, [sp, #120] |
| ; ARM-NEXT: and r1, r1, #31 |
| ; ARM-NEXT: str r4, [sp, #116] |
| ; ARM-NEXT: str r4, [sp, #112] |
| ; ARM-NEXT: str r4, [sp, #108] |
| ; ARM-NEXT: str r4, [sp, #104] |
| ; ARM-NEXT: str r4, [sp, #100] |
| ; ARM-NEXT: str r4, [sp, #96] |
| ; ARM-NEXT: str r7, [sp, #64] |
| ; ARM-NEXT: add r7, sp, #32 |
| ; ARM-NEXT: add r12, r7, #32 |
| ; ARM-NEXT: add r7, sp, #96 |
| ; ARM-NEXT: ldr r6, [sp, #228] |
| ; ARM-NEXT: add lr, r7, #32 |
| ; ARM-NEXT: str r4, [sp, #92] |
| ; ARM-NEXT: str r4, [sp, #88] |
| ; ARM-NEXT: str r4, [sp, #84] |
| ; ARM-NEXT: str r4, [sp, #80] |
| ; ARM-NEXT: str r4, [sp, #76] |
| ; ARM-NEXT: str r4, [sp, #72] |
| ; ARM-NEXT: str r6, [sp, #68] |
| ; ARM-NEXT: str r4, [sp, #60] |
| ; ARM-NEXT: str r4, [sp, #56] |
| ; ARM-NEXT: str r4, [sp, #52] |
| ; ARM-NEXT: str r4, [sp, #48] |
| ; ARM-NEXT: str r4, [sp, #44] |
| ; ARM-NEXT: str r4, [sp, #40] |
| ; ARM-NEXT: str r4, [sp, #36] |
| ; ARM-NEXT: str r4, [sp, #32] |
| ; ARM-NEXT: ldr r8, [lr, -r0]! |
| ; ARM-NEXT: ldr r0, [r12, -r0]! |
| ; ARM-NEXT: ldr r7, [sp, #216] |
| ; ARM-NEXT: bic r2, r2, r8, lsl r1 |
| ; ARM-NEXT: orr r2, r2, r0, lsl r1 |
| ; ARM-NEXT: str r2, [r5] |
| ; ARM-NEXT: ldr r2, [r12, #4] |
| ; ARM-NEXT: lsr r0, r0, #1 |
| ; ARM-NEXT: str r2, [sp, #28] @ 4-byte Spill |
| ; ARM-NEXT: ldr r4, [r12, #8] |
| ; ARM-NEXT: str r4, [sp, #12] @ 4-byte Spill |
| ; ARM-NEXT: lsl r6, r2, r1 |
| ; ARM-NEXT: ldr r4, [r12, #12] |
| ; ARM-NEXT: eor r2, r1, #31 |
| ; ARM-NEXT: str r4, [sp, #4] @ 4-byte Spill |
| ; ARM-NEXT: orr r4, r6, r0, lsr r2 |
| ; ARM-NEXT: ldr r0, [lr, #4] |
| ; ARM-NEXT: ldr r10, [r12, #16] |
| ; ARM-NEXT: str r0, [sp, #20] @ 4-byte Spill |
| ; ARM-NEXT: ldr r6, [lr, #8] |
| ; ARM-NEXT: lsl r0, r0, r1 |
| ; ARM-NEXT: str r6, [sp, #8] @ 4-byte Spill |
| ; ARM-NEXT: lsr r6, r8, #1 |
| ; ARM-NEXT: orr r0, r0, r6, lsr r2 |
| ; ARM-NEXT: ldr r11, [lr, #12] |
| ; ARM-NEXT: bic r0, r3, r0 |
| ; ARM-NEXT: ldr r9, [lr, #16] |
| ; ARM-NEXT: orr r0, r0, r4 |
| ; ARM-NEXT: str r0, [r5, #4] |
| ; ARM-NEXT: ldr r0, [r12, #24] |
| ; ARM-NEXT: str r0, [sp, #24] @ 4-byte Spill |
| ; ARM-NEXT: ldr r3, [r12, #20] |
| ; ARM-NEXT: lsl r6, r0, r1 |
| ; ARM-NEXT: lsrs r0, r3, #1 |
| ; ARM-NEXT: orr r4, r6, r0, lsr r2 |
| ; ARM-NEXT: ldr r0, [lr, #24] |
| ; ARM-NEXT: str r0, [sp, #16] @ 4-byte Spill |
| ; ARM-NEXT: ldr r6, [lr, #20] |
| ; ARM-NEXT: lsl r0, r0, r1 |
| ; ARM-NEXT: lsrs r8, r6, #1 |
| ; ARM-NEXT: orr r0, r0, r8, lsr r2 |
| ; ARM-NEXT: bic r0, r7, r0 |
| ; ARM-NEXT: orr r0, r0, r4 |
| ; ARM-NEXT: str r0, [r5, #24] |
| ; ARM-NEXT: lsl r0, r3, r1 |
| ; ARM-NEXT: lsr r3, r10, #1 |
| ; ARM-NEXT: orr r0, r0, r3, lsr r2 |
| ; ARM-NEXT: lsl r3, r6, r1 |
| ; ARM-NEXT: lsr r4, r9, #1 |
| ; ARM-NEXT: orr r3, r3, r4, lsr r2 |
| ; ARM-NEXT: ldr r4, [sp, #212] |
| ; ARM-NEXT: bic r3, r4, r3 |
| ; ARM-NEXT: orr r0, r3, r0 |
| ; ARM-NEXT: str r0, [r5, #20] |
| ; ARM-NEXT: ldr r6, [sp, #4] @ 4-byte Reload |
| ; ARM-NEXT: lsl r0, r10, r1 |
| ; ARM-NEXT: lsrs r3, r6, #1 |
| ; ARM-NEXT: orr r0, r0, r3, lsr r2 |
| ; ARM-NEXT: lsl r3, r9, r1 |
| ; ARM-NEXT: lsrs r4, r11, #1 |
| ; ARM-NEXT: orr r3, r3, r4, lsr r2 |
| ; ARM-NEXT: ldr r4, [sp, #208] |
| ; ARM-NEXT: bic r3, r4, r3 |
| ; ARM-NEXT: orr r0, r3, r0 |
| ; ARM-NEXT: str r0, [r5, #16] |
| ; ARM-NEXT: lsl r0, r6, r1 |
| ; ARM-NEXT: ldr r6, [sp, #12] @ 4-byte Reload |
| ; ARM-NEXT: ldr r7, [sp, #8] @ 4-byte Reload |
| ; ARM-NEXT: lsr r3, r6, #1 |
| ; ARM-NEXT: orr r0, r0, r3, lsr r2 |
| ; ARM-NEXT: lsl r3, r11, r1 |
| ; ARM-NEXT: lsr r4, r7, #1 |
| ; ARM-NEXT: orr r3, r3, r4, lsr r2 |
| ; ARM-NEXT: ldr r4, [sp, #204] |
| ; ARM-NEXT: bic r3, r4, r3 |
| ; ARM-NEXT: orr r0, r3, r0 |
| ; ARM-NEXT: str r0, [r5, #12] |
| ; ARM-NEXT: ldr r3, [sp, #28] @ 4-byte Reload |
| ; ARM-NEXT: lsl r0, r6, r1 |
| ; ARM-NEXT: ldr r4, [sp, #20] @ 4-byte Reload |
| ; ARM-NEXT: ldr r6, [sp, #220] |
| ; ARM-NEXT: lsrs r3, r3, #1 |
| ; ARM-NEXT: orr r0, r0, r3, lsr r2 |
| ; ARM-NEXT: lsl r3, r7, r1 |
| ; ARM-NEXT: lsrs r4, r4, #1 |
| ; ARM-NEXT: ldr r7, [r12, #28] |
| ; ARM-NEXT: orr r3, r3, r4, lsr r2 |
| ; ARM-NEXT: ldr r4, [sp, #200] |
| ; ARM-NEXT: bic r3, r4, r3 |
| ; ARM-NEXT: orr r0, r3, r0 |
| ; ARM-NEXT: ldr r3, [lr, #28] |
| ; ARM-NEXT: str r0, [r5, #8] |
| ; ARM-NEXT: lsl r0, r7, r1 |
| ; ARM-NEXT: ldr r7, [sp, #24] @ 4-byte Reload |
| ; ARM-NEXT: lsl r1, r3, r1 |
| ; ARM-NEXT: ldr r3, [sp, #16] @ 4-byte Reload |
| ; ARM-NEXT: lsr r7, r7, #1 |
| ; ARM-NEXT: lsr r3, r3, #1 |
| ; ARM-NEXT: orr r0, r0, r7, lsr r2 |
| ; ARM-NEXT: orr r1, r1, r3, lsr r2 |
| ; ARM-NEXT: bic r1, r6, r1 |
| ; ARM-NEXT: orr r0, r1, r0 |
| ; ARM-NEXT: and r0, r0, #127 |
| ; ARM-NEXT: strb r0, [r5, #28] |
| ; ARM-NEXT: add sp, sp, #164 |
| ; ARM-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} |
| ; |
| ; THUMB-M-LABEL: test_bitinsert_double_b231_var: |
| ; THUMB-M: @ %bb.0: |
| ; THUMB-M-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-M-NEXT: .pad #164 |
| ; THUMB-M-NEXT: sub sp, #164 |
| ; THUMB-M-NEXT: str r3, [sp, #28] @ 4-byte Spill |
| ; THUMB-M-NEXT: movs r1, #0 |
| ; THUMB-M-NEXT: ldr r3, [sp, #228] |
| ; THUMB-M-NEXT: add r7, sp, #32 |
| ; THUMB-M-NEXT: str r3, [sp, #68] |
| ; THUMB-M-NEXT: adds r7, #32 |
| ; THUMB-M-NEXT: ldr r3, [sp, #224] |
| ; THUMB-M-NEXT: mov r8, r0 |
| ; THUMB-M-NEXT: str r3, [sp, #64] |
| ; THUMB-M-NEXT: mov.w r3, #-1 |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #88] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #80] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #72] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #56] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #48] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #40] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #32] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #152] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #144] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #136] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #120] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #112] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #104] |
| ; THUMB-M-NEXT: strd r1, r1, [sp, #96] |
| ; THUMB-M-NEXT: ldr r1, [sp, #232] |
| ; THUMB-M-NEXT: strd r3, r3, [sp, #128] |
| ; THUMB-M-NEXT: movs r3, #28 |
| ; THUMB-M-NEXT: and.w r3, r3, r1, lsr #3 |
| ; THUMB-M-NEXT: and r1, r1, #31 |
| ; THUMB-M-NEXT: subs r4, r7, r3 |
| ; THUMB-M-NEXT: ldr r0, [r4] |
| ; THUMB-M-NEXT: str r0, [sp, #24] @ 4-byte Spill |
| ; THUMB-M-NEXT: ldr r7, [r4, #4] |
| ; THUMB-M-NEXT: str r7, [sp, #8] @ 4-byte Spill |
| ; THUMB-M-NEXT: lsl.w r5, r0, r1 |
| ; THUMB-M-NEXT: ldr r7, [r4, #8] |
| ; THUMB-M-NEXT: str r7, [sp] @ 4-byte Spill |
| ; THUMB-M-NEXT: add r7, sp, #96 |
| ; THUMB-M-NEXT: adds r7, #32 |
| ; THUMB-M-NEXT: ldr.w r10, [r4, #12] |
| ; THUMB-M-NEXT: sub.w lr, r7, r3 |
| ; THUMB-M-NEXT: ldr.w r0, [lr] |
| ; THUMB-M-NEXT: str r0, [sp, #16] @ 4-byte Spill |
| ; THUMB-M-NEXT: ldr.w r3, [lr, #4] |
| ; THUMB-M-NEXT: str r3, [sp, #4] @ 4-byte Spill |
| ; THUMB-M-NEXT: lsl.w r6, r0, r1 |
| ; THUMB-M-NEXT: bics r2, r6 |
| ; THUMB-M-NEXT: ldrd r11, r9, [lr, #8] |
| ; THUMB-M-NEXT: orrs r2, r5 |
| ; THUMB-M-NEXT: str.w r2, [r8] |
| ; THUMB-M-NEXT: ldr r0, [r4, #24] |
| ; THUMB-M-NEXT: eor r2, r1, #31 |
| ; THUMB-M-NEXT: str r0, [sp, #20] @ 4-byte Spill |
| ; THUMB-M-NEXT: ldr.w r12, [r4, #20] |
| ; THUMB-M-NEXT: lsl.w r5, r0, r1 |
| ; THUMB-M-NEXT: ldr.w r0, [lr, #24] |
| ; THUMB-M-NEXT: str r0, [sp, #12] @ 4-byte Spill |
| ; THUMB-M-NEXT: lsrs.w r3, r12, #1 |
| ; THUMB-M-NEXT: lsrs r3, r2 |
| ; THUMB-M-NEXT: orrs r5, r3 |
| ; THUMB-M-NEXT: lsl.w r3, r0, r1 |
| ; THUMB-M-NEXT: ldr.w r0, [lr, #20] |
| ; THUMB-M-NEXT: lsrs.w r6, r0, #1 |
| ; THUMB-M-NEXT: lsls r0, r1 |
| ; THUMB-M-NEXT: lsrs r6, r2 |
| ; THUMB-M-NEXT: orrs r3, r6 |
| ; THUMB-M-NEXT: ldr r6, [sp, #216] |
| ; THUMB-M-NEXT: bic.w r3, r6, r3 |
| ; THUMB-M-NEXT: orrs r3, r5 |
| ; THUMB-M-NEXT: str.w r3, [r8, #24] |
| ; THUMB-M-NEXT: ldr r6, [r4, #16] |
| ; THUMB-M-NEXT: lsl.w r3, r12, r1 |
| ; THUMB-M-NEXT: lsrs r5, r6, #1 |
| ; THUMB-M-NEXT: lsrs r5, r2 |
| ; THUMB-M-NEXT: orrs r3, r5 |
| ; THUMB-M-NEXT: ldr.w r5, [lr, #16] |
| ; THUMB-M-NEXT: lsrs r7, r5, #1 |
| ; THUMB-M-NEXT: lsrs r7, r2 |
| ; THUMB-M-NEXT: orrs r0, r7 |
| ; THUMB-M-NEXT: ldr r7, [sp, #212] |
| ; THUMB-M-NEXT: bic.w r0, r7, r0 |
| ; THUMB-M-NEXT: lsrs.w r7, r9, #1 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: lsrs.w r3, r10, #1 |
| ; THUMB-M-NEXT: str.w r0, [r8, #20] |
| ; THUMB-M-NEXT: lsl.w r0, r6, r1 |
| ; THUMB-M-NEXT: lsrs r3, r2 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: lsl.w r3, r5, r1 |
| ; THUMB-M-NEXT: lsrs r7, r2 |
| ; THUMB-M-NEXT: orrs r3, r7 |
| ; THUMB-M-NEXT: ldr r7, [sp, #208] |
| ; THUMB-M-NEXT: bic.w r3, r7, r3 |
| ; THUMB-M-NEXT: lsr.w r7, r11, #1 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: str.w r0, [r8, #16] |
| ; THUMB-M-NEXT: ldr r6, [sp] @ 4-byte Reload |
| ; THUMB-M-NEXT: lsl.w r0, r10, r1 |
| ; THUMB-M-NEXT: lsrs r7, r2 |
| ; THUMB-M-NEXT: lsrs r3, r6, #1 |
| ; THUMB-M-NEXT: lsrs r3, r2 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: lsl.w r3, r9, r1 |
| ; THUMB-M-NEXT: orrs r3, r7 |
| ; THUMB-M-NEXT: ldr r7, [sp, #204] |
| ; THUMB-M-NEXT: bic.w r3, r7, r3 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: str.w r0, [r8, #12] |
| ; THUMB-M-NEXT: lsl.w r0, r6, r1 |
| ; THUMB-M-NEXT: ldr r6, [sp, #8] @ 4-byte Reload |
| ; THUMB-M-NEXT: ldr r5, [sp, #4] @ 4-byte Reload |
| ; THUMB-M-NEXT: lsrs.w r3, r6, #1 |
| ; THUMB-M-NEXT: lsrs.w r7, r5, #1 |
| ; THUMB-M-NEXT: lsrs r3, r2 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: lsl.w r3, r11, r1 |
| ; THUMB-M-NEXT: lsrs r7, r2 |
| ; THUMB-M-NEXT: orrs r3, r7 |
| ; THUMB-M-NEXT: ldr r7, [sp, #200] |
| ; THUMB-M-NEXT: bic.w r3, r7, r3 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: str.w r0, [r8, #8] |
| ; THUMB-M-NEXT: ldr r3, [sp, #24] @ 4-byte Reload |
| ; THUMB-M-NEXT: lsl.w r0, r6, r1 |
| ; THUMB-M-NEXT: ldr r7, [sp, #16] @ 4-byte Reload |
| ; THUMB-M-NEXT: lsrs r3, r3, #1 |
| ; THUMB-M-NEXT: lsrs r7, r7, #1 |
| ; THUMB-M-NEXT: lsrs r3, r2 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: lsl.w r3, r5, r1 |
| ; THUMB-M-NEXT: lsrs r7, r2 |
| ; THUMB-M-NEXT: orrs r3, r7 |
| ; THUMB-M-NEXT: ldr r7, [sp, #28] @ 4-byte Reload |
| ; THUMB-M-NEXT: bic.w r3, r7, r3 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: str.w r0, [r8, #4] |
| ; THUMB-M-NEXT: ldr r3, [sp, #20] @ 4-byte Reload |
| ; THUMB-M-NEXT: ldr r0, [r4, #28] |
| ; THUMB-M-NEXT: lsrs r3, r3, #1 |
| ; THUMB-M-NEXT: lsls r0, r1 |
| ; THUMB-M-NEXT: lsrs r3, r2 |
| ; THUMB-M-NEXT: orrs r0, r3 |
| ; THUMB-M-NEXT: ldr.w r3, [lr, #28] |
| ; THUMB-M-NEXT: lsl.w r1, r3, r1 |
| ; THUMB-M-NEXT: ldr r3, [sp, #12] @ 4-byte Reload |
| ; THUMB-M-NEXT: lsrs r3, r3, #1 |
| ; THUMB-M-NEXT: lsr.w r2, r3, r2 |
| ; THUMB-M-NEXT: orrs r1, r2 |
| ; THUMB-M-NEXT: ldr r2, [sp, #220] |
| ; THUMB-M-NEXT: bic.w r1, r2, r1 |
| ; THUMB-M-NEXT: orrs r0, r1 |
| ; THUMB-M-NEXT: and r0, r0, #127 |
| ; THUMB-M-NEXT: strb.w r0, [r8, #28] |
| ; THUMB-M-NEXT: add sp, #164 |
| ; THUMB-M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc} |
| ; |
| ; THUMB-A-LABEL: test_bitinsert_double_b231_var: |
| ; THUMB-A: @ %bb.0: |
| ; THUMB-A-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-A-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr} |
| ; THUMB-A-NEXT: .pad #172 |
| ; THUMB-A-NEXT: sub sp, #172 |
| ; THUMB-A-NEXT: ldrd r7, r6, [sp, #232] |
| ; THUMB-A-NEXT: mov.w r5, #-1 |
| ; THUMB-A-NEXT: ldr r1, [sp, #240] |
| ; THUMB-A-NEXT: mov lr, r0 |
| ; THUMB-A-NEXT: str r3, [sp, #36] @ 4-byte Spill |
| ; THUMB-A-NEXT: movs r3, #0 |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #160] |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #152] |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #144] |
| ; THUMB-A-NEXT: str r5, [sp, #140] |
| ; THUMB-A-NEXT: strd r3, r5, [sp, #132] |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #124] |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #116] |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #108] |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #100] |
| ; THUMB-A-NEXT: strd r3, r7, [sp, #68] |
| ; THUMB-A-NEXT: movs r7, #28 |
| ; THUMB-A-NEXT: and.w r5, r7, r1, lsr #3 |
| ; THUMB-A-NEXT: add r7, sp, #104 |
| ; THUMB-A-NEXT: adds r7, #32 |
| ; THUMB-A-NEXT: strd r6, r3, [sp, #76] |
| ; THUMB-A-NEXT: sub.w r12, r7, r5 |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #92] |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #84] |
| ; THUMB-A-NEXT: and r1, r1, #31 |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #60] |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #52] |
| ; THUMB-A-NEXT: strd r3, r3, [sp, #44] |
| ; THUMB-A-NEXT: ldr.w r0, [r12] |
| ; THUMB-A-NEXT: str r0, [sp, #32] @ 4-byte Spill |
| ; THUMB-A-NEXT: ldr.w r4, [r12, #4] |
| ; THUMB-A-NEXT: str r4, [sp, #28] @ 4-byte Spill |
| ; THUMB-A-NEXT: ldr.w r4, [r12, #8] |
| ; THUMB-A-NEXT: str r4, [sp, #12] @ 4-byte Spill |
| ; THUMB-A-NEXT: ldr.w r4, [r12, #12] |
| ; THUMB-A-NEXT: str r4, [sp, #4] @ 4-byte Spill |
| ; THUMB-A-NEXT: str r3, [sp, #40] |
| ; THUMB-A-NEXT: lsl.w r3, r0, r1 |
| ; THUMB-A-NEXT: bic.w r9, r2, r3 |
| ; THUMB-A-NEXT: add r2, sp, #40 |
| ; THUMB-A-NEXT: adds r2, #32 |
| ; THUMB-A-NEXT: ldr r6, [sp, #224] |
| ; THUMB-A-NEXT: subs r2, r2, r5 |
| ; THUMB-A-NEXT: ldr r0, [r2] |
| ; THUMB-A-NEXT: str r0, [sp, #16] @ 4-byte Spill |
| ; THUMB-A-NEXT: ldr r3, [r2, #4] |
| ; THUMB-A-NEXT: lsl.w r5, r0, r1 |
| ; THUMB-A-NEXT: str r3, [sp, #8] @ 4-byte Spill |
| ; THUMB-A-NEXT: ldrd r10, r8, [r2, #8] |
| ; THUMB-A-NEXT: orr.w r5, r5, r9 |
| ; THUMB-A-NEXT: str.w r5, [lr] |
| ; THUMB-A-NEXT: eor r5, r1, #31 |
| ; THUMB-A-NEXT: ldr r3, [r2, #20] |
| ; THUMB-A-NEXT: ldr r0, [r2, #24] |
| ; THUMB-A-NEXT: str r0, [sp, #24] @ 4-byte Spill |
| ; THUMB-A-NEXT: lsrs.w r9, r3, #1 |
| ; THUMB-A-NEXT: ldr.w r4, [r12, #24] |
| ; THUMB-A-NEXT: lsr.w r11, r9, r5 |
| ; THUMB-A-NEXT: lsl.w r9, r0, r1 |
| ; THUMB-A-NEXT: ldr.w r0, [r12, #20] |
| ; THUMB-A-NEXT: orr.w r9, r9, r11 |
| ; THUMB-A-NEXT: lsl.w r11, r4, r1 |
| ; THUMB-A-NEXT: str r4, [sp, #20] @ 4-byte Spill |
| ; THUMB-A-NEXT: lsls r3, r1 |
| ; THUMB-A-NEXT: lsrs.w r7, r0, #1 |
| ; THUMB-A-NEXT: lsls r0, r1 |
| ; THUMB-A-NEXT: lsrs r7, r5 |
| ; THUMB-A-NEXT: orr.w r7, r7, r11 |
| ; THUMB-A-NEXT: bics r6, r7 |
| ; THUMB-A-NEXT: orr.w r6, r6, r9 |
| ; THUMB-A-NEXT: str.w r6, [lr, #24] |
| ; THUMB-A-NEXT: ldr r6, [r2, #16] |
| ; THUMB-A-NEXT: lsrs r7, r6, #1 |
| ; THUMB-A-NEXT: lsrs r7, r5 |
| ; THUMB-A-NEXT: orrs r3, r7 |
| ; THUMB-A-NEXT: ldr.w r7, [r12, #16] |
| ; THUMB-A-NEXT: lsrs r4, r7, #1 |
| ; THUMB-A-NEXT: lsrs r4, r5 |
| ; THUMB-A-NEXT: orrs r0, r4 |
| ; THUMB-A-NEXT: ldr r4, [sp, #220] |
| ; THUMB-A-NEXT: bic.w r0, r4, r0 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: lsrs.w r3, r8, #1 |
| ; THUMB-A-NEXT: str.w r0, [lr, #20] |
| ; THUMB-A-NEXT: lsl.w r0, r6, r1 |
| ; THUMB-A-NEXT: lsrs r3, r5 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: lsl.w r3, r7, r1 |
| ; THUMB-A-NEXT: ldr r7, [sp, #4] @ 4-byte Reload |
| ; THUMB-A-NEXT: lsrs.w r4, r7, #1 |
| ; THUMB-A-NEXT: lsrs r4, r5 |
| ; THUMB-A-NEXT: orrs r3, r4 |
| ; THUMB-A-NEXT: ldr r4, [sp, #216] |
| ; THUMB-A-NEXT: bic.w r3, r4, r3 |
| ; THUMB-A-NEXT: lsl.w r4, r7, r1 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: str.w r0, [lr, #16] |
| ; THUMB-A-NEXT: ldr r6, [sp, #12] @ 4-byte Reload |
| ; THUMB-A-NEXT: lsr.w r0, r10, #1 |
| ; THUMB-A-NEXT: lsrs r0, r5 |
| ; THUMB-A-NEXT: lsl.w r3, r8, r1 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: lsrs r3, r6, #1 |
| ; THUMB-A-NEXT: lsrs r3, r5 |
| ; THUMB-A-NEXT: orrs r3, r4 |
| ; THUMB-A-NEXT: ldr r4, [sp, #212] |
| ; THUMB-A-NEXT: bic.w r3, r4, r3 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: str.w r0, [lr, #12] |
| ; THUMB-A-NEXT: ldr r7, [sp, #8] @ 4-byte Reload |
| ; THUMB-A-NEXT: lsl.w r0, r10, r1 |
| ; THUMB-A-NEXT: lsrs.w r3, r7, #1 |
| ; THUMB-A-NEXT: lsrs r3, r5 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: lsl.w r3, r6, r1 |
| ; THUMB-A-NEXT: ldr r6, [sp, #28] @ 4-byte Reload |
| ; THUMB-A-NEXT: lsrs.w r4, r6, #1 |
| ; THUMB-A-NEXT: lsrs r4, r5 |
| ; THUMB-A-NEXT: orrs r3, r4 |
| ; THUMB-A-NEXT: ldr r4, [sp, #208] |
| ; THUMB-A-NEXT: bic.w r3, r4, r3 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: str.w r0, [lr, #8] |
| ; THUMB-A-NEXT: ldr r3, [sp, #16] @ 4-byte Reload |
| ; THUMB-A-NEXT: lsl.w r0, r7, r1 |
| ; THUMB-A-NEXT: ldr r4, [sp, #32] @ 4-byte Reload |
| ; THUMB-A-NEXT: ldr r2, [r2, #28] |
| ; THUMB-A-NEXT: lsrs r3, r3, #1 |
| ; THUMB-A-NEXT: ldr r7, [sp, #228] |
| ; THUMB-A-NEXT: lsrs r4, r4, #1 |
| ; THUMB-A-NEXT: lsrs r3, r5 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: lsl.w r3, r6, r1 |
| ; THUMB-A-NEXT: lsrs r4, r5 |
| ; THUMB-A-NEXT: orrs r3, r4 |
| ; THUMB-A-NEXT: ldr r4, [sp, #36] @ 4-byte Reload |
| ; THUMB-A-NEXT: bic.w r3, r4, r3 |
| ; THUMB-A-NEXT: orrs r0, r3 |
| ; THUMB-A-NEXT: ldr.w r3, [r12, #28] |
| ; THUMB-A-NEXT: str.w r0, [lr, #4] |
| ; THUMB-A-NEXT: lsl.w r0, r2, r1 |
| ; THUMB-A-NEXT: ldr r2, [sp, #24] @ 4-byte Reload |
| ; THUMB-A-NEXT: lsl.w r1, r3, r1 |
| ; THUMB-A-NEXT: lsrs r2, r2, #1 |
| ; THUMB-A-NEXT: lsrs r2, r5 |
| ; THUMB-A-NEXT: orrs r0, r2 |
| ; THUMB-A-NEXT: ldr r2, [sp, #20] @ 4-byte Reload |
| ; THUMB-A-NEXT: lsrs r2, r2, #1 |
| ; THUMB-A-NEXT: lsrs r2, r5 |
| ; THUMB-A-NEXT: orrs r1, r2 |
| ; THUMB-A-NEXT: bic.w r1, r7, r1 |
| ; THUMB-A-NEXT: orrs r0, r1 |
| ; THUMB-A-NEXT: and r0, r0, #127 |
| ; THUMB-A-NEXT: strb.w r0, [lr, #28] |
| ; THUMB-A-NEXT: add sp, #172 |
| ; THUMB-A-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc} |
| %result = bitinsert b231 %base, double %val, i32 %off |
| ret b231 %result |
| } |