1; RUN: llc -mtriple armv7-none-eabi %s -o - | FileCheck %s --check-prefix=EABI 2; RUN: llc -mtriple armv7-linux-gnueabi %s -o - | FileCheck %s --check-prefix=GNU 3; RUN: llc -mtriple armv7-apple-darwin %s -o - | FileCheck %s --check-prefix=DARWIN 4 5define signext i16 @f16(i16 signext %a, i16 signext %b) { 6; EABI-LABEL: f16: 7; GNU-LABEL: f16: 8; DARWIN-LABEL: f16: 9entry: 10 %conv = sext i16 %a to i32 11 %conv1 = sext i16 %b to i32 12 %div = sdiv i32 %conv, %conv1 13 %rem = srem i32 %conv, %conv1 14; EABI: __aeabi_idivmod 15; EABI: mov [[div:r[0-9]+]], r0 16; EABI: mov [[rem:r[0-9]+]], r1 17; GNU: __aeabi_idiv 18; GNU: mov [[sum:r[0-9]+]], r0 19; GNU: __modsi3 20; GNU: add [[sum]]{{.*}}r0 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; GNU: __modsi3 28; DARWIN: __modsi3 29 %add = add nsw i32 %rem, %div 30 %add13 = add nsw i32 %add, %rem8 31 %conv14 = trunc i32 %add13 to i16 32; EABI: add r0{{.*}}r1 33; EABI: sxth r0, r0 34; GNU: add r0{{.*}}[[sum]] 35; GNU: sxth r0, r0 36; DARWIN: add r0{{.*}}[[sum]] 37; DARWIN: sxth r0, r0 38 ret i16 %conv14 39} 40 41define i32 @f32(i32 %a, i32 %b) { 42; EABI-LABEL: f32: 43; GNU-LABEL: f32: 44; DARWIN-LABEL: f32: 45entry: 46 %div = sdiv i32 %a, %b 47 %rem = srem i32 %a, %b 48; EABI: __aeabi_idivmod 49; EABI: mov [[div:r[0-9]+]], r0 50; EABI: mov [[rem:r[0-9]+]], r1 51; GNU: __aeabi_idiv 52; GNU: mov [[sum:r[0-9]+]], r0 53; GNU: __modsi3 54; GNU: add [[sum]]{{.*}}r0 55; DARWIN: ___divsi3 56; DARWIN: mov [[sum:r[0-9]+]], r0 57; DARWIN: __modsi3 58; DARWIN: add [[sum]]{{.*}}r0 59 %rem1 = srem i32 %b, %a 60; EABI: __aeabi_idivmod 61; GNU: __modsi3 62; DARWIN: __modsi3 63 %add = add nsw i32 %rem, %div 64 %add2 = add nsw i32 %add, %rem1 65; EABI: add r0{{.*}}r1 66; GNU: add r0{{.*}}[[sum]] 67; DARWIN: add r0{{.*}}[[sum]] 68 ret i32 %add2 69} 70 71define i32 @uf(i32 %a, i32 %b) { 72; EABI-LABEL: uf: 73; GNU-LABEL: uf: 74; DARWIN-LABEL: uf: 75entry: 76 %div = udiv i32 %a, %b 77 %rem = urem i32 %a, %b 78; EABI: __aeabi_uidivmod 79; GNU: __aeabi_uidiv 80; GNU: mov [[sum:r[0-9]+]], r0 81; GNU: __umodsi3 82; GNU: add [[sum]]{{.*}}r0 83; DARWIN: ___udivsi3 84; DARWIN: mov [[sum:r[0-9]+]], r0 85; DARWIN: __umodsi3 86; DARWIN: add [[sum]]{{.*}}r0 87 %rem1 = urem i32 %b, %a 88; EABI: __aeabi_uidivmod 89; GNU: __umodsi3 90; DARWIN: __umodsi3 91 %add = add nuw i32 %rem, %div 92 %add2 = add nuw i32 %add, %rem1 93; EABI: add r0{{.*}}r1 94; GNU: add r0{{.*}}[[sum]] 95; DARWIN: add r0{{.*}}[[sum]] 96 ret i32 %add2 97} 98 99; FIXME: AEABI is not lowering long u/srem into u/ldivmod 100define i64 @longf(i64 %a, i64 %b) { 101; EABI-LABEL: longf: 102; GNU-LABEL: longf: 103; DARWIN-LABEL: longf: 104entry: 105 %div = sdiv i64 %a, %b 106 %rem = srem i64 %a, %b 107; EABI: __aeabi_ldivmod 108; GNU: __aeabi_ldivmod 109; GNU: mov [[div1:r[0-9]+]], r0 110; GNU: mov [[div2:r[0-9]+]], r1 111; DARWIN: ___divdi3 112; DARWIN: mov [[div1:r[0-9]+]], r0 113; DARWIN: mov [[div2:r[0-9]+]], r1 114; DARWIN: __moddi3 115 %add = add nsw i64 %rem, %div 116; GNU: adds r0{{.*}}[[div1]] 117; GNU: adc r1{{.*}}[[div2]] 118; DARWIN: adds r0{{.*}}[[div1]] 119; DARWIN: adc r1{{.*}}[[div2]] 120 ret i64 %add 121} 122 123define i32 @g1(i32 %a, i32 %b) { 124; EABI-LABEL: g1: 125; GNU-LABEL: g1: 126; DARWIN-LABEL: g1: 127entry: 128 %div = sdiv i32 %a, %b 129 %rem = srem i32 %a, %b 130; EABI: __aeabi_idivmod 131; GNU: __aeabi_idiv 132; GNU: mov [[sum:r[0-9]+]], r0 133; GNU: __modsi3 134; DARWIN: ___divsi3 135; DARWIN: mov [[sum:r[0-9]+]], r0 136; DARWIN: __modsi3 137 %add = add nsw i32 %rem, %div 138; EABI: add r0{{.*}}r1 139; GNU: add r0{{.*}}[[sum]] 140; DARWIN: add r0{{.*}}[[sum]] 141 ret i32 %add 142} 143 144; On both Darwin and Gnu, this is just a call to __modsi3 145define i32 @g2(i32 %a, i32 %b) { 146; EABI-LABEL: g2: 147; GNU-LABEL: g2: 148; DARWIN-LABEL: g2: 149entry: 150 %rem = srem i32 %a, %b 151; EABI: __aeabi_idivmod 152; GNU: __modsi3 153; DARWIN: __modsi3 154 ret i32 %rem 155; EABI: mov r0, r1 156} 157 158define i32 @g3(i32 %a, i32 %b) { 159; EABI-LABEL: g3: 160; GNU-LABEL: g3: 161; DARWIN-LABEL: g3: 162entry: 163 %rem = srem i32 %a, %b 164; EABI: __aeabi_idivmod 165; EABI: mov [[mod:r[0-9]+]], r1 166; GNU: __modsi3 167; GNU: mov [[sum:r[0-9]+]], r0 168; DARWIN: __modsi3 169; DARWIN: mov [[sum:r[0-9]+]], r0 170 %rem1 = srem i32 %b, %rem 171; EABI: __aeabi_idivmod 172; GNU: __modsi3 173; DARWIN: __modsi3 174 %add = add nsw i32 %rem1, %rem 175; EABI: add r0, r1, [[mod]] 176; GNU: add r0{{.*}}[[sum]] 177; DARWIN: add r0{{.*}}[[sum]] 178 ret i32 %add 179} 180 181define i32 @g4(i32 %a, i32 %b) { 182; EABI-LABEL: g4: 183; GNU-LABEL: g4: 184; DARWIN-LABEL: g4: 185entry: 186 %div = sdiv i32 %a, %b 187; EABI: __aeabi_idivmod 188; EABI: mov [[div:r[0-9]+]], r0 189; GNU __aeabi_idiv 190; GNU: mov [[sum:r[0-9]+]], r0 191; DARWIN: ___divsi3 192; DARWIN: mov [[sum:r[0-9]+]], r0 193 %rem = srem i32 %b, %div 194; EABI: __aeabi_idivmod 195; GNU: __modsi3 196; DARWIN: __modsi3 197 %add = add nsw i32 %rem, %div 198; EABI: add r0, r1, [[div]] 199; GNU: add r0{{.*}}[[sum]] 200; DARWIN: add r0{{.*}}[[sum]] 201 ret i32 %add 202} 203