| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=arm-eabi %s -o - | FileCheck %s --check-prefix=ARM |
| ; RUN: llc -mtriple=thumbv6t2-eabi %s -o - | FileCheck %s --check-prefix=THUMB2 |
| ; RUN: llc -mtriple=thumb-eabi %s -o - | FileCheck %s --check-prefix=THUMB |
| |
| define i32 @t9(i32 %v) nounwind readnone { |
| ; ARM-LABEL: t9: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: add r0, r0, r0, lsl #3 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: t9: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: add.w r0, r0, r0, lsl #3 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: t9: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: movs r1, #9 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| entry: |
| %0 = mul i32 %v, 9 |
| ret i32 %0 |
| } |
| |
| define i32 @t7(i32 %v) nounwind readnone { |
| ; ARM-LABEL: t7: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: rsb r0, r0, r0, lsl #3 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: t7: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: rsb r0, r0, r0, lsl #3 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: t7: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: movs r1, #7 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| entry: |
| %0 = mul i32 %v, 7 |
| ret i32 %0 |
| } |
| |
| define i32 @t5(i32 %v) nounwind readnone { |
| ; ARM-LABEL: t5: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: add r0, r0, r0, lsl #2 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: t5: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: add.w r0, r0, r0, lsl #2 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: t5: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: movs r1, #5 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| entry: |
| %0 = mul i32 %v, 5 |
| ret i32 %0 |
| } |
| |
| define i32 @t3(i32 %v) nounwind readnone { |
| ; ARM-LABEL: t3: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: add r0, r0, r0, lsl #1 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: t3: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: add.w r0, r0, r0, lsl #1 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: t3: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: movs r1, #3 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| entry: |
| %0 = mul i32 %v, 3 |
| ret i32 %0 |
| } |
| |
| define i32 @t12288(i32 %v) nounwind readnone { |
| ; ARM-LABEL: t12288: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: add r0, r0, r0, lsl #1 |
| ; ARM-NEXT: lsl r0, r0, #12 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: t12288: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: add.w r0, r0, r0, lsl #1 |
| ; THUMB2-NEXT: lsls r0, r0, #12 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: t12288: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: movs r1, #3 |
| ; THUMB-NEXT: lsls r1, r1, #12 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| entry: |
| %0 = mul i32 %v, 12288 |
| ret i32 %0 |
| } |
| |
| define i32 @tn9(i32 %v) nounwind readnone { |
| ; ARM-LABEL: tn9: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: add r0, r0, r0, lsl #3 |
| ; ARM-NEXT: rsb r0, r0, #0 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: tn9: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: add.w r0, r0, r0, lsl #3 |
| ; THUMB2-NEXT: rsbs r0, r0, #0 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: tn9: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: movs r1, #8 |
| ; THUMB-NEXT: mvns r1, r1 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| entry: |
| %0 = mul i32 %v, -9 |
| ret i32 %0 |
| } |
| |
| define i32 @tn7(i32 %v) nounwind readnone { |
| ; ARM-LABEL: tn7: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: sub r0, r0, r0, lsl #3 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: tn7: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: sub.w r0, r0, r0, lsl #3 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: tn7: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: movs r1, #6 |
| ; THUMB-NEXT: mvns r1, r1 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| entry: |
| %0 = mul i32 %v, -7 |
| ret i32 %0 |
| } |
| |
| define i32 @tn5(i32 %v) nounwind readnone { |
| ; ARM-LABEL: tn5: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: add r0, r0, r0, lsl #2 |
| ; ARM-NEXT: rsb r0, r0, #0 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: tn5: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: add.w r0, r0, r0, lsl #2 |
| ; THUMB2-NEXT: rsbs r0, r0, #0 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: tn5: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: movs r1, #4 |
| ; THUMB-NEXT: mvns r1, r1 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| entry: |
| %0 = mul i32 %v, -5 |
| ret i32 %0 |
| } |
| |
| define i32 @tn3(i32 %v) nounwind readnone { |
| ; ARM-LABEL: tn3: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: sub r0, r0, r0, lsl #2 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: tn3: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: sub.w r0, r0, r0, lsl #2 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: tn3: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: movs r1, #2 |
| ; THUMB-NEXT: mvns r1, r1 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| entry: |
| ; CHECK-LABEL: tn3: |
| ; CHECK: sub r0, r0, r0, lsl #2 |
| %0 = mul i32 %v, -3 |
| ret i32 %0 |
| } |
| |
| define i32 @tn12288(i32 %v) nounwind readnone { |
| ; ARM-LABEL: tn12288: |
| ; ARM: @ %bb.0: @ %entry |
| ; ARM-NEXT: sub r0, r0, r0, lsl #2 |
| ; ARM-NEXT: lsl r0, r0, #12 |
| ; ARM-NEXT: mov pc, lr |
| ; |
| ; THUMB2-LABEL: tn12288: |
| ; THUMB2: @ %bb.0: @ %entry |
| ; THUMB2-NEXT: sub.w r0, r0, r0, lsl #2 |
| ; THUMB2-NEXT: lsls r0, r0, #12 |
| ; THUMB2-NEXT: bx lr |
| ; |
| ; THUMB-LABEL: tn12288: |
| ; THUMB: @ %bb.0: @ %entry |
| ; THUMB-NEXT: ldr r1, .LCPI9_0 |
| ; THUMB-NEXT: muls r0, r1, r0 |
| ; THUMB-NEXT: bx lr |
| ; THUMB-NEXT: .p2align 2 |
| ; THUMB-NEXT: @ %bb.1: |
| ; THUMB-NEXT: .LCPI9_0: |
| ; THUMB-NEXT: .long 4294955008 @ 0xffffd000 |
| entry: |
| ; CHECK-LABEL: tn12288: |
| ; CHECK: sub r0, r0, r0, lsl #2 |
| ; CHECK: lsl{{.*}}#12 |
| %0 = mul i32 %v, -12288 |
| ret i32 %0 |
| } |