Home | History | Annotate | Download | only in R600
      1 ; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck %s --check-prefix=EG --check-prefix=FUNC
      2 ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck %s --check-prefix=SI --check-prefix=FUNC
      3 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck %s --check-prefix=SI --check-prefix=FUNC
      4 
      5 declare float @llvm.fabs.f32(float) #0
      6 
      7 ; FUNC-LABEL: {{^}}fp_to_sint_i32:
      8 ; EG: FLT_TO_INT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
      9 ; SI: v_cvt_i32_f32_e32
     10 ; SI: s_endpgm
     11 define void @fp_to_sint_i32(i32 addrspace(1)* %out, float %in) {
     12   %conv = fptosi float %in to i32
     13   store i32 %conv, i32 addrspace(1)* %out
     14   ret void
     15 }
     16 
     17 ; FUNC-LABEL: {{^}}fp_to_sint_i32_fabs:
     18 ; SI: v_cvt_i32_f32_e64 v{{[0-9]+}}, |s{{[0-9]+}}|{{$}}
     19 define void @fp_to_sint_i32_fabs(i32 addrspace(1)* %out, float %in) {
     20   %in.fabs = call float @llvm.fabs.f32(float %in) #0
     21   %conv = fptosi float %in.fabs to i32
     22   store i32 %conv, i32 addrspace(1)* %out
     23   ret void
     24 }
     25 
     26 ; FUNC-LABEL: {{^}}fp_to_sint_v2i32:
     27 ; EG: FLT_TO_INT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
     28 ; EG: FLT_TO_INT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
     29 ; SI: v_cvt_i32_f32_e32
     30 ; SI: v_cvt_i32_f32_e32
     31 define void @fp_to_sint_v2i32(<2 x i32> addrspace(1)* %out, <2 x float> %in) {
     32   %result = fptosi <2 x float> %in to <2 x i32>
     33   store <2 x i32> %result, <2 x i32> addrspace(1)* %out
     34   ret void
     35 }
     36 
     37 ; FUNC-LABEL: {{^}}fp_to_sint_v4i32:
     38 ; EG: FLT_TO_INT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
     39 ; EG: FLT_TO_INT {{\** *}}T{{[0-9]+\.[XYZW]}}
     40 ; EG: FLT_TO_INT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
     41 ; EG: FLT_TO_INT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
     42 ; SI: v_cvt_i32_f32_e32
     43 ; SI: v_cvt_i32_f32_e32
     44 ; SI: v_cvt_i32_f32_e32
     45 ; SI: v_cvt_i32_f32_e32
     46 define void @fp_to_sint_v4i32(<4 x i32> addrspace(1)* %out, <4 x float> addrspace(1)* %in) {
     47   %value = load <4 x float>, <4 x float> addrspace(1) * %in
     48   %result = fptosi <4 x float> %value to <4 x i32>
     49   store <4 x i32> %result, <4 x i32> addrspace(1)* %out
     50   ret void
     51 }
     52 
     53 ; FUNC-LABEL: {{^}}fp_to_sint_i64:
     54 
     55 ; EG-DAG: AND_INT
     56 ; EG-DAG: LSHR
     57 ; EG-DAG: SUB_INT
     58 ; EG-DAG: AND_INT
     59 ; EG-DAG: ASHR
     60 ; EG-DAG: AND_INT
     61 ; EG-DAG: OR_INT
     62 ; EG-DAG: SUB_INT
     63 ; EG-DAG: LSHL
     64 ; EG-DAG: LSHL
     65 ; EG-DAG: SUB_INT
     66 ; EG-DAG: LSHR
     67 ; EG-DAG: LSHR
     68 ; EG-DAG: SETGT_UINT
     69 ; EG-DAG: SETGT_INT
     70 ; EG-DAG: XOR_INT
     71 ; EG-DAG: XOR_INT
     72 ; EG: SUB_INT
     73 ; EG-DAG: SUB_INT
     74 ; EG-DAG: CNDE_INT
     75 ; EG-DAG: CNDE_INT
     76 
     77 ; Check that the compiler doesn't crash with a "cannot select" error
     78 ; SI: s_endpgm
     79 define void @fp_to_sint_i64 (i64 addrspace(1)* %out, float %in) {
     80 entry:
     81   %0 = fptosi float %in to i64
     82   store i64 %0, i64 addrspace(1)* %out
     83   ret void
     84 }
     85 
     86 ; FUNC: {{^}}fp_to_sint_v2i64:
     87 ; EG-DAG: AND_INT
     88 ; EG-DAG: LSHR
     89 ; EG-DAG: SUB_INT
     90 ; EG-DAG: AND_INT
     91 ; EG-DAG: ASHR
     92 ; EG-DAG: AND_INT
     93 ; EG-DAG: OR_INT
     94 ; EG-DAG: SUB_INT
     95 ; EG-DAG: LSHL
     96 ; EG-DAG: LSHL
     97 ; EG-DAG: SUB_INT
     98 ; EG-DAG: LSHR
     99 ; EG-DAG: LSHR
    100 ; EG-DAG: SETGT_UINT
    101 ; EG-DAG: SETGT_INT
    102 ; EG-DAG: XOR_INT
    103 ; EG-DAG: XOR_INT
    104 ; EG-DAG: SUB_INT
    105 ; EG-DAG: SUB_INT
    106 ; EG-DAG: CNDE_INT
    107 ; EG-DAG: CNDE_INT
    108 ; EG-DAG: AND_INT
    109 ; EG-DAG: LSHR
    110 ; EG-DAG: SUB_INT
    111 ; EG-DAG: AND_INT
    112 ; EG-DAG: ASHR
    113 ; EG-DAG: AND_INT
    114 ; EG-DAG: OR_INT
    115 ; EG-DAG: SUB_INT
    116 ; EG-DAG: LSHL
    117 ; EG-DAG: LSHL
    118 ; EG-DAG: SUB_INT
    119 ; EG-DAG: LSHR
    120 ; EG-DAG: LSHR
    121 ; EG-DAG: SETGT_UINT
    122 ; EG-DAG: SETGT_INT
    123 ; EG-DAG: XOR_INT
    124 ; EG-DAG: XOR_INT
    125 ; EG-DAG: SUB_INT
    126 ; EG-DAG: SUB_INT
    127 ; EG-DAG: CNDE_INT
    128 ; EG-DAG: CNDE_INT
    129 
    130 ; SI: s_endpgm
    131 define void @fp_to_sint_v2i64(<2 x i64> addrspace(1)* %out, <2 x float> %x) {
    132   %conv = fptosi <2 x float> %x to <2 x i64>
    133   store <2 x i64> %conv, <2 x i64> addrspace(1)* %out
    134   ret void
    135 }
    136 
    137 ; FUNC: {{^}}fp_to_sint_v4i64:
    138 ; EG-DAG: AND_INT
    139 ; EG-DAG: LSHR
    140 ; EG-DAG: SUB_INT
    141 ; EG-DAG: AND_INT
    142 ; EG-DAG: ASHR
    143 ; EG-DAG: AND_INT
    144 ; EG-DAG: OR_INT
    145 ; EG-DAG: SUB_INT
    146 ; EG-DAG: LSHL
    147 ; EG-DAG: LSHL
    148 ; EG-DAG: SUB_INT
    149 ; EG-DAG: LSHR
    150 ; EG-DAG: LSHR
    151 ; EG-DAG: SETGT_UINT
    152 ; EG-DAG: SETGT_INT
    153 ; EG-DAG: XOR_INT
    154 ; EG-DAG: XOR_INT
    155 ; EG-DAG: SUB_INT
    156 ; EG-DAG: SUB_INT
    157 ; EG-DAG: CNDE_INT
    158 ; EG-DAG: CNDE_INT
    159 ; EG-DAG: AND_INT
    160 ; EG-DAG: LSHR
    161 ; EG-DAG: SUB_INT
    162 ; EG-DAG: AND_INT
    163 ; EG-DAG: ASHR
    164 ; EG-DAG: AND_INT
    165 ; EG-DAG: OR_INT
    166 ; EG-DAG: SUB_INT
    167 ; EG-DAG: LSHL
    168 ; EG-DAG: LSHL
    169 ; EG-DAG: SUB_INT
    170 ; EG-DAG: LSHR
    171 ; EG-DAG: LSHR
    172 ; EG-DAG: SETGT_UINT
    173 ; EG-DAG: SETGT_INT
    174 ; EG-DAG: XOR_INT
    175 ; EG-DAG: XOR_INT
    176 ; EG-DAG: SUB_INT
    177 ; EG-DAG: SUB_INT
    178 ; EG-DAG: CNDE_INT
    179 ; EG-DAG: CNDE_INT
    180 ; EG-DAG: AND_INT
    181 ; EG-DAG: LSHR
    182 ; EG-DAG: SUB_INT
    183 ; EG-DAG: AND_INT
    184 ; EG-DAG: ASHR
    185 ; EG-DAG: AND_INT
    186 ; EG-DAG: OR_INT
    187 ; EG-DAG: SUB_INT
    188 ; EG-DAG: LSHL
    189 ; EG-DAG: LSHL
    190 ; EG-DAG: SUB_INT
    191 ; EG-DAG: LSHR
    192 ; EG-DAG: LSHR
    193 ; EG-DAG: SETGT_UINT
    194 ; EG-DAG: SETGT_INT
    195 ; EG-DAG: XOR_INT
    196 ; EG-DAG: XOR_INT
    197 ; EG-DAG: SUB_INT
    198 ; EG-DAG: SUB_INT
    199 ; EG-DAG: CNDE_INT
    200 ; EG-DAG: CNDE_INT
    201 ; EG-DAG: AND_INT
    202 ; EG-DAG: LSHR
    203 ; EG-DAG: SUB_INT
    204 ; EG-DAG: AND_INT
    205 ; EG-DAG: ASHR
    206 ; EG-DAG: AND_INT
    207 ; EG-DAG: OR_INT
    208 ; EG-DAG: SUB_INT
    209 ; EG-DAG: LSHL
    210 ; EG-DAG: LSHL
    211 ; EG-DAG: SUB_INT
    212 ; EG-DAG: LSHR
    213 ; EG-DAG: LSHR
    214 ; EG-DAG: SETGT_UINT
    215 ; EG-DAG: SETGT_INT
    216 ; EG-DAG: XOR_INT
    217 ; EG-DAG: XOR_INT
    218 ; EG-DAG: SUB_INT
    219 ; EG-DAG: SUB_INT
    220 ; EG-DAG: CNDE_INT
    221 ; EG-DAG: CNDE_INT
    222 
    223 ; SI: s_endpgm
    224 define void @fp_to_sint_v4i64(<4 x i64> addrspace(1)* %out, <4 x float> %x) {
    225   %conv = fptosi <4 x float> %x to <4 x i64>
    226   store <4 x i64> %conv, <4 x i64> addrspace(1)* %out
    227   ret void
    228 }
    229 
    230 attributes #0 = { nounwind readnone }
    231