blob: 455c11f6ed62e3fba35c70242ce7d7256252275d [file]
; 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
}