Home | History | Annotate | Download | only in ARM
      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