diff options
Diffstat (limited to 'llvm/test/CodeGen/ARM/and-load-combine.ll')
| -rw-r--r-- | llvm/test/CodeGen/ARM/and-load-combine.ll | 705 |
1 files changed, 358 insertions, 347 deletions
diff --git a/llvm/test/CodeGen/ARM/and-load-combine.ll b/llvm/test/CodeGen/ARM/and-load-combine.ll index 69b00ed4853..dac8e113d32 100644 --- a/llvm/test/CodeGen/ARM/and-load-combine.ll +++ b/llvm/test/CodeGen/ARM/and-load-combine.ll @@ -7,41 +7,40 @@ define arm_aapcscc zeroext i1 @cmp_xor8_short_short(i16* nocapture readonly %a, i16* nocapture readonly %b) { ; ARM-LABEL: cmp_xor8_short_short: -; ARM: ldrb r2, [r0] -; ARM-NEXT: mov r0, #0 +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldrb r0, [r0] ; ARM-NEXT: ldrb r1, [r1] -; ARM-NEXT: teq r1, r2 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: eor r0, r1, r0 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_xor8_short_short: -; ARMEB: ldrb r2, [r0, #1] -; ARMEB-NEXT: mov r0, #0 +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldrb r0, [r0, #1] ; ARMEB-NEXT: ldrb r1, [r1, #1] -; ARMEB-NEXT: teq r1, r2 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: eor r0, r1, r0 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_xor8_short_short: -; THUMB1: ldrb r0, [r0] -; THUMB1-NEXT: ldrb r2, [r1] -; THUMB1-NEXT: eors r2, r0 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r2, #0 -; THUMB1-NEXT: beq .LBB0_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB0_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrb r0, [r0] +; THUMB1-NEXT: ldrb r1, [r1] +; THUMB1-NEXT: eors r1, r0 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_xor8_short_short: -; THUMB2: ldrb r2, [r0] -; THUMB2-NEXT: movs r0, #0 +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrb r0, [r0] ; THUMB2-NEXT: ldrb r1, [r1] -; THUMB2-NEXT: teq.w r1, r2 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: eors r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i16, i16* %a, align 2 @@ -55,41 +54,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_xor8_short_int(i16* nocapture readonly %a, i32* nocapture readonly %b) { ; ARM-LABEL: cmp_xor8_short_int: -; ARM: ldrb r2, [r0] -; ARM-NEXT: mov r0, #0 +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldrb r0, [r0] ; ARM-NEXT: ldrb r1, [r1] -; ARM-NEXT: teq r1, r2 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: eor r0, r1, r0 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_xor8_short_int: -; ARMEB: ldrb r2, [r0, #1] -; ARMEB-NEXT: mov r0, #0 +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldrb r0, [r0, #1] ; ARMEB-NEXT: ldrb r1, [r1, #3] -; ARMEB-NEXT: teq r1, r2 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: eor r0, r1, r0 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_xor8_short_int: -; THUMB1: ldrb r0, [r0] -; THUMB1-NEXT: ldrb r2, [r1] -; THUMB1-NEXT: eors r2, r0 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r2, #0 -; THUMB1-NEXT: beq .LBB1_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB1_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrb r0, [r0] +; THUMB1-NEXT: ldrb r1, [r1] +; THUMB1-NEXT: eors r1, r0 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_xor8_short_int: -; THUMB2: ldrb r2, [r0] -; THUMB2-NEXT: movs r0, #0 +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrb r0, [r0] ; THUMB2-NEXT: ldrb r1, [r1] -; THUMB2-NEXT: teq.w r1, r2 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: eors r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i16, i16* %a, align 2 @@ -104,41 +102,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_xor8_int_int(i32* nocapture readonly %a, i32* nocapture readonly %b) { ; ARM-LABEL: cmp_xor8_int_int: -; ARM: ldrb r2, [r0] -; ARM-NEXT: mov r0, #0 +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldrb r0, [r0] ; ARM-NEXT: ldrb r1, [r1] -; ARM-NEXT: teq r1, r2 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: eor r0, r1, r0 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_xor8_int_int: -; ARMEB: ldrb r2, [r0, #3] -; ARMEB-NEXT: mov r0, #0 +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldrb r0, [r0, #3] ; ARMEB-NEXT: ldrb r1, [r1, #3] -; ARMEB-NEXT: teq r1, r2 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: eor r0, r1, r0 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_xor8_int_int: -; THUMB1: ldrb r0, [r0] -; THUMB1-NEXT: ldrb r2, [r1] -; THUMB1-NEXT: eors r2, r0 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r2, #0 -; THUMB1-NEXT: beq .LBB2_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB2_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrb r0, [r0] +; THUMB1-NEXT: ldrb r1, [r1] +; THUMB1-NEXT: eors r1, r0 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_xor8_int_int: -; THUMB2: ldrb r2, [r0] -; THUMB2-NEXT: movs r0, #0 +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrb r0, [r0] ; THUMB2-NEXT: ldrb r1, [r1] -; THUMB2-NEXT: teq.w r1, r2 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: eors r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i32, i32* %a, align 4 @@ -152,41 +149,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_xor16(i32* nocapture readonly %a, i32* nocapture readonly %b) { ; ARM-LABEL: cmp_xor16: -; ARM: ldrh r2, [r0] -; ARM-NEXT: mov r0, #0 +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldrh r0, [r0] ; ARM-NEXT: ldrh r1, [r1] -; ARM-NEXT: teq r1, r2 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: eor r0, r1, r0 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_xor16: -; ARMEB: ldrh r2, [r0, #2] -; ARMEB-NEXT: mov r0, #0 +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldrh r0, [r0, #2] ; ARMEB-NEXT: ldrh r1, [r1, #2] -; ARMEB-NEXT: teq r1, r2 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: eor r0, r1, r0 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_xor16: -; THUMB1: ldrh r0, [r0] -; THUMB1-NEXT: ldrh r2, [r1] -; THUMB1-NEXT: eors r2, r0 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r2, #0 -; THUMB1-NEXT: beq .LBB3_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB3_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrh r0, [r0] +; THUMB1-NEXT: ldrh r1, [r1] +; THUMB1-NEXT: eors r1, r0 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_xor16: -; THUMB2: ldrh r2, [r0] -; THUMB2-NEXT: movs r0, #0 +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrh r0, [r0] ; THUMB2-NEXT: ldrh r1, [r1] -; THUMB2-NEXT: teq.w r1, r2 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: eors r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i32, i32* %a, align 4 @@ -200,41 +196,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_or8_short_short(i16* nocapture readonly %a, i16* nocapture readonly %b) { ; ARM-LABEL: cmp_or8_short_short: -; ARM: ldrb r0, [r0] +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldrb r0, [r0] ; ARM-NEXT: ldrb r1, [r1] -; ARM-NEXT: orrs r0, r1, r0 -; ARM-NEXT: mov r0, #0 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: orr r0, r1, r0 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_or8_short_short: -; ARMEB: ldrb r0, [r0, #1] +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldrb r0, [r0, #1] ; ARMEB-NEXT: ldrb r1, [r1, #1] -; ARMEB-NEXT: orrs r0, r1, r0 -; ARMEB-NEXT: mov r0, #0 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: orr r0, r1, r0 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_or8_short_short: -; THUMB1: ldrb r0, [r0] -; THUMB1-NEXT: ldrb r2, [r1] -; THUMB1-NEXT: orrs r2, r0 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r2, #0 -; THUMB1-NEXT: beq .LBB4_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB4_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrb r0, [r0] +; THUMB1-NEXT: ldrb r1, [r1] +; THUMB1-NEXT: orrs r1, r0 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_or8_short_short: -; THUMB2: ldrb r0, [r0] +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrb r0, [r0] ; THUMB2-NEXT: ldrb r1, [r1] ; THUMB2-NEXT: orrs r0, r1 -; THUMB2-NEXT: mov.w r0, #0 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i16, i16* %a, align 2 @@ -248,41 +243,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_or8_short_int(i16* nocapture readonly %a, i32* nocapture readonly %b) { ; ARM-LABEL: cmp_or8_short_int: -; ARM: ldrb r0, [r0] +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldrb r0, [r0] ; ARM-NEXT: ldrb r1, [r1] -; ARM-NEXT: orrs r0, r1, r0 -; ARM-NEXT: mov r0, #0 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: orr r0, r1, r0 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_or8_short_int: -; ARMEB: ldrb r0, [r0, #1] +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldrb r0, [r0, #1] ; ARMEB-NEXT: ldrb r1, [r1, #3] -; ARMEB-NEXT: orrs r0, r1, r0 -; ARMEB-NEXT: mov r0, #0 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: orr r0, r1, r0 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_or8_short_int: -; THUMB1: ldrb r0, [r0] -; THUMB1-NEXT: ldrb r2, [r1] -; THUMB1-NEXT: orrs r2, r0 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r2, #0 -; THUMB1-NEXT: beq .LBB5_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB5_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrb r0, [r0] +; THUMB1-NEXT: ldrb r1, [r1] +; THUMB1-NEXT: orrs r1, r0 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_or8_short_int: -; THUMB2: ldrb r0, [r0] +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrb r0, [r0] ; THUMB2-NEXT: ldrb r1, [r1] ; THUMB2-NEXT: orrs r0, r1 -; THUMB2-NEXT: mov.w r0, #0 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i16, i16* %a, align 2 @@ -297,41 +291,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_or8_int_int(i32* nocapture readonly %a, i32* nocapture readonly %b) { ; ARM-LABEL: cmp_or8_int_int: -; ARM: ldrb r0, [r0] +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldrb r0, [r0] ; ARM-NEXT: ldrb r1, [r1] -; ARM-NEXT: orrs r0, r1, r0 -; ARM-NEXT: mov r0, #0 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: orr r0, r1, r0 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_or8_int_int: -; ARMEB: ldrb r0, [r0, #3] +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldrb r0, [r0, #3] ; ARMEB-NEXT: ldrb r1, [r1, #3] -; ARMEB-NEXT: orrs r0, r1, r0 -; ARMEB-NEXT: mov r0, #0 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: orr r0, r1, r0 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_or8_int_int: -; THUMB1: ldrb r0, [r0] -; THUMB1-NEXT: ldrb r2, [r1] -; THUMB1-NEXT: orrs r2, r0 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r2, #0 -; THUMB1-NEXT: beq .LBB6_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB6_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrb r0, [r0] +; THUMB1-NEXT: ldrb r1, [r1] +; THUMB1-NEXT: orrs r1, r0 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_or8_int_int: -; THUMB2: ldrb r0, [r0] +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrb r0, [r0] ; THUMB2-NEXT: ldrb r1, [r1] ; THUMB2-NEXT: orrs r0, r1 -; THUMB2-NEXT: mov.w r0, #0 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i32, i32* %a, align 4 @@ -345,41 +338,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_or16(i32* nocapture readonly %a, i32* nocapture readonly %b) { ; ARM-LABEL: cmp_or16: -; ARM: ldrh r0, [r0] +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldrh r0, [r0] ; ARM-NEXT: ldrh r1, [r1] -; ARM-NEXT: orrs r0, r1, r0 -; ARM-NEXT: mov r0, #0 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: orr r0, r1, r0 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_or16: -; ARMEB: ldrh r0, [r0, #2] +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldrh r0, [r0, #2] ; ARMEB-NEXT: ldrh r1, [r1, #2] -; ARMEB-NEXT: orrs r0, r1, r0 -; ARMEB-NEXT: mov r0, #0 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: orr r0, r1, r0 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_or16: -; THUMB1: ldrh r0, [r0] -; THUMB1-NEXT: ldrh r2, [r1] -; THUMB1-NEXT: orrs r2, r0 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r2, #0 -; THUMB1-NEXT: beq .LBB7_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB7_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrh r0, [r0] +; THUMB1-NEXT: ldrh r1, [r1] +; THUMB1-NEXT: orrs r1, r0 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_or16: -; THUMB2: ldrh r0, [r0] +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrh r0, [r0] ; THUMB2-NEXT: ldrh r1, [r1] ; THUMB2-NEXT: orrs r0, r1 -; THUMB2-NEXT: mov.w r0, #0 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i32, i32* %a, align 4 @@ -393,40 +385,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_and8_short_short(i16* nocapture readonly %a, i16* nocapture readonly %b) { ; ARM-LABEL: cmp_and8_short_short: -; ARM: ldrb r2, [r0] -; ARM-NEXT: mov r0, #0 +; ARM: @ %bb.0: @ %entry ; ARM-NEXT: ldrb r1, [r1] -; ARM-NEXT: tst r2, r1 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: ldrb r0, [r0] +; ARM-NEXT: and r0, r0, r1 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_and8_short_short: -; ARMEB: ldrb r2, [r0, #1] -; ARMEB-NEXT: mov r0, #0 +; ARMEB: @ %bb.0: @ %entry ; ARMEB-NEXT: ldrb r1, [r1, #1] -; ARMEB-NEXT: tst r2, r1 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: ldrb r0, [r0, #1] +; ARMEB-NEXT: and r0, r0, r1 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_and8_short_short: -; THUMB1: ldrb r2, [r1] -; THUMB1-NEXT: ldrb r3, [r0] -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: tst r3, r2 -; THUMB1-NEXT: beq .LBB8_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB8_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrb r1, [r1] +; THUMB1-NEXT: ldrb r2, [r0] +; THUMB1-NEXT: ands r2, r1 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r2 +; THUMB1-NEXT: adcs r0, r2 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_and8_short_short: -; THUMB2: ldrb r2, [r0] -; THUMB2-NEXT: movs r0, #0 +; THUMB2: @ %bb.0: @ %entry ; THUMB2-NEXT: ldrb r1, [r1] -; THUMB2-NEXT: tst r2, r1 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: ldrb r0, [r0] +; THUMB2-NEXT: ands r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i16, i16* %a, align 2 @@ -440,40 +432,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_and8_short_int(i16* nocapture readonly %a, i32* nocapture readonly %b) { ; ARM-LABEL: cmp_and8_short_int: -; ARM: ldrb r2, [r0] -; ARM-NEXT: mov r0, #0 +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldrb r0, [r0] ; ARM-NEXT: ldrb r1, [r1] -; ARM-NEXT: tst r1, r2 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: and r0, r1, r0 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_and8_short_int: -; ARMEB: ldrb r2, [r0, #1] -; ARMEB-NEXT: mov r0, #0 +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldrb r0, [r0, #1] ; ARMEB-NEXT: ldrb r1, [r1, #3] -; ARMEB-NEXT: tst r1, r2 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: and r0, r1, r0 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_and8_short_int: -; THUMB1: ldrb r2, [r0] -; THUMB1-NEXT: ldrb r3, [r1] -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: tst r3, r2 -; THUMB1-NEXT: beq .LBB9_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB9_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrb r0, [r0] +; THUMB1-NEXT: ldrb r1, [r1] +; THUMB1-NEXT: ands r1, r0 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_and8_short_int: -; THUMB2: ldrb r2, [r0] -; THUMB2-NEXT: movs r0, #0 +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrb r0, [r0] ; THUMB2-NEXT: ldrb r1, [r1] -; THUMB2-NEXT: tst r1, r2 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: ands r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i16, i16* %a, align 2 @@ -488,40 +480,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_and8_int_int(i32* nocapture readonly %a, i32* nocapture readonly %b) { ; ARM-LABEL: cmp_and8_int_int: -; ARM: ldrb r2, [r0] -; ARM-NEXT: mov r0, #0 +; ARM: @ %bb.0: @ %entry ; ARM-NEXT: ldrb r1, [r1] -; ARM-NEXT: tst r2, r1 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: ldrb r0, [r0] +; ARM-NEXT: and r0, r0, r1 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_and8_int_int: -; ARMEB: ldrb r2, [r0, #3] -; ARMEB-NEXT: mov r0, #0 +; ARMEB: @ %bb.0: @ %entry ; ARMEB-NEXT: ldrb r1, [r1, #3] -; ARMEB-NEXT: tst r2, r1 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: ldrb r0, [r0, #3] +; ARMEB-NEXT: and r0, r0, r1 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_and8_int_int: -; THUMB1: ldrb r2, [r1] -; THUMB1-NEXT: ldrb r3, [r0] -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: tst r3, r2 -; THUMB1-NEXT: beq .LBB10_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB10_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrb r1, [r1] +; THUMB1-NEXT: ldrb r2, [r0] +; THUMB1-NEXT: ands r2, r1 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r2 +; THUMB1-NEXT: adcs r0, r2 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_and8_int_int: -; THUMB2: ldrb r2, [r0] -; THUMB2-NEXT: movs r0, #0 +; THUMB2: @ %bb.0: @ %entry ; THUMB2-NEXT: ldrb r1, [r1] -; THUMB2-NEXT: tst r2, r1 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: ldrb r0, [r0] +; THUMB2-NEXT: ands r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i32, i32* %a, align 4 @@ -535,40 +527,40 @@ entry: define arm_aapcscc zeroext i1 @cmp_and16(i32* nocapture readonly %a, i32* nocapture readonly %b) { ; ARM-LABEL: cmp_and16: -; ARM: ldrh r2, [r0] -; ARM-NEXT: mov r0, #0 +; ARM: @ %bb.0: @ %entry ; ARM-NEXT: ldrh r1, [r1] -; ARM-NEXT: tst r2, r1 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: ldrh r0, [r0] +; ARM-NEXT: and r0, r0, r1 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: cmp_and16: -; ARMEB: ldrh r2, [r0, #2] -; ARMEB-NEXT: mov r0, #0 +; ARMEB: @ %bb.0: @ %entry ; ARMEB-NEXT: ldrh r1, [r1, #2] -; ARMEB-NEXT: tst r2, r1 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: ldrh r0, [r0, #2] +; ARMEB-NEXT: and r0, r0, r1 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: cmp_and16: -; THUMB1: ldrh r2, [r1] -; THUMB1-NEXT: ldrh r3, [r0] -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: tst r3, r2 -; THUMB1-NEXT: beq .LBB11_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB11_2: @ %entry +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldrh r1, [r1] +; THUMB1-NEXT: ldrh r2, [r0] +; THUMB1-NEXT: ands r2, r1 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r2 +; THUMB1-NEXT: adcs r0, r2 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: cmp_and16: -; THUMB2: ldrh r2, [r0] -; THUMB2-NEXT: movs r0, #0 +; THUMB2: @ %bb.0: @ %entry ; THUMB2-NEXT: ldrh r1, [r1] -; THUMB2-NEXT: tst r2, r1 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: ldrh r0, [r0] +; THUMB2-NEXT: ands r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i32, i32* %a, align 4 @@ -581,28 +573,32 @@ entry: define arm_aapcscc i32 @add_and16(i32* nocapture readonly %a, i32 %y, i32 %z) { ; ARM-LABEL: add_and16: -; ARM: add r1, r1, r2 +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: add r1, r1, r2 ; ARM-NEXT: ldrh r0, [r0] ; ARM-NEXT: uxth r1, r1 ; ARM-NEXT: orr r0, r0, r1 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: add_and16: -; ARMEB: add r1, r1, r2 +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: add r1, r1, r2 ; ARMEB-NEXT: ldrh r0, [r0, #2] ; ARMEB-NEXT: uxth r1, r1 ; ARMEB-NEXT: orr r0, r0, r1 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: add_and16: -; THUMB1: adds r1, r1, r2 +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: adds r1, r1, r2 ; THUMB1-NEXT: uxth r1, r1 ; THUMB1-NEXT: ldrh r0, [r0] ; THUMB1-NEXT: orrs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: add_and16: -; THUMB2: add r1, r2 +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: add r1, r2 ; THUMB2-NEXT: ldrh r0, [r0] ; THUMB2-NEXT: uxth r1, r1 ; THUMB2-NEXT: orrs r0, r1 @@ -617,7 +613,8 @@ entry: define arm_aapcscc i32 @test1(i32* %a, i32* %b, i32 %x, i32 %y) { ; ARM-LABEL: test1: -; ARM: mul r2, r2, r3 +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: mul r2, r2, r3 ; ARM-NEXT: ldrh r1, [r1] ; ARM-NEXT: ldrh r0, [r0] ; ARM-NEXT: eor r0, r0, r1 @@ -626,7 +623,8 @@ define arm_aapcscc i32 @test1(i32* %a, i32* %b, i32 %x, i32 %y) { ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: test1: -; ARMEB: mul r2, r2, r3 +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: mul r2, r2, r3 ; ARMEB-NEXT: ldrh r1, [r1, #2] ; ARMEB-NEXT: ldrh r0, [r0, #2] ; ARMEB-NEXT: eor r0, r0, r1 @@ -635,16 +633,19 @@ define arm_aapcscc i32 @test1(i32* %a, i32* %b, i32 %x, i32 %y) { ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: test1: -; THUMB1: ldrh r1, [r1] +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: push {r4, lr} +; THUMB1-NEXT: ldrh r1, [r1] ; THUMB1-NEXT: ldrh r4, [r0] ; THUMB1-NEXT: eors r4, r1 ; THUMB1-NEXT: muls r2, r3, r2 ; THUMB1-NEXT: uxth r0, r2 ; THUMB1-NEXT: orrs r0, r4 -; THUMB1-NEXT: pop +; THUMB1-NEXT: pop {r4, pc} ; ; THUMB2-LABEL: test1: -; THUMB2: ldrh r1, [r1] +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrh r1, [r1] ; THUMB2-NEXT: ldrh r0, [r0] ; THUMB2-NEXT: eors r0, r1 ; THUMB2-NEXT: mul r1, r2, r3 @@ -663,7 +664,8 @@ entry: define arm_aapcscc i32 @test2(i32* %a, i32* %b, i32 %x, i32 %y) { ; ARM-LABEL: test2: -; ARM: ldr r1, [r1] +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldr r1, [r1] ; ARM-NEXT: ldr r0, [r0] ; ARM-NEXT: mul r1, r2, r1 ; ARM-NEXT: eor r0, r0, r3 @@ -672,7 +674,8 @@ define arm_aapcscc i32 @test2(i32* %a, i32* %b, i32 %x, i32 %y) { ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: test2: -; ARMEB: ldr r1, [r1] +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldr r1, [r1] ; ARMEB-NEXT: ldr r0, [r0] ; ARMEB-NEXT: mul r1, r2, r1 ; ARMEB-NEXT: eor r0, r0, r3 @@ -681,7 +684,8 @@ define arm_aapcscc i32 @test2(i32* %a, i32* %b, i32 %x, i32 %y) { ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: test2: -; THUMB1: ldr r1, [r1] +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldr r1, [r1] ; THUMB1-NEXT: muls r1, r2, r1 ; THUMB1-NEXT: ldr r0, [r0] ; THUMB1-NEXT: eors r0, r3 @@ -690,7 +694,8 @@ define arm_aapcscc i32 @test2(i32* %a, i32* %b, i32 %x, i32 %y) { ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: test2: -; THUMB2: ldr r1, [r1] +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldr r1, [r1] ; THUMB2-NEXT: ldr r0, [r0] ; THUMB2-NEXT: muls r1, r2, r1 ; THUMB2-NEXT: eors r0, r3 @@ -709,7 +714,8 @@ entry: define arm_aapcscc i32 @test3(i32* %a, i32* %b, i32 %x, i16* %y) { ; ARM-LABEL: test3: -; ARM: ldr r0, [r0] +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldr r0, [r0] ; ARM-NEXT: mul r1, r2, r0 ; ARM-NEXT: ldrh r2, [r3] ; ARM-NEXT: eor r0, r0, r2 @@ -718,7 +724,8 @@ define arm_aapcscc i32 @test3(i32* %a, i32* %b, i32 %x, i16* %y) { ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: test3: -; ARMEB: ldr r0, [r0] +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldr r0, [r0] ; ARMEB-NEXT: mul r1, r2, r0 ; ARMEB-NEXT: ldrh r2, [r3] ; ARMEB-NEXT: eor r0, r0, r2 @@ -727,7 +734,8 @@ define arm_aapcscc i32 @test3(i32* %a, i32* %b, i32 %x, i16* %y) { ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: test3: -; THUMB1: ldr r0, [r0] +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: ldr r0, [r0] ; THUMB1-NEXT: muls r2, r0, r2 ; THUMB1-NEXT: ldrh r1, [r3] ; THUMB1-NEXT: eors r1, r0 @@ -736,7 +744,8 @@ define arm_aapcscc i32 @test3(i32* %a, i32* %b, i32 %x, i16* %y) { ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: test3: -; THUMB2: ldr r0, [r0] +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldr r0, [r0] ; THUMB2-NEXT: mul r1, r2, r0 ; THUMB2-NEXT: ldrh r2, [r3] ; THUMB2-NEXT: eors r0, r2 @@ -756,7 +765,8 @@ entry: define arm_aapcscc i32 @test4(i32* %a, i32* %b, i32 %x, i32 %y) { ; ARM-LABEL: test4: -; ARM: mul r2, r2, r3 +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: mul r2, r2, r3 ; ARM-NEXT: ldrh r1, [r1] ; ARM-NEXT: ldrh r0, [r0] ; ARM-NEXT: eor r0, r0, r1 @@ -765,7 +775,8 @@ define arm_aapcscc i32 @test4(i32* %a, i32* %b, i32 %x, i32 %y) { ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: test4: -; ARMEB: mul r2, r2, r3 +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: mul r2, r2, r3 ; ARMEB-NEXT: ldrh r1, [r1, #2] ; ARMEB-NEXT: ldrh r0, [r0, #2] ; ARMEB-NEXT: eor r0, r0, r1 @@ -774,16 +785,19 @@ define arm_aapcscc i32 @test4(i32* %a, i32* %b, i32 %x, i32 %y) { ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: test4: -; THUMB1: ldrh r1, [r1] +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: push {r4, lr} +; THUMB1-NEXT: ldrh r1, [r1] ; THUMB1-NEXT: ldrh r4, [r0] ; THUMB1-NEXT: eors r4, r1 ; THUMB1-NEXT: muls r2, r3, r2 ; THUMB1-NEXT: uxth r0, r2 ; THUMB1-NEXT: orrs r0, r4 -; THUMB1-NEXT: pop +; THUMB1-NEXT: pop {r4, pc} ; ; THUMB2-LABEL: test4: -; THUMB2: ldrh r1, [r1] +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldrh r1, [r1] ; THUMB2-NEXT: ldrh r0, [r0] ; THUMB2-NEXT: eors r0, r1 ; THUMB2-NEXT: mul r1, r2, r3 @@ -802,7 +816,8 @@ entry: define arm_aapcscc i32 @test5(i32* %a, i32* %b, i32 %x, i16 zeroext %y) { ; ARM-LABEL: test5: -; ARM: ldr r1, [r1] +; ARM: @ %bb.0: @ %entry +; ARM-NEXT: ldr r1, [r1] ; ARM-NEXT: ldrh r0, [r0] ; ARM-NEXT: mul r1, r2, r1 ; ARM-NEXT: eor r0, r0, r3 @@ -811,7 +826,8 @@ define arm_aapcscc i32 @test5(i32* %a, i32* %b, i32 %x, i16 zeroext %y) { ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: test5: -; ARMEB: ldr r1, [r1] +; ARMEB: @ %bb.0: @ %entry +; ARMEB-NEXT: ldr r1, [r1] ; ARMEB-NEXT: ldrh r0, [r0, #2] ; ARMEB-NEXT: mul r1, r2, r1 ; ARMEB-NEXT: eor r0, r0, r3 @@ -820,16 +836,19 @@ define arm_aapcscc i32 @test5(i32* %a, i32* %b, i32 %x, i16 zeroext %y) { ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: test5: -; THUMB1: ldrh r4, [r0] +; THUMB1: @ %bb.0: @ %entry +; THUMB1-NEXT: push {r4, lr} +; THUMB1-NEXT: ldrh r4, [r0] ; THUMB1-NEXT: eors r4, r3 ; THUMB1-NEXT: ldr r0, [r1] ; THUMB1-NEXT: muls r0, r2, r0 ; THUMB1-NEXT: uxth r0, r0 ; THUMB1-NEXT: orrs r0, r4 -; THUMB1-NEXT: pop +; THUMB1-NEXT: pop {r4, pc} ; ; THUMB2-LABEL: test5: -; THUMB2: ldr r1, [r1] +; THUMB2: @ %bb.0: @ %entry +; THUMB2-NEXT: ldr r1, [r1] ; THUMB2-NEXT: ldrh r0, [r0] ; THUMB2-NEXT: muls r1, r2, r1 ; THUMB2-NEXT: eors r0, r3 @@ -851,46 +870,42 @@ define arm_aapcscc i1 @test6(i8* %x, i8 %y, i8 %z) { ; ARM-LABEL: test6: ; ARM: @ %bb.0: @ %entry ; ARM-NEXT: ldrb r0, [r0] -; ARM-NEXT: uxtb r2, r2 -; ARM-NEXT: and r1, r0, r1 -; ARM-NEXT: mov r0, #0 -; ARM-NEXT: cmp r1, r2 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: and r0, r0, r1 +; ARM-NEXT: uxtb r1, r2 +; ARM-NEXT: sub r0, r0, r1 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: test6: ; ARMEB: @ %bb.0: @ %entry ; ARMEB-NEXT: ldrb r0, [r0] -; ARMEB-NEXT: uxtb r2, r2 -; ARMEB-NEXT: and r1, r0, r1 -; ARMEB-NEXT: mov r0, #0 -; ARMEB-NEXT: cmp r1, r2 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: and r0, r0, r1 +; ARMEB-NEXT: uxtb r1, r2 +; ARMEB-NEXT: sub r0, r0, r1 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: test6: ; THUMB1: @ %bb.0: @ %entry -; THUMB1-NEXT: ldrb r3, [r0] -; THUMB1-NEXT: ands r3, r1 -; THUMB1-NEXT: uxtb r2, r2 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r3, r2 -; THUMB1-NEXT: beq .LBB18_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB18_2: @ %entry +; THUMB1-NEXT: ldrb r0, [r0] +; THUMB1-NEXT: ands r0, r1 +; THUMB1-NEXT: uxtb r1, r2 +; THUMB1-NEXT: subs r1, r0, r1 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: test6: ; THUMB2: @ %bb.0: @ %entry ; THUMB2-NEXT: ldrb r0, [r0] -; THUMB2-NEXT: uxtb r2, r2 -; THUMB2-NEXT: ands r1, r0 -; THUMB2-NEXT: movs r0, #0 -; THUMB2-NEXT: cmp r1, r2 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: ands r0, r1 +; THUMB2-NEXT: uxtb r1, r2 +; THUMB2-NEXT: subs r0, r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i8, i8* %x, align 4 @@ -903,46 +918,42 @@ define arm_aapcscc i1 @test7(i16* %x, i16 %y, i8 %z) { ; ARM-LABEL: test7: ; ARM: @ %bb.0: @ %entry ; ARM-NEXT: ldrb r0, [r0] -; ARM-NEXT: uxtb r2, r2 -; ARM-NEXT: and r1, r0, r1 -; ARM-NEXT: mov r0, #0 -; ARM-NEXT: cmp r1, r2 -; ARM-NEXT: movweq r0, #1 +; ARM-NEXT: and r0, r0, r1 +; ARM-NEXT: uxtb r1, r2 +; ARM-NEXT: sub r0, r0, r1 +; ARM-NEXT: clz r0, r0 +; ARM-NEXT: lsr r0, r0, #5 ; ARM-NEXT: bx lr ; ; ARMEB-LABEL: test7: ; ARMEB: @ %bb.0: @ %entry ; ARMEB-NEXT: ldrb r0, [r0, #1] -; ARMEB-NEXT: uxtb r2, r2 -; ARMEB-NEXT: and r1, r0, r1 -; ARMEB-NEXT: mov r0, #0 -; ARMEB-NEXT: cmp r1, r2 -; ARMEB-NEXT: movweq r0, #1 +; ARMEB-NEXT: and r0, r0, r1 +; ARMEB-NEXT: uxtb r1, r2 +; ARMEB-NEXT: sub r0, r0, r1 +; ARMEB-NEXT: clz r0, r0 +; ARMEB-NEXT: lsr r0, r0, #5 ; ARMEB-NEXT: bx lr ; ; THUMB1-LABEL: test7: ; THUMB1: @ %bb.0: @ %entry -; THUMB1-NEXT: ldrb r3, [r0] -; THUMB1-NEXT: ands r3, r1 -; THUMB1-NEXT: uxtb r2, r2 -; THUMB1-NEXT: movs r0, #1 -; THUMB1-NEXT: movs r1, #0 -; THUMB1-NEXT: cmp r3, r2 -; THUMB1-NEXT: beq .LBB19_2 -; THUMB1-NEXT: @ %bb.1: @ %entry -; THUMB1-NEXT: mov r0, r1 -; THUMB1-NEXT: .LBB19_2: @ %entry +; THUMB1-NEXT: ldrb r0, [r0] +; THUMB1-NEXT: ands r0, r1 +; THUMB1-NEXT: uxtb r1, r2 +; THUMB1-NEXT: subs r1, r0, r1 +; THUMB1-NEXT: movs r0, #0 +; THUMB1-NEXT: subs r0, r0, r1 +; THUMB1-NEXT: adcs r0, r1 ; THUMB1-NEXT: bx lr ; ; THUMB2-LABEL: test7: ; THUMB2: @ %bb.0: @ %entry ; THUMB2-NEXT: ldrb r0, [r0] -; THUMB2-NEXT: uxtb r2, r2 -; THUMB2-NEXT: ands r1, r0 -; THUMB2-NEXT: movs r0, #0 -; THUMB2-NEXT: cmp r1, r2 -; THUMB2-NEXT: it eq -; THUMB2-NEXT: moveq r0, #1 +; THUMB2-NEXT: ands r0, r1 +; THUMB2-NEXT: uxtb r1, r2 +; THUMB2-NEXT: subs r0, r0, r1 +; THUMB2-NEXT: clz r0, r0 +; THUMB2-NEXT: lsrs r0, r0, #5 ; THUMB2-NEXT: bx lr entry: %0 = load i16, i16* %x, align 4 |

