Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
      2 ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
      3 
      4 ; Test sitofp
      5 
      6 define void @sitofp_single_i32(i32 %a, float %b) nounwind ssp {
      7 entry:
      8 ; ARM: sitofp_single_i32
      9 ; ARM: vmov s0, r0
     10 ; ARM: vcvt.f32.s32 s0, s0
     11 ; THUMB: sitofp_single_i32
     12 ; THUMB: vmov s0, r0
     13 ; THUMB: vcvt.f32.s32 s0, s0
     14   %b.addr = alloca float, align 4
     15   %conv = sitofp i32 %a to float
     16   store float %conv, float* %b.addr, align 4
     17   ret void
     18 }
     19 
     20 define void @sitofp_single_i16(i16 %a, float %b) nounwind ssp {
     21 entry:
     22 ; ARM: sitofp_single_i16
     23 ; ARM: sxth r0, r0
     24 ; ARM: vmov s0, r0
     25 ; ARM: vcvt.f32.s32 s0, s0
     26 ; THUMB: sitofp_single_i16
     27 ; THUMB: sxth r0, r0
     28 ; THUMB: vmov s0, r0
     29 ; THUMB: vcvt.f32.s32 s0, s0
     30   %b.addr = alloca float, align 4
     31   %conv = sitofp i16 %a to float
     32   store float %conv, float* %b.addr, align 4
     33   ret void
     34 }
     35 
     36 define void @sitofp_single_i8(i8 %a) nounwind ssp {
     37 entry:
     38 ; ARM: sitofp_single_i8
     39 ; ARM: sxtb r0, r0
     40 ; ARM: vmov s0, r0
     41 ; ARM: vcvt.f32.s32 s0, s0
     42 ; THUMB: sitofp_single_i8
     43 ; THUMB: sxtb r0, r0
     44 ; THUMB: vmov s0, r0
     45 ; THUMB: vcvt.f32.s32 s0, s0
     46   %b.addr = alloca float, align 4
     47   %conv = sitofp i8 %a to float
     48   store float %conv, float* %b.addr, align 4
     49   ret void
     50 }
     51 
     52 define void @sitofp_double_i32(i32 %a, double %b) nounwind ssp {
     53 entry:
     54 ; ARM: sitofp_double_i32
     55 ; ARM: vmov s0, r0
     56 ; ARM: vcvt.f64.s32 d16, s0
     57 ; THUMB: sitofp_double_i32
     58 ; THUMB: vmov s0, r0
     59 ; THUMB: vcvt.f64.s32 d16, s0
     60   %b.addr = alloca double, align 8
     61   %conv = sitofp i32 %a to double
     62   store double %conv, double* %b.addr, align 8
     63   ret void
     64 }
     65 
     66 define void @sitofp_double_i16(i16 %a, double %b) nounwind ssp {
     67 entry:
     68 ; ARM: sitofp_double_i16
     69 ; ARM: sxth r0, r0
     70 ; ARM: vmov s0, r0
     71 ; ARM: vcvt.f64.s32 d16, s0
     72 ; THUMB: sitofp_double_i16
     73 ; THUMB: sxth r0, r0
     74 ; THUMB: vmov s0, r0
     75 ; THUMB: vcvt.f64.s32 d16, s0
     76   %b.addr = alloca double, align 8
     77   %conv = sitofp i16 %a to double
     78   store double %conv, double* %b.addr, align 8
     79   ret void
     80 }
     81 
     82 define void @sitofp_double_i8(i8 %a, double %b) nounwind ssp {
     83 entry:
     84 ; ARM: sitofp_double_i8
     85 ; ARM: sxtb r0, r0
     86 ; ARM: vmov s0, r0
     87 ; ARM: vcvt.f64.s32 d16, s0
     88 ; THUMB: sitofp_double_i8
     89 ; THUMB: sxtb r0, r0
     90 ; THUMB: vmov s0, r0
     91 ; THUMB: vcvt.f64.s32 d16, s0
     92   %b.addr = alloca double, align 8
     93   %conv = sitofp i8 %a to double
     94   store double %conv, double* %b.addr, align 8
     95   ret void
     96 }
     97 
     98 ; Test uitofp
     99 
    100 define void @uitofp_single_i32(i32 %a, float %b) nounwind ssp {
    101 entry:
    102 ; ARM: uitofp_single_i32
    103 ; ARM: vmov s0, r0
    104 ; ARM: vcvt.f32.u32 s0, s0
    105 ; THUMB: uitofp_single_i32
    106 ; THUMB: vmov s0, r0
    107 ; THUMB: vcvt.f32.u32 s0, s0
    108   %b.addr = alloca float, align 4
    109   %conv = uitofp i32 %a to float
    110   store float %conv, float* %b.addr, align 4
    111   ret void
    112 }
    113 
    114 define void @uitofp_single_i16(i16 %a, float %b) nounwind ssp {
    115 entry:
    116 ; ARM: uitofp_single_i16
    117 ; ARM: uxth r0, r0
    118 ; ARM: vmov s0, r0
    119 ; ARM: vcvt.f32.u32 s0, s0
    120 ; THUMB: uitofp_single_i16
    121 ; THUMB: uxth r0, r0
    122 ; THUMB: vmov s0, r0
    123 ; THUMB: vcvt.f32.u32 s0, s0
    124   %b.addr = alloca float, align 4
    125   %conv = uitofp i16 %a to float
    126   store float %conv, float* %b.addr, align 4
    127   ret void
    128 }
    129 
    130 define void @uitofp_single_i8(i8 %a) nounwind ssp {
    131 entry:
    132 ; ARM: uitofp_single_i8
    133 ; ARM: uxtb r0, r0
    134 ; ARM: vmov s0, r0
    135 ; ARM: vcvt.f32.u32 s0, s0
    136 ; THUMB: uitofp_single_i8
    137 ; THUMB: uxtb r0, r0
    138 ; THUMB: vmov s0, r0
    139 ; THUMB: vcvt.f32.u32 s0, s0
    140   %b.addr = alloca float, align 4
    141   %conv = uitofp i8 %a to float
    142   store float %conv, float* %b.addr, align 4
    143   ret void
    144 }
    145 
    146 define void @uitofp_double_i32(i32 %a, double %b) nounwind ssp {
    147 entry:
    148 ; ARM: uitofp_double_i32
    149 ; ARM: vmov s0, r0
    150 ; ARM: vcvt.f64.u32 d16, s0
    151 ; THUMB: uitofp_double_i32
    152 ; THUMB: vmov s0, r0
    153 ; THUMB: vcvt.f64.u32 d16, s0
    154   %b.addr = alloca double, align 8
    155   %conv = uitofp i32 %a to double
    156   store double %conv, double* %b.addr, align 8
    157   ret void
    158 }
    159 
    160 define void @uitofp_double_i16(i16 %a, double %b) nounwind ssp {
    161 entry:
    162 ; ARM: uitofp_double_i16
    163 ; ARM: uxth r0, r0
    164 ; ARM: vmov s0, r0
    165 ; ARM: vcvt.f64.u32 d16, s0
    166 ; THUMB: uitofp_double_i16
    167 ; THUMB: uxth r0, r0
    168 ; THUMB: vmov s0, r0
    169 ; THUMB: vcvt.f64.u32 d16, s0
    170   %b.addr = alloca double, align 8
    171   %conv = uitofp i16 %a to double
    172   store double %conv, double* %b.addr, align 8
    173   ret void
    174 }
    175 
    176 define void @uitofp_double_i8(i8 %a, double %b) nounwind ssp {
    177 entry:
    178 ; ARM: uitofp_double_i8
    179 ; ARM: uxtb r0, r0
    180 ; ARM: vmov s0, r0
    181 ; ARM: vcvt.f64.u32 d16, s0
    182 ; THUMB: uitofp_double_i8
    183 ; THUMB: uxtb r0, r0
    184 ; THUMB: vmov s0, r0
    185 ; THUMB: vcvt.f64.u32 d16, s0
    186   %b.addr = alloca double, align 8
    187   %conv = uitofp i8 %a to double
    188   store double %conv, double* %b.addr, align 8
    189   ret void
    190 }
    191 
    192 ; Test fptosi
    193 
    194 define void @fptosi_float(float %a) nounwind ssp {
    195 entry:
    196 ; ARM: fptosi_float
    197 ; ARM: vcvt.s32.f32 s0, s0
    198 ; THUMB: fptosi_float
    199 ; THUMB: vcvt.s32.f32 s0, s0
    200   %b.addr = alloca i32, align 4
    201   %conv = fptosi float %a to i32
    202   store i32 %conv, i32* %b.addr, align 4
    203   ret void
    204 }
    205 
    206 define void @fptosi_double(double %a) nounwind ssp {
    207 entry:
    208 ; ARM: fptosi_double
    209 ; ARM: vcvt.s32.f64 s0, d16
    210 ; THUMB: fptosi_double
    211 ; THUMB: vcvt.s32.f64 s0, d16
    212   %b.addr = alloca i32, align 8
    213   %conv = fptosi double %a to i32
    214   store i32 %conv, i32* %b.addr, align 8
    215   ret void
    216 }
    217 
    218 ; Test fptoui
    219 
    220 define void @fptoui_float(float %a) nounwind ssp {
    221 entry:
    222 ; ARM: fptoui_float
    223 ; ARM: vcvt.u32.f32 s0, s0
    224 ; THUMB: fptoui_float
    225 ; THUMB: vcvt.u32.f32 s0, s0
    226   %b.addr = alloca i32, align 4
    227   %conv = fptoui float %a to i32
    228   store i32 %conv, i32* %b.addr, align 4
    229   ret void
    230 }
    231 
    232 define void @fptoui_double(double %a) nounwind ssp {
    233 entry:
    234 ; ARM: fptoui_double
    235 ; ARM: vcvt.u32.f64 s0, d16
    236 ; THUMB: fptoui_double
    237 ; THUMB: vcvt.u32.f64 s0, d16
    238   %b.addr = alloca i32, align 8
    239   %conv = fptoui double %a to i32
    240   store i32 %conv, i32* %b.addr, align 8
    241   ret void
    242 }
    243