1; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-a8 | \ 2; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-SWDIV 3; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=swift | \ 4; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-HWDIV-ARM-OR-THUMB2 5; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-r4 | \ 6; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-SWDIV 7; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-r4f | \ 8; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-SWDIV 9; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-r5 | \ 10; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-HWDIV-ARM-OR-THUMB2 11; RUN: llc < %s -mtriple=arm-none-eabi -mcpu=cortex-a8 | \ 12; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-EABI 13; RUN: llc < %s -mtriple=armv7 -mcpu=cortex-a7 | \ 14; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-HWDIV-ARM-OR-THUMB2 15; RUN: llc < %s -mtriple=armv7 -mcpu=cortex-a7 -march=thumb | \ 16; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-THUMB,CHECK-HWDIV-ARM-OR-THUMB2 17; RUN: llc %s -o - -mtriple=thumbv8m.main -mcpu=cortex-m33 | \ 18; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-THUMB,CHECK-HWDIV-ARM-OR-THUMB2 19; RUN: llc < %s -mtriple=thumbv8m.base -mcpu=cortex-m23 | \ 20; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-THUMB,CHECK-HWDIV-THUMB1 21; RUN: llc < %s -mtriple=armv7ve-none-linux-gnu | \ 22; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV 23; RUN: llc < %s -mtriple=thumbv7ve-none-linux-gnu | \ 24; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-THUMB 25 26define i32 @f1(i32 %a, i32 %b) { 27entry: 28; CHECK-LABEL: f1 29; CHECK-SWDIV: __divsi3 30 31; CHECK-THUMB: .thumb_func 32; CHECK-HWDIV: sdiv 33 34; CHECK-EABI: __aeabi_idiv 35 %tmp1 = sdiv i32 %a, %b ; <i32> [#uses=1] 36 ret i32 %tmp1 37} 38 39define i32 @f2(i32 %a, i32 %b) { 40entry: 41; CHECK-LABEL: f2 42; CHECK-SWDIV: __udivsi3 43 44; CHECK-THUMB: .thumb_func 45; CHECK-HWDIV: udiv 46 47; CHECK-EABI: __aeabi_uidiv 48 %tmp1 = udiv i32 %a, %b ; <i32> [#uses=1] 49 ret i32 %tmp1 50} 51 52define i32 @f3(i32 %a, i32 %b) { 53entry: 54; CHECK-LABEL: f3 55; CHECK-SWDIV: __modsi3 56 57; CHECK-THUMB: .thumb_func 58; CHECK-HWDIV: sdiv 59; CHECK-HWDIV-ARM-OR-THUMB2-NEXT: mls 60; CHECK-HWDIV-THUMB1-NEXT: muls 61; CHECK-HWDIV-THUMB1-NEXT: subs 62 63; EABI MODE = Remainder in R1, quotient in R0 64; CHECK-EABI: __aeabi_idivmod 65; CHECK-EABI-NEXT: mov r0, r1 66 %tmp1 = srem i32 %a, %b ; <i32> [#uses=1] 67 ret i32 %tmp1 68} 69 70define i32 @f4(i32 %a, i32 %b) { 71entry: 72; CHECK-LABEL: f4 73; CHECK-SWDIV: __umodsi3 74 75; CHECK-THUMB: .thumb_func 76; CHECK-HWDIV: udiv 77; CHECK-HWDIV-ARM-OR-THUMB2-NEXT: mls 78; CHECK-HWDIV-THUMB1-NEXT: muls 79; CHECK-HWDIV-THUMB1-NEXT: subs 80 81; EABI MODE = Remainder in R1, quotient in R0 82; CHECK-EABI: __aeabi_uidivmod 83; CHECK-EABI-NEXT: mov r0, r1 84 %tmp1 = urem i32 %a, %b ; <i32> [#uses=1] 85 ret i32 %tmp1 86} 87 88 89define i64 @f5(i64 %a, i64 %b) { 90entry: 91; CHECK-LABEL: f5 92; CHECK-SWDIV: __moddi3 93 94; CHECK-HWDIV: __moddi3 95 96; EABI MODE = Remainder in R2-R3, quotient in R0-R1 97; CHECK-EABI: __aeabi_ldivmod 98; CHECK-EABI-NEXT: mov r0, r2 99; CHECK-EABI-NEXT: mov r1, r3 100 %tmp1 = srem i64 %a, %b ; <i64> [#uses=1] 101 ret i64 %tmp1 102} 103 104define i64 @f6(i64 %a, i64 %b) { 105entry: 106; CHECK-LABEL: f6 107; CHECK-SWDIV: __umoddi3 108 109; CHECK-HWDIV: __umoddi3 110 111; EABI MODE = Remainder in R2-R3, quotient in R0-R1 112; CHECK-EABI: __aeabi_uldivmod 113; CHECK-EABI-NEXT: mov r0, r2 114; CHECK-EABI-NEXT: mov r1, r3 115 %tmp1 = urem i64 %a, %b ; <i64> [#uses=1] 116 ret i64 %tmp1 117} 118 119; Make sure we avoid a libcall for some constants. 120define i64 @f7(i64 %a) { 121; CHECK-LABEL: f7 122; CHECK-SWDIV: adc 123; CHECK-SWDIV: umull 124; CHECK-HWDIV-ARM-OR-THUMB2: adc 125; CHECK-HWDIV-ARM-OR-THUMB2: umull 126; CHECK-EABI: adc 127; CHECK-EABI: umull 128; No 32-bit => 64-bit HW multiply instruction prevents optimisation 129; CHECK-HWDIV-THUMB1: __umoddi3 130 %tmp1 = urem i64 %a, 3 131 ret i64 %tmp1 132} 133 134; Make sure we avoid a libcall for some constants. 135define i64 @f8(i64 %a) { 136; CHECK-LABEL: f8 137; CHECK-SWDIV: adc 138; CHECK-SWDIV: umull 139; CHECK-HWDIV-ARM-OR-THUMB2: adc 140; CHECK-HWDIV-ARM-OR-THUMB2: umull 141; CHECK-EABI: adc 142; CHECK-EABI: umull 143; No 32-bit => 64-bit HW multiply instruction prevents optimisation 144; CHECK-HWDIV-THUMB1: __udivdi3 145 %tmp1 = udiv i64 %a, 3 146 ret i64 %tmp1 147} 148