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