202 lines · plain
1; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-a8 | \2; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-SWDIV3; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=swift | \4; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-HWDIV-ARM-OR-THUMB25; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-r4 | \6; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-SWDIV7; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-r4f | \8; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-SWDIV9; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-r5 | \10; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-HWDIV-ARM-OR-THUMB211; RUN: llc < %s -mtriple=arm-none-eabi -mcpu=cortex-a8 | \12; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-EABI13; RUN: llc < %s -mtriple=armv7 -mcpu=cortex-a7 | \14; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-HWDIV-ARM-OR-THUMB215; 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-THUMB217; 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-THUMB219; RUN: llc < %s -mtriple=thumbv8m.base -mcpu=cortex-m23 | \20; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-THUMB,CHECK-HWDIV-THUMB121; RUN: llc < %s -mtriple=armv7ve-none-linux-gnu | \22; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV23; RUN: llc < %s -mtriple=thumbv7ve-none-linux-gnu | \24; RUN: FileCheck %s -check-prefixes=CHECK,CHECK-HWDIV,CHECK-THUMB25 26define i32 @f1(i32 %a, i32 %b) {27entry:28; CHECK-LABEL: f129; CHECK-SWDIV: __divsi330 31; CHECK-THUMB: .thumb_func32; CHECK-HWDIV: sdiv33 34; CHECK-EABI: __aeabi_idiv35 %tmp1 = sdiv i32 %a, %b ; <i32> [#uses=1]36 ret i32 %tmp137}38 39define i32 @f2(i32 %a, i32 %b) {40entry:41; CHECK-LABEL: f242; CHECK-SWDIV: __udivsi343 44; CHECK-THUMB: .thumb_func45; CHECK-HWDIV: udiv46 47; CHECK-EABI: __aeabi_uidiv48 %tmp1 = udiv i32 %a, %b ; <i32> [#uses=1]49 ret i32 %tmp150}51 52define i32 @f3(i32 %a, i32 %b) {53entry:54; CHECK-LABEL: f355; CHECK-SWDIV: __modsi356 57; CHECK-THUMB: .thumb_func58; CHECK-HWDIV: sdiv59; CHECK-HWDIV-ARM-OR-THUMB2-NEXT: mls60; CHECK-HWDIV-THUMB1-NEXT: muls61; CHECK-HWDIV-THUMB1-NEXT: subs62 63; EABI MODE = Remainder in R1, quotient in R064; CHECK-EABI: __aeabi_idivmod65; CHECK-EABI-NEXT: mov r0, r166 %tmp1 = srem i32 %a, %b ; <i32> [#uses=1]67 ret i32 %tmp168}69 70define i32 @f4(i32 %a, i32 %b) {71entry:72; CHECK-LABEL: f473; CHECK-SWDIV: __umodsi374 75; CHECK-THUMB: .thumb_func76; CHECK-HWDIV: udiv77; CHECK-HWDIV-ARM-OR-THUMB2-NEXT: mls78; CHECK-HWDIV-THUMB1-NEXT: muls79; CHECK-HWDIV-THUMB1-NEXT: subs80 81; EABI MODE = Remainder in R1, quotient in R082; CHECK-EABI: __aeabi_uidivmod83; CHECK-EABI-NEXT: mov r0, r184 %tmp1 = urem i32 %a, %b ; <i32> [#uses=1]85 ret i32 %tmp186}87 88 89define i64 @f5(i64 %a, i64 %b) {90entry:91; CHECK-LABEL: f592; CHECK-SWDIV: __moddi393 94; CHECK-HWDIV: __moddi395 96; EABI MODE = Remainder in R2-R3, quotient in R0-R197; CHECK-EABI: __aeabi_ldivmod98; CHECK-EABI-NEXT: mov r0, r299; CHECK-EABI-NEXT: mov r1, r3100 %tmp1 = srem i64 %a, %b ; <i64> [#uses=1]101 ret i64 %tmp1102}103 104define i64 @f6(i64 %a, i64 %b) {105entry:106; CHECK-LABEL: f6107; CHECK-SWDIV: __umoddi3108 109; CHECK-HWDIV: __umoddi3110 111; EABI MODE = Remainder in R2-R3, quotient in R0-R1112; CHECK-EABI: __aeabi_uldivmod113; CHECK-EABI-NEXT: mov r0, r2114; CHECK-EABI-NEXT: mov r1, r3115 %tmp1 = urem i64 %a, %b ; <i64> [#uses=1]116 ret i64 %tmp1117}118 119; Make sure we avoid a libcall for some constants.120define i64 @f7(i64 %a) {121; CHECK-LABEL: f7122; CHECK-SWDIV: adc123; CHECK-SWDIV: umull124; CHECK-HWDIV-ARM-OR-THUMB2: adc125; CHECK-HWDIV-ARM-OR-THUMB2: umull126; CHECK-EABI: adc127; CHECK-EABI: umull128; No 32-bit => 64-bit HW multiply instruction prevents optimisation129; CHECK-HWDIV-THUMB1: __umoddi3130 %tmp1 = urem i64 %a, 3131 ret i64 %tmp1132}133 134; Make sure we avoid a libcall for some constants.135define i64 @f8(i64 %a) {136; CHECK-LABEL: f8137; CHECK-SWDIV: adc138; CHECK-SWDIV: umull139; CHECK-HWDIV-ARM-OR-THUMB2: adc140; CHECK-HWDIV-ARM-OR-THUMB2: umull141; CHECK-EABI: adc142; CHECK-EABI: umull143; No 32-bit => 64-bit HW multiply instruction prevents optimisation144; CHECK-HWDIV-THUMB1: __udivdi3145 %tmp1 = udiv i64 %a, 3146 ret i64 %tmp1147}148 149define i8 @sdiv_i8(i8 %a, i8 %b) {150entry:151; CHECK-LABEL: sdiv_i8152; CHECK-SWDIV: __divsi3153 154; CHECK-THUMB: .thumb_func155; CHECK-HWDIV: sdiv156 157; CHECK-EABI: __aeabi_idiv158 %tmp1 = sdiv i8 %a, %b ; <i8> [#uses=1]159 ret i8 %tmp1160}161 162 163define i16 @sdiv_i16(i16 %a, i16 %b) {164entry:165; CHECK-LABEL: sdiv_i16166; CHECK-SWDIV: __divsi3167 168; CHECK-THUMB: .thumb_func169; CHECK-HWDIV: sdiv170 171; CHECK-EABI: __aeabi_idiv172 %tmp1 = sdiv i16 %a, %b ; <i16> [#uses=1]173 ret i16 %tmp1174}175 176define i8 @udiv_i8(i8 %a, i8 %b) {177entry:178; CHECK-LABEL: udiv_i8179; CHECK-SWDIV: __udivsi3180 181; CHECK-THUMB: .thumb_func182; CHECK-HWDIV: udiv183 184; CHECK-EABI: __aeabi_uidiv185 %tmp1 = udiv i8 %a, %b ; <i8> [#uses=1]186 ret i8 %tmp1187}188 189 190define i16 @udiv_i16(i16 %a, i16 %b) {191entry:192; CHECK-LABEL: udiv_i16193; CHECK-SWDIV: __udivsi3194 195; CHECK-THUMB: .thumb_func196; CHECK-HWDIV: udiv197 198; CHECK-EABI: __aeabi_uidiv199 %tmp1 = udiv i16 %a, %b ; <i16> [#uses=1]200 ret i16 %tmp1201}202