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