| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -mcpu=cortex-m0 -verify-machineinstrs | FileCheck --check-prefix CHECK-T1 %s |
| ; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -mcpu=cortex-m3 -verify-machineinstrs | FileCheck --check-prefix CHECK-T2 %s |
| |
| define i32 @i(i32 %a) { |
| ; CHECK-T1-LABEL: i: |
| ; CHECK-T1: @ %bb.0: @ %entry |
| ; CHECK-T1-NEXT: movs r1, #255 |
| ; CHECK-T1-NEXT: adds r1, #20 |
| ; CHECK-T1-NEXT: bics r0, r1 |
| ; CHECK-T1-NEXT: bx lr |
| ; |
| ; CHECK-T2-LABEL: i: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: movw r1, #275 |
| ; CHECK-T2-NEXT: bics r0, r1 |
| ; CHECK-T2-NEXT: bx lr |
| entry: |
| %and = and i32 %a, -276 |
| ret i32 %and |
| } |
| |
| define i32 @j(i32 %a) { |
| ; CHECK-T1-LABEL: j: |
| ; CHECK-T1: @ %bb.0: @ %entry |
| ; CHECK-T1-NEXT: movs r1, #128 |
| ; CHECK-T1-NEXT: bics r0, r1 |
| ; CHECK-T1-NEXT: bx lr |
| ; |
| ; CHECK-T2-LABEL: j: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: bic r0, r0, #128 |
| ; CHECK-T2-NEXT: bx lr |
| entry: |
| %and = and i32 %a, -129 |
| ret i32 %and |
| } |
| |
| define void @truncated(i16 %a, i16* %p) { |
| ; CHECK-T1-LABEL: truncated: |
| ; CHECK-T1: @ %bb.0: |
| ; CHECK-T1-NEXT: movs r2, #128 |
| ; CHECK-T1-NEXT: bics r0, r2 |
| ; CHECK-T1-NEXT: strh r0, [r1] |
| ; CHECK-T1-NEXT: bx lr |
| ; |
| ; CHECK-T2-LABEL: truncated: |
| ; CHECK-T2: @ %bb.0: |
| ; CHECK-T2-NEXT: bic r0, r0, #128 |
| ; CHECK-T2-NEXT: strh r0, [r1] |
| ; CHECK-T2-NEXT: bx lr |
| %and = and i16 %a, -129 |
| store i16 %and, i16* %p |
| ret void |
| } |
| |
| define void @truncated_neg2(i16 %a, i16* %p) { |
| ; CHECK-T1-LABEL: truncated_neg2: |
| ; CHECK-T1: @ %bb.0: |
| ; CHECK-T1-NEXT: movs r2, #1 |
| ; CHECK-T1-NEXT: bics r0, r2 |
| ; CHECK-T1-NEXT: strh r0, [r1] |
| ; CHECK-T1-NEXT: bx lr |
| ; |
| ; CHECK-T2-LABEL: truncated_neg2: |
| ; CHECK-T2: @ %bb.0: |
| ; CHECK-T2-NEXT: bic r0, r0, #1 |
| ; CHECK-T2-NEXT: strh r0, [r1] |
| ; CHECK-T2-NEXT: bx lr |
| %and = and i16 %a, -2 |
| store i16 %and, i16* %p |
| ret void |
| } |
| |
| define void @truncated_neg256(i16 %a, i16* %p) { |
| ; CHECK-T1-LABEL: truncated_neg256: |
| ; CHECK-T1: @ %bb.0: |
| ; CHECK-T1-NEXT: movs r2, #255 |
| ; CHECK-T1-NEXT: bics r0, r2 |
| ; CHECK-T1-NEXT: strh r0, [r1] |
| ; CHECK-T1-NEXT: bx lr |
| ; |
| ; CHECK-T2-LABEL: truncated_neg256: |
| ; CHECK-T2: @ %bb.0: |
| ; CHECK-T2-NEXT: bic r0, r0, #255 |
| ; CHECK-T2-NEXT: strh r0, [r1] |
| ; CHECK-T2-NEXT: bx lr |
| %and = and i16 %a, -256 |
| store i16 %and, i16* %p |
| ret void |
| } |
| |
| ; FIXME: Thumb2 supports "bic r0, r0, #510" |
| define void @truncated_neg511(i16 %a, i16* %p) { |
| ; CHECK-T1-LABEL: truncated_neg511: |
| ; CHECK-T1: @ %bb.0: |
| ; CHECK-T1-NEXT: ldr r2, .LCPI5_0 |
| ; CHECK-T1-NEXT: ands r2, r0 |
| ; CHECK-T1-NEXT: strh r2, [r1] |
| ; CHECK-T1-NEXT: bx lr |
| ; CHECK-T1-NEXT: .p2align 2 |
| ; CHECK-T1-NEXT: @ %bb.1: |
| ; CHECK-T1-NEXT: .LCPI5_0: |
| ; CHECK-T1-NEXT: .long 65025 @ 0xfe01 |
| ; |
| ; CHECK-T2-LABEL: truncated_neg511: |
| ; CHECK-T2: @ %bb.0: |
| ; CHECK-T2-NEXT: movw r2, #65025 |
| ; CHECK-T2-NEXT: ands r0, r2 |
| ; CHECK-T2-NEXT: strh r0, [r1] |
| ; CHECK-T2-NEXT: bx lr |
| %and = and i16 %a, -511 |
| store i16 %and, i16* %p |
| ret void |
| } |