Revert 239644.
[oota-llvm.git] / test / CodeGen / R600 / fp_to_sint.ll
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 }