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