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 ; 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