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