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