1; RUN: llc -mtriple armv7-none-eabi %s -o - | FileCheck %s --check-prefix=EABI 2; RUN: llc -mtriple armv7-none-eabihf %s -o - | FileCheck %s --check-prefix=EABI 3; All "eabi" (Bare, GNU and Android) must lower SREM/UREM to __aeabi_{u,i}divmod 4; RUN: llc -mtriple armv7-linux-androideabi %s -o - | FileCheck %s --check-prefix=EABI 5; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=EABI 6; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefix=DARWIN 7; FIXME: long-term, we will use "-apple-macho" and won't need this exception: 8; RUN: llc -mtriple armv7-apple-darwin-eabi %s -o - | FileCheck %s --check-prefix=DARWIN 9 10define signext i16 @f16(i16 signext %a, i16 signext %b) { 11; EABI-LABEL: f16: 12; DARWIN-LABEL: f16: 13entry: 14 %conv = sext i16 %a to i32 15 %conv1 = sext i16 %b to i32 16 %div = sdiv i32 %conv, %conv1 17 %rem = srem i32 %conv, %conv1 18; EABI: __aeabi_idivmod 19; EABI: mov [[div:r[0-9]+]], r0 20; EABI: mov [[rem:r[0-9]+]], r1 21; DARWIN: ___divsi3 22; DARWIN: mov [[sum:r[0-9]+]], r0 23; DARWIN: __modsi3 24; DARWIN: add [[sum]]{{.*}}r0 25 %rem8 = srem i32 %conv1, %conv 26; EABI: __aeabi_idivmod 27; DARWIN: __modsi3 28 %add = add nsw i32 %rem, %div 29 %add13 = add nsw i32 %add, %rem8 30 %conv14 = trunc i32 %add13 to i16 31; EABI: add r0{{.*}}r1 32; EABI: sxth r0, r0 33; DARWIN: add r0{{.*}}[[sum]] 34; DARWIN: sxth r0, r0 35 ret i16 %conv14 36} 37 38define i32 @f32(i32 %a, i32 %b) { 39; EABI-LABEL: f32: 40; DARWIN-LABEL: f32: 41entry: 42 %div = sdiv i32 %a, %b 43 %rem = srem i32 %a, %b 44; EABI: __aeabi_idivmod 45; EABI: mov [[div:r[0-9]+]], r0 46; EABI: mov [[rem:r[0-9]+]], r1 47; DARWIN: ___divsi3 48; DARWIN: mov [[sum:r[0-9]+]], r0 49; DARWIN: __modsi3 50; DARWIN: add [[sum]]{{.*}}r0 51 %rem1 = srem i32 %b, %a 52; EABI: __aeabi_idivmod 53; DARWIN: __modsi3 54 %add = add nsw i32 %rem, %div 55 %add2 = add nsw i32 %add, %rem1 56; EABI: add r0{{.*}}r1 57; DARWIN: add r0{{.*}}[[sum]] 58 ret i32 %add2 59} 60 61define i32 @uf(i32 %a, i32 %b) { 62; EABI-LABEL: uf: 63; DARWIN-LABEL: uf: 64entry: 65 %div = udiv i32 %a, %b 66 %rem = urem i32 %a, %b 67; EABI: __aeabi_uidivmod 68; DARWIN: ___udivsi3 69; DARWIN: mov [[sum:r[0-9]+]], r0 70; DARWIN: __umodsi3 71; DARWIN: add [[sum]]{{.*}}r0 72 %rem1 = urem i32 %b, %a 73; EABI: __aeabi_uidivmod 74; DARWIN: __umodsi3 75 %add = add nuw i32 %rem, %div 76 %add2 = add nuw i32 %add, %rem1 77; EABI: add r0{{.*}}r1 78; DARWIN: add r0{{.*}}[[sum]] 79 ret i32 %add2 80} 81 82define i64 @longf(i64 %a, i64 %b) { 83; EABI-LABEL: longf: 84; DARWIN-LABEL: longf: 85entry: 86 %div = sdiv i64 %a, %b 87 %rem = srem i64 %a, %b 88; EABI: __aeabi_ldivmod 89; EABI-NEXT: adds r0 90; EABI-NEXT: adc r1 91; EABI-NOT: __aeabi_ldivmod 92; DARWIN: ___divdi3 93; DARWIN: mov [[div1:r[0-9]+]], r0 94; DARWIN: mov [[div2:r[0-9]+]], r1 95; DARWIN: __moddi3 96 %add = add nsw i64 %rem, %div 97; DARWIN: adds r0{{.*}}[[div1]] 98; DARWIN: adc r1{{.*}}[[div2]] 99 ret i64 %add 100} 101 102define i32 @g1(i32 %a, i32 %b) { 103; EABI-LABEL: g1: 104; DARWIN-LABEL: g1: 105entry: 106 %div = sdiv i32 %a, %b 107 %rem = srem i32 %a, %b 108; EABI: __aeabi_idivmod 109; DARWIN: ___divsi3 110; DARWIN: mov [[sum:r[0-9]+]], r0 111; DARWIN: __modsi3 112 %add = add nsw i32 %rem, %div 113; EABI: add r0{{.*}}r1 114; DARWIN: add r0{{.*}}[[sum]] 115 ret i32 %add 116} 117 118; On both Darwin and Gnu, this is just a call to __modsi3 119define i32 @g2(i32 %a, i32 %b) { 120; EABI-LABEL: g2: 121; DARWIN-LABEL: g2: 122entry: 123 %rem = srem i32 %a, %b 124; EABI: __aeabi_idivmod 125; DARWIN: __modsi3 126 ret i32 %rem 127; EABI: mov r0, r1 128} 129 130define i32 @g3(i32 %a, i32 %b) { 131; EABI-LABEL: g3: 132; DARWIN-LABEL: g3: 133entry: 134 %rem = srem i32 %a, %b 135; EABI: __aeabi_idivmod 136; EABI: mov [[mod:r[0-9]+]], r1 137; DARWIN: __modsi3 138; DARWIN: mov [[sum:r[0-9]+]], r0 139 %rem1 = srem i32 %b, %rem 140; EABI: __aeabi_idivmod 141; DARWIN: __modsi3 142 %add = add nsw i32 %rem1, %rem 143; EABI: add r0, r1, [[mod]] 144; DARWIN: add r0{{.*}}[[sum]] 145 ret i32 %add 146} 147 148define i32 @g4(i32 %a, i32 %b) { 149; EABI-LABEL: g4: 150; DARWIN-LABEL: g4: 151entry: 152 %div = sdiv i32 %a, %b 153; EABI: __aeabi_idiv{{$}} 154; EABI: mov [[div:r[0-9]+]], r0 155; DARWIN: ___divsi3 156; DARWIN: mov [[sum:r[0-9]+]], r0 157 %rem = srem i32 %b, %div 158; EABI: __aeabi_idivmod 159; DARWIN: __modsi3 160 %add = add nsw i32 %rem, %div 161; EABI: add r0, r1, [[div]] 162; DARWIN: add r0{{.*}}[[sum]] 163 ret i32 %add 164} 165