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