llvm/llvm/test/CodeGen/ARM/and-load-combine.ll

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=armv7 %s -o - | FileCheck %s --check-prefix=ARM
; RUN: llc -mtriple=armv7eb %s -o - | FileCheck %s --check-prefix=ARMEB
; RUN: llc -mtriple=armv6m %s -o - | FileCheck %s --check-prefix=THUMB1
; RUN: llc -mtriple=thumbv8m.main %s -o - | FileCheck %s --check-prefix=THUMB2

define arm_aapcscc zeroext i1 @cmp_xor8_short_short(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_xor8_short_short:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r0, [r0]
; ARM-NEXT:    ldrb r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r0, [r0, #1]
; ARMEB-NEXT:    ldrb r1, [r1, #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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r0, [r0]
; THUMB1-NEXT:    ldrb r1, [r1]
; THUMB1-NEXT:    eors r1, r0
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_xor8_short_short:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r0, [r0]
; THUMB2-NEXT:    ldrb r1, [r1]
; THUMB2-NEXT:    eors r0, r1
; THUMB2-NEXT:    clz r0, r0
; THUMB2-NEXT:    lsrs r0, r0, #5
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i16, ptr %a, align 2
  %1 = load i16, ptr %b, align 2
  %xor2 = xor i16 %1, %0
  %2 = and i16 %xor2, 255
  %cmp = icmp eq i16 %2, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_xor8_short_int(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_xor8_short_int:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r0, [r0]
; ARM-NEXT:    ldrb r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r0, [r0, #1]
; ARMEB-NEXT:    ldrb r1, [r1, #3]
; 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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r0, [r0]
; THUMB1-NEXT:    ldrb r1, [r1]
; THUMB1-NEXT:    eors r1, r0
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_xor8_short_int:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r0, [r0]
; THUMB2-NEXT:    ldrb r1, [r1]
; THUMB2-NEXT:    eors r0, r1
; THUMB2-NEXT:    clz r0, r0
; THUMB2-NEXT:    lsrs r0, r0, #5
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i16, ptr %a, align 2
  %conv = zext i16 %0 to i32
  %1 = load i32, ptr %b, align 4
  %xor = xor i32 %1, %conv
  %and = and i32 %xor, 255
  %cmp = icmp eq i32 %and, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_xor8_int_int(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_xor8_int_int:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r0, [r0]
; ARM-NEXT:    ldrb r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r0, [r0, #3]
; ARMEB-NEXT:    ldrb r1, [r1, #3]
; 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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r0, [r0]
; THUMB1-NEXT:    ldrb r1, [r1]
; THUMB1-NEXT:    eors r1, r0
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_xor8_int_int:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r0, [r0]
; THUMB2-NEXT:    ldrb r1, [r1]
; THUMB2-NEXT:    eors r0, r1
; THUMB2-NEXT:    clz r0, r0
; THUMB2-NEXT:    lsrs r0, r0, #5
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %xor = xor i32 %1, %0
  %and = and i32 %xor, 255
  %cmp = icmp eq i32 %and, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_xor16(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_xor16:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrh r0, [r0]
; ARM-NEXT:    ldrh r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrh r0, [r0, #2]
; ARMEB-NEXT:    ldrh r1, [r1, #2]
; 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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrh r0, [r0]
; THUMB1-NEXT:    ldrh r1, [r1]
; THUMB1-NEXT:    eors r1, r0
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_xor16:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrh r0, [r0]
; THUMB2-NEXT:    ldrh r1, [r1]
; THUMB2-NEXT:    eors r0, r1
; THUMB2-NEXT:    clz r0, r0
; THUMB2-NEXT:    lsrs r0, r0, #5
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %xor = xor i32 %1, %0
  %and = and i32 %xor, 65535
  %cmp = icmp eq i32 %and, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_or8_short_short(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_or8_short_short:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r0, [r0]
; ARM-NEXT:    ldrb r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r0, [r0, #1]
; ARMEB-NEXT:    ldrb r1, [r1, #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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r0, [r0]
; THUMB1-NEXT:    ldrb r1, [r1]
; THUMB1-NEXT:    orrs r1, r0
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_or8_short_short:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r0, [r0]
; THUMB2-NEXT:    ldrb r1, [r1]
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    clz r0, r0
; THUMB2-NEXT:    lsrs r0, r0, #5
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i16, ptr %a, align 2
  %1 = load i16, ptr %b, align 2
  %or2 = or i16 %1, %0
  %2 = and i16 %or2, 255
  %cmp = icmp eq i16 %2, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_or8_short_int(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_or8_short_int:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r0, [r0]
; ARM-NEXT:    ldrb r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r0, [r0, #1]
; ARMEB-NEXT:    ldrb r1, [r1, #3]
; 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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r0, [r0]
; THUMB1-NEXT:    ldrb r1, [r1]
; THUMB1-NEXT:    orrs r1, r0
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_or8_short_int:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r0, [r0]
; THUMB2-NEXT:    ldrb r1, [r1]
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    clz r0, r0
; THUMB2-NEXT:    lsrs r0, r0, #5
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i16, ptr %a, align 2
  %conv = zext i16 %0 to i32
  %1 = load i32, ptr %b, align 4
  %or = or i32 %1, %conv
  %and = and i32 %or, 255
  %cmp = icmp eq i32 %and, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_or8_int_int(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_or8_int_int:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r0, [r0]
; ARM-NEXT:    ldrb r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r0, [r0, #3]
; ARMEB-NEXT:    ldrb r1, [r1, #3]
; 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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r0, [r0]
; THUMB1-NEXT:    ldrb r1, [r1]
; THUMB1-NEXT:    orrs r1, r0
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_or8_int_int:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r0, [r0]
; THUMB2-NEXT:    ldrb r1, [r1]
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    clz r0, r0
; THUMB2-NEXT:    lsrs r0, r0, #5
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %or = or i32 %1, %0
  %and = and i32 %or, 255
  %cmp = icmp eq i32 %and, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_or16(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_or16:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrh r0, [r0]
; ARM-NEXT:    ldrh r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrh r0, [r0, #2]
; ARMEB-NEXT:    ldrh r1, [r1, #2]
; 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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrh r0, [r0]
; THUMB1-NEXT:    ldrh r1, [r1]
; THUMB1-NEXT:    orrs r1, r0
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_or16:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrh r0, [r0]
; THUMB2-NEXT:    ldrh r1, [r1]
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    clz r0, r0
; THUMB2-NEXT:    lsrs r0, r0, #5
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %or = or i32 %1, %0
  %and = and i32 %or, 65535
  %cmp = icmp eq i32 %and, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_and8_short_short(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_and8_short_short:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r1, [r1, #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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r1, [r1]
; THUMB1-NEXT:    ldrb r2, [r0]
; THUMB1-NEXT:    ands r2, r1
; THUMB1-NEXT:    rsbs r0, r2, #0
; THUMB1-NEXT:    adcs r0, r2
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_and8_short_short:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r1, [r1]
; 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, ptr %a, align 2
  %1 = load i16, ptr %b, align 2
  %and3 = and i16 %0, 255
  %2 = and i16 %and3, %1
  %cmp = icmp eq i16 %2, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_and8_short_int(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_and8_short_int:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r0, [r0]
; ARM-NEXT:    ldr r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r0, [r0, #1]
; ARMEB-NEXT:    ldr r1, [r1]
; 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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r0, [r0]
; THUMB1-NEXT:    ldr r1, [r1]
; THUMB1-NEXT:    ands r1, r0
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_and8_short_int:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r0, [r0]
; THUMB2-NEXT:    ldr r1, [r1]
; THUMB2-NEXT:    ands r0, r1
; THUMB2-NEXT:    clz r0, r0
; THUMB2-NEXT:    lsrs r0, r0, #5
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i16, ptr %a, align 2
  %1 = load i32, ptr %b, align 4
  %2 = and i16 %0, 255
  %and = zext i16 %2 to i32
  %and1 = and i32 %1, %and
  %cmp = icmp eq i32 %and1, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_and8_int_int(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_and8_int_int:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r1, [r1, #3]
; 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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r1, [r1]
; THUMB1-NEXT:    ldrb r2, [r0]
; THUMB1-NEXT:    ands r2, r1
; THUMB1-NEXT:    rsbs r0, r2, #0
; THUMB1-NEXT:    adcs r0, r2
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_and8_int_int:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r1, [r1]
; 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, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %and = and i32 %0, 255
  %and1 = and i32 %and, %1
  %cmp = icmp eq i32 %and1, 0
  ret i1 %cmp
}

define arm_aapcscc zeroext i1 @cmp_and16(ptr nocapture readonly %a, ptr nocapture readonly %b) {
; ARM-LABEL: cmp_and16:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrh r1, [r1]
; 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:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrh r1, [r1, #2]
; 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:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrh r1, [r1]
; THUMB1-NEXT:    ldrh r2, [r0]
; THUMB1-NEXT:    ands r2, r1
; THUMB1-NEXT:    rsbs r0, r2, #0
; THUMB1-NEXT:    adcs r0, r2
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: cmp_and16:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrh r1, [r1]
; 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, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %and = and i32 %0, 65535
  %and1 = and i32 %and, %1
  %cmp = icmp eq i32 %and1, 0
  ret i1 %cmp
}

define arm_aapcscc i32 @add_and16(ptr nocapture readonly %a, i32 %y, i32 %z) {
; ARM-LABEL: add_and16:
; 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:       @ %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:       @ %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:       @ %bb.0: @ %entry
; THUMB2-NEXT:    add r1, r2
; THUMB2-NEXT:    ldrh r0, [r0]
; THUMB2-NEXT:    uxth r1, r1
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    bx lr
entry:
  %x = load i32, ptr %a, align 4
  %add = add i32 %y, %z
  %or = or i32 %x, %add
  %and = and i32 %or, 65535
  ret i32 %and
}

define arm_aapcscc i32 @test1(ptr %a, ptr %b, i32 %x, i32 %y) {
; ARM-LABEL: test1:
; 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
; ARM-NEXT:    uxth r1, r2
; ARM-NEXT:    orr r0, r0, r1
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test1:
; 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
; ARMEB-NEXT:    uxth r1, r2
; ARMEB-NEXT:    orr r0, r0, r1
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test1:
; 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 {r4, pc}
;
; THUMB2-LABEL: test1:
; 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
; THUMB2-NEXT:    uxth r1, r1
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %mul = mul i32 %x, %y
  %xor = xor i32 %0, %1
  %or = or i32 %xor, %mul
  %and = and i32 %or, 65535
  ret i32 %and
}

define arm_aapcscc i32 @test2(ptr %a, ptr %b, i32 %x, i32 %y) {
; ARM-LABEL: test2:
; 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
; ARM-NEXT:    orr r0, r0, r1
; ARM-NEXT:    uxth r0, r0
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test2:
; 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
; ARMEB-NEXT:    orr r0, r0, r1
; ARMEB-NEXT:    uxth r0, r0
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test2:
; 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
; THUMB1-NEXT:    orrs r0, r1
; THUMB1-NEXT:    uxth r0, r0
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test2:
; 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
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    uxth r0, r0
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %mul = mul i32 %x, %1
  %xor = xor i32 %0, %y
  %or = or i32 %xor, %mul
  %and = and i32 %or, 65535
  ret i32 %and
}

define arm_aapcscc i32 @test3(ptr %a, ptr %b, i32 %x, ptr %y) {
; ARM-LABEL: test3:
; 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
; ARM-NEXT:    orr r0, r0, r1
; ARM-NEXT:    uxth r0, r0
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test3:
; 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
; ARMEB-NEXT:    orr r0, r0, r1
; ARMEB-NEXT:    uxth r0, r0
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test3:
; 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
; THUMB1-NEXT:    orrs r1, r2
; THUMB1-NEXT:    uxth r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test3:
; 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
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    uxth r0, r0
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %a, align 4
  %1 = load i16, ptr %y, align 4
  %2 = zext i16 %1 to i32
  %mul = mul i32 %x, %0
  %xor = xor i32 %0, %2
  %or = or i32 %xor, %mul
  %and = and i32 %or, 65535
  ret i32 %and
}

define arm_aapcscc i32 @test4(ptr %a, ptr %b, i32 %x, i32 %y) {
; ARM-LABEL: test4:
; 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
; ARM-NEXT:    uxth r1, r2
; ARM-NEXT:    orr r0, r0, r1
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test4:
; 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
; ARMEB-NEXT:    uxth r1, r2
; ARMEB-NEXT:    orr r0, r0, r1
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test4:
; 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 {r4, pc}
;
; THUMB2-LABEL: test4:
; 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
; THUMB2-NEXT:    uxth r1, r1
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %mul = mul i32 %x, %y
  %xor = xor i32 %0, %1
  %or = or i32 %xor, %mul
  %and = and i32 %or, 65535
  ret i32 %and
}

define arm_aapcscc i32 @test5(ptr %a, ptr %b, i32 %x, i16 zeroext %y) {
; ARM-LABEL: test5:
; 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
; ARM-NEXT:    uxth r1, r1
; ARM-NEXT:    orr r0, r0, r1
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test5:
; 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
; ARMEB-NEXT:    uxth r1, r1
; ARMEB-NEXT:    orr r0, r0, r1
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test5:
; 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 {r4, pc}
;
; THUMB2-LABEL: test5:
; 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
; THUMB2-NEXT:    uxth r1, r1
; THUMB2-NEXT:    orrs r0, r1
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %mul = mul i32 %x, %1
  %ext = zext i16 %y to i32
  %xor = xor i32 %0, %ext
  %or = or i32 %xor, %mul
  %and = and i32 %or, 65535
  ret i32 %and
}

define arm_aapcscc i1 @test6(ptr %x, i8 %y, i8 %z) {
; ARM-LABEL: test6:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r0, [r0]
; ARM-NEXT:    and r0, r1, r0
; 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:    and r0, r1, r0
; 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 r0, [r0]
; THUMB1-NEXT:    ands r0, r1
; THUMB1-NEXT:    uxtb r1, r2
; THUMB1-NEXT:    subs r1, r0, r1
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test6:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r0, [r0]
; 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, ptr %x, align 4
  %1 = and i8 %0, %y
  %2 = icmp eq i8 %1, %z
  ret i1 %2
}

define arm_aapcscc i1 @test7(ptr %x, i16 %y, i8 %z) {
; ARM-LABEL: test7:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r0, [r0]
; ARM-NEXT:    and r0, r1, r0
; 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:    and r0, r1, r0
; 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 r0, [r0]
; THUMB1-NEXT:    ands r0, r1
; THUMB1-NEXT:    uxtb r1, r2
; THUMB1-NEXT:    subs r1, r0, r1
; THUMB1-NEXT:    rsbs r0, r1, #0
; THUMB1-NEXT:    adcs r0, r1
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test7:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r0, [r0]
; 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, ptr %x, align 4
  %1 = and i16 %0, %y
  %2 = trunc i16 %1 to i8
  %3 = icmp eq i8 %2, %z
  ret i1 %3
}

define arm_aapcscc void @test8(ptr nocapture %p) {
; ARM-LABEL: test8:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r1, [r0]
; ARM-NEXT:    eor r1, r1, #255
; ARM-NEXT:    str r1, [r0]
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test8:
; ARMEB:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r1, [r0, #3]
; ARMEB-NEXT:    eor r1, r1, #255
; ARMEB-NEXT:    str r1, [r0]
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test8:
; THUMB1:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r1, [r0]
; THUMB1-NEXT:    movs r2, #255
; THUMB1-NEXT:    eors r2, r1
; THUMB1-NEXT:    str r2, [r0]
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test8:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r1, [r0]
; THUMB2-NEXT:    eor r1, r1, #255
; THUMB2-NEXT:    str r1, [r0]
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %p, align 4
  %neg = and i32 %0, 255
  %and = xor i32 %neg, 255
  store i32 %and, ptr %p, align 4
  ret void
}

define arm_aapcscc void @test9(ptr nocapture %p) {
; ARM-LABEL: test9:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r1, [r0]
; ARM-NEXT:    eor r1, r1, #255
; ARM-NEXT:    str r1, [r0]
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test9:
; ARMEB:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r1, [r0, #3]
; ARMEB-NEXT:    eor r1, r1, #255
; ARMEB-NEXT:    str r1, [r0]
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test9:
; THUMB1:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r1, [r0]
; THUMB1-NEXT:    movs r2, #255
; THUMB1-NEXT:    eors r2, r1
; THUMB1-NEXT:    str r2, [r0]
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test9:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r1, [r0]
; THUMB2-NEXT:    eor r1, r1, #255
; THUMB2-NEXT:    str r1, [r0]
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %p, align 4
  %neg = xor i32 %0, -1
  %and = and i32 %neg, 255
  store i32 %and, ptr %p, align 4
  ret void
}

define arm_aapcscc void @test10(ptr nocapture %p) {
; ARM-LABEL: test10:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r1, [r0]
; ARM-NEXT:    eor r1, r1, #255
; ARM-NEXT:    str r1, [r0]
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test10:
; ARMEB:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r1, [r0, #3]
; ARMEB-NEXT:    eor r1, r1, #255
; ARMEB-NEXT:    str r1, [r0]
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test10:
; THUMB1:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r1, [r0]
; THUMB1-NEXT:    movs r2, #255
; THUMB1-NEXT:    eors r2, r1
; THUMB1-NEXT:    str r2, [r0]
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test10:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r1, [r0]
; THUMB2-NEXT:    eor r1, r1, #255
; THUMB2-NEXT:    str r1, [r0]
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %p, align 4
  %neg = and i32 %0, 255
  %and = xor i32 %neg, 255
  store i32 %and, ptr %p, align 4
  ret void
}

define arm_aapcscc i32 @test11(ptr nocapture %p) {
; ARM-LABEL: test11:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r0, [r0, #1]
; ARM-NEXT:    lsl r0, r0, #8
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test11:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0, #2]
; ARMEB-NEXT:    lsl r0, r0, #8
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test11:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r0, [r0, #1]
; THUMB1-NEXT:    lsls r0, r0, #8
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test11:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r0, [r0, #1]
; THUMB2-NEXT:    lsls r0, r0, #8
; THUMB2-NEXT:    bx lr
  %1 = load i32, ptr %p, align 4
  %and = and i32 %1, 65280
  ret i32 %and
}

define arm_aapcscc i32 @test12(ptr nocapture %p) {
; ARM-LABEL: test12:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r0, [r0, #2]
; ARM-NEXT:    lsl r0, r0, #16
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test12:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0, #1]
; ARMEB-NEXT:    lsl r0, r0, #16
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test12:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r0, [r0, #2]
; THUMB1-NEXT:    lsls r0, r0, #16
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test12:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r0, [r0, #2]
; THUMB2-NEXT:    lsls r0, r0, #16
; THUMB2-NEXT:    bx lr
  %1 = load i32, ptr %p, align 4
  %and = and i32 %1, 16711680
  ret i32 %and
}

define arm_aapcscc i32 @test13(ptr nocapture %p) {
; ARM-LABEL: test13:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r0, [r0, #3]
; ARM-NEXT:    lsl r0, r0, #24
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test13:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0]
; ARMEB-NEXT:    lsl r0, r0, #24
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test13:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r0, [r0, #3]
; THUMB1-NEXT:    lsls r0, r0, #24
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test13:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r0, [r0, #3]
; THUMB2-NEXT:    lsls r0, r0, #24
; THUMB2-NEXT:    bx lr
  %1 = load i32, ptr %p, align 4
  %and = and i32 %1, 4278190080
  ret i32 %and
}

define arm_aapcscc i32 @test14(ptr nocapture %p) {
; ARM-LABEL: test14:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrh r0, [r0, #1]
; ARM-NEXT:    lsl r0, r0, #8
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test14:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrh r0, [r0, #1]
; ARMEB-NEXT:    lsl r0, r0, #8
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test14:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldr r1, [r0]
; THUMB1-NEXT:    ldr r0, .LCPI26_0
; THUMB1-NEXT:    ands r0, r1
; THUMB1-NEXT:    bx lr
; THUMB1-NEXT:    .p2align 2
; THUMB1-NEXT:  @ %bb.1:
; THUMB1-NEXT:  .LCPI26_0:
; THUMB1-NEXT:    .long 16776960 @ 0xffff00
;
; THUMB2-LABEL: test14:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrh.w r0, [r0, #1]
; THUMB2-NEXT:    lsls r0, r0, #8
; THUMB2-NEXT:    bx lr
  %1 = load i32, ptr %p, align 4
  %and = and i32 %1, 16776960
  ret i32 %and
}

define arm_aapcscc i32 @test15(ptr nocapture %p) {
; ARM-LABEL: test15:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrh r0, [r0, #2]
; ARM-NEXT:    lsl r0, r0, #16
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test15:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrh r0, [r0]
; ARMEB-NEXT:    lsl r0, r0, #16
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test15:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrh r0, [r0, #2]
; THUMB1-NEXT:    lsls r0, r0, #16
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test15:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrh r0, [r0, #2]
; THUMB2-NEXT:    lsls r0, r0, #16
; THUMB2-NEXT:    bx lr
  %1 = load i32, ptr %p, align 4
  %and = and i32 %1, 4294901760
  ret i32 %and
}

define arm_aapcscc i32 @test16(ptr nocapture %p) {
; ARM-LABEL: test16:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r0, [r0, #1]
; ARM-NEXT:    lsl r0, r0, #8
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test16:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0, #6]
; ARMEB-NEXT:    lsl r0, r0, #8
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test16:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r0, [r0, #1]
; THUMB1-NEXT:    lsls r0, r0, #8
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test16:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r0, [r0, #1]
; THUMB2-NEXT:    lsls r0, r0, #8
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, 65280
  %trunc = trunc i64 %and to i32
  ret i32 %trunc
}

define arm_aapcscc i32 @test17(ptr nocapture %p) {
; ARM-LABEL: test17:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r0, [r0, #2]
; ARM-NEXT:    lsl r0, r0, #16
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test17:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0, #5]
; ARMEB-NEXT:    lsl r0, r0, #16
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test17:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r0, [r0, #2]
; THUMB1-NEXT:    lsls r0, r0, #16
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test17:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r0, [r0, #2]
; THUMB2-NEXT:    lsls r0, r0, #16
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, 16711680
  %trunc = trunc i64 %and to i32
  ret i32 %trunc
}

define arm_aapcscc i32 @test18(ptr nocapture %p) {
; ARM-LABEL: test18:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r0, [r0, #3]
; ARM-NEXT:    lsl r0, r0, #24
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test18:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0, #4]
; ARMEB-NEXT:    lsl r0, r0, #24
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test18:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r0, [r0, #3]
; THUMB1-NEXT:    lsls r0, r0, #24
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test18:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r0, [r0, #3]
; THUMB2-NEXT:    lsls r0, r0, #24
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, 4278190080
  %trunc = trunc i64 %and to i32
  ret i32 %trunc
}

define arm_aapcscc i64 @test19(ptr nocapture %p) {
; ARM-LABEL: test19:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r1, [r0, #4]
; ARM-NEXT:    mov r0, #0
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test19:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0, #3]
; ARMEB-NEXT:    mov r1, #0
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test19:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r1, [r0, #4]
; THUMB1-NEXT:    movs r0, #0
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test19:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r1, [r0, #4]
; THUMB2-NEXT:    movs r0, #0
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, 1095216660480
  ret i64 %and
}

define arm_aapcscc i64 @test20(ptr nocapture %p) {
; ARM-LABEL: test20:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r0, [r0, #5]
; ARM-NEXT:    lsl r1, r0, #8
; ARM-NEXT:    mov r0, #0
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test20:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0, #2]
; ARMEB-NEXT:    mov r1, #0
; ARMEB-NEXT:    lsl r0, r0, #8
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test20:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r0, [r0, #5]
; THUMB1-NEXT:    lsls r1, r0, #8
; THUMB1-NEXT:    movs r0, #0
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test20:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r0, [r0, #5]
; THUMB2-NEXT:    lsls r1, r0, #8
; THUMB2-NEXT:    movs r0, #0
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, 280375465082880
  ret i64 %and
}

define arm_aapcscc i64 @test21(ptr nocapture %p) {
; ARM-LABEL: test21:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r0, [r0, #6]
; ARM-NEXT:    lsl r1, r0, #16
; ARM-NEXT:    mov r0, #0
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test21:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0, #1]
; ARMEB-NEXT:    mov r1, #0
; ARMEB-NEXT:    lsl r0, r0, #16
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test21:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r0, [r0, #6]
; THUMB1-NEXT:    lsls r1, r0, #16
; THUMB1-NEXT:    movs r0, #0
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test21:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r0, [r0, #6]
; THUMB2-NEXT:    lsls r1, r0, #16
; THUMB2-NEXT:    movs r0, #0
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, 71776119061217280
  ret i64 %and
}

define arm_aapcscc i64 @test22(ptr nocapture %p) {
; ARM-LABEL: test22:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrb r0, [r0, #7]
; ARM-NEXT:    lsl r1, r0, #24
; ARM-NEXT:    mov r0, #0
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test22:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrb r0, [r0]
; ARMEB-NEXT:    mov r1, #0
; ARMEB-NEXT:    lsl r0, r0, #24
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test22:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r0, [r0, #7]
; THUMB1-NEXT:    lsls r1, r0, #24
; THUMB1-NEXT:    movs r0, #0
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test22:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrb r0, [r0, #7]
; THUMB2-NEXT:    lsls r1, r0, #24
; THUMB2-NEXT:    movs r0, #0
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, -72057594037927936
  ret i64 %and
}

define arm_aapcscc i64 @test23(ptr nocapture %p) {
; ARM-LABEL: test23:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrh r1, [r0, #3]
; ARM-NEXT:    lsl r0, r1, #24
; ARM-NEXT:    lsr r1, r1, #8
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test23:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrh r1, [r0, #3]
; ARMEB-NEXT:    lsr r0, r1, #8
; ARMEB-NEXT:    lsl r1, r1, #24
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test23:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrb r1, [r0, #4]
; THUMB1-NEXT:    ldrb r0, [r0, #3]
; THUMB1-NEXT:    lsls r0, r0, #24
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test23:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrh.w r1, [r0, #3]
; THUMB2-NEXT:    lsls r0, r1, #24
; THUMB2-NEXT:    lsrs r1, r1, #8
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, 1099494850560
  ret i64 %and
}

define arm_aapcscc i64 @test24(ptr nocapture %p) {
; ARM-LABEL: test24:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrh r1, [r0, #4]
; ARM-NEXT:    mov r0, #0
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test24:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrh r0, [r0, #2]
; ARMEB-NEXT:    mov r1, #0
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test24:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrh r1, [r0, #4]
; THUMB1-NEXT:    movs r0, #0
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test24:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrh r1, [r0, #4]
; THUMB2-NEXT:    movs r0, #0
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, 281470681743360
  ret i64 %and
}

define arm_aapcscc i64 @test25(ptr nocapture %p) {
; ARM-LABEL: test25:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrh r0, [r0, #5]
; ARM-NEXT:    lsl r1, r0, #8
; ARM-NEXT:    mov r0, #0
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test25:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrh r0, [r0, #1]
; ARMEB-NEXT:    mov r1, #0
; ARMEB-NEXT:    lsl r0, r0, #8
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test25:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldr r0, [r0, #4]
; THUMB1-NEXT:    ldr r1, .LCPI37_0
; THUMB1-NEXT:    ands r1, r0
; THUMB1-NEXT:    movs r0, #0
; THUMB1-NEXT:    bx lr
; THUMB1-NEXT:    .p2align 2
; THUMB1-NEXT:  @ %bb.1:
; THUMB1-NEXT:  .LCPI37_0:
; THUMB1-NEXT:    .long 16776960 @ 0xffff00
;
; THUMB2-LABEL: test25:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrh.w r0, [r0, #5]
; THUMB2-NEXT:    lsls r1, r0, #8
; THUMB2-NEXT:    movs r0, #0
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, 72056494526300160
  ret i64 %and
}

define arm_aapcscc i64 @test26(ptr nocapture %p) {
; ARM-LABEL: test26:
; ARM:       @ %bb.0:
; ARM-NEXT:    ldrh r0, [r0, #6]
; ARM-NEXT:    lsl r1, r0, #16
; ARM-NEXT:    mov r0, #0
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test26:
; ARMEB:       @ %bb.0:
; ARMEB-NEXT:    ldrh r0, [r0]
; ARMEB-NEXT:    mov r1, #0
; ARMEB-NEXT:    lsl r0, r0, #16
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test26:
; THUMB1:       @ %bb.0:
; THUMB1-NEXT:    ldrh r0, [r0, #6]
; THUMB1-NEXT:    lsls r1, r0, #16
; THUMB1-NEXT:    movs r0, #0
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test26:
; THUMB2:       @ %bb.0:
; THUMB2-NEXT:    ldrh r0, [r0, #6]
; THUMB2-NEXT:    lsls r1, r0, #16
; THUMB2-NEXT:    movs r0, #0
; THUMB2-NEXT:    bx lr
  %1 = load i64, ptr %p, align 8
  %and = and i64 %1, -281474976710656
  ret i64 %and
}

define void @test27(ptr nocapture %ptr) {
; ARM-LABEL: test27:
; ARM:       @ %bb.0: @ %entry
; ARM-NEXT:    ldrb r1, [r0, #1]
; ARM-NEXT:    lsl r1, r1, #16
; ARM-NEXT:    str r1, [r0]
; ARM-NEXT:    bx lr
;
; ARMEB-LABEL: test27:
; ARMEB:       @ %bb.0: @ %entry
; ARMEB-NEXT:    ldrb r1, [r0, #2]
; ARMEB-NEXT:    lsl r1, r1, #16
; ARMEB-NEXT:    str r1, [r0]
; ARMEB-NEXT:    bx lr
;
; THUMB1-LABEL: test27:
; THUMB1:       @ %bb.0: @ %entry
; THUMB1-NEXT:    ldrb r1, [r0, #1]
; THUMB1-NEXT:    lsls r1, r1, #16
; THUMB1-NEXT:    str r1, [r0]
; THUMB1-NEXT:    bx lr
;
; THUMB2-LABEL: test27:
; THUMB2:       @ %bb.0: @ %entry
; THUMB2-NEXT:    ldrb r1, [r0, #1]
; THUMB2-NEXT:    lsls r1, r1, #16
; THUMB2-NEXT:    str r1, [r0]
; THUMB2-NEXT:    bx lr
entry:
  %0 = load i32, ptr %ptr, align 4
  %and = and i32 %0, 65280
  %shl = shl i32 %and, 8
  store i32 %shl, ptr %ptr, align 4
  ret void
}