; 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 }