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; FUNC-LABEL: {{^}}fp_to_uint_f32_to_i32:
6; EG: FLT_TO_UINT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
7
8; SI: v_cvt_u32_f32_e32
9; SI: s_endpgm
10define void @fp_to_uint_f32_to_i32 (i32 addrspace(1)* %out, float %in) {
11  %conv = fptoui float %in to i32
12  store i32 %conv, i32 addrspace(1)* %out
13  ret void
14}
15
16; FUNC-LABEL: {{^}}fp_to_uint_v2f32_to_v2i32:
17; EG: FLT_TO_UINT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
18; EG: FLT_TO_UINT {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
19
20; SI: v_cvt_u32_f32_e32
21; SI: v_cvt_u32_f32_e32
22define void @fp_to_uint_v2f32_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x float> %in) {
23  %result = fptoui <2 x float> %in to <2 x i32>
24  store <2 x i32> %result, <2 x i32> addrspace(1)* %out
25  ret void
26}
27
28; FUNC-LABEL: {{^}}fp_to_uint_v4f32_to_v4i32:
29; EG: FLT_TO_UINT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
30; EG: FLT_TO_UINT {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
31; EG: FLT_TO_UINT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
32; EG: FLT_TO_UINT {{\** *}}T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
33; SI: v_cvt_u32_f32_e32
34; SI: v_cvt_u32_f32_e32
35; SI: v_cvt_u32_f32_e32
36; SI: v_cvt_u32_f32_e32
37
38define void @fp_to_uint_v4f32_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x float> addrspace(1)* %in) {
39  %value = load <4 x float> addrspace(1) * %in
40  %result = fptoui <4 x float> %value to <4 x i32>
41  store <4 x i32> %result, <4 x i32> addrspace(1)* %out
42  ret void
43}
44
45; FUNC: {{^}}fp_to_uint_f32_to_i64:
46; EG-DAG: AND_INT
47; EG-DAG: LSHR
48; EG-DAG: SUB_INT
49; EG-DAG: AND_INT
50; EG-DAG: ASHR
51; EG-DAG: AND_INT
52; EG-DAG: OR_INT
53; EG-DAG: SUB_INT
54; EG-DAG: LSHL
55; EG-DAG: LSHL
56; EG-DAG: SUB_INT
57; EG-DAG: LSHR
58; EG-DAG: LSHR
59; EG-DAG: SETGT_UINT
60; EG-DAG: SETGT_INT
61; EG-DAG: XOR_INT
62; EG-DAG: XOR_INT
63; EG: SUB_INT
64; EG-DAG: SUB_INT
65; EG-DAG: CNDE_INT
66; EG-DAG: CNDE_INT
67
68; SI: s_endpgm
69define void @fp_to_uint_f32_to_i64(i64 addrspace(1)* %out, float %x) {
70  %conv = fptoui float %x to i64
71  store i64 %conv, i64 addrspace(1)* %out
72  ret void
73}
74
75; FUNC: {{^}}fp_to_uint_v2f32_to_v2i64:
76; EG-DAG: AND_INT
77; EG-DAG: LSHR
78; EG-DAG: SUB_INT
79; EG-DAG: AND_INT
80; EG-DAG: ASHR
81; EG-DAG: AND_INT
82; EG-DAG: OR_INT
83; EG-DAG: SUB_INT
84; EG-DAG: LSHL
85; EG-DAG: LSHL
86; EG-DAG: SUB_INT
87; EG-DAG: LSHR
88; EG-DAG: LSHR
89; EG-DAG: SETGT_UINT
90; EG-DAG: SETGT_INT
91; EG-DAG: XOR_INT
92; EG-DAG: XOR_INT
93; EG-DAG: SUB_INT
94; EG-DAG: SUB_INT
95; EG-DAG: CNDE_INT
96; EG-DAG: CNDE_INT
97; EG-DAG: AND_INT
98; EG-DAG: LSHR
99; EG-DAG: SUB_INT
100; EG-DAG: AND_INT
101; EG-DAG: ASHR
102; EG-DAG: AND_INT
103; EG-DAG: OR_INT
104; EG-DAG: SUB_INT
105; EG-DAG: LSHL
106; EG-DAG: LSHL
107; EG-DAG: SUB_INT
108; EG-DAG: LSHR
109; EG-DAG: LSHR
110; EG-DAG: SETGT_UINT
111; EG-DAG: SETGT_INT
112; EG-DAG: XOR_INT
113; EG-DAG: XOR_INT
114; EG-DAG: SUB_INT
115; EG-DAG: SUB_INT
116; EG-DAG: CNDE_INT
117; EG-DAG: CNDE_INT
118
119; SI: s_endpgm
120define void @fp_to_uint_v2f32_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x float> %x) {
121  %conv = fptoui <2 x float> %x to <2 x i64>
122  store <2 x i64> %conv, <2 x i64> addrspace(1)* %out
123  ret void
124}
125
126; FUNC: {{^}}fp_to_uint_v4f32_to_v4i64:
127; EG-DAG: AND_INT
128; EG-DAG: LSHR
129; EG-DAG: SUB_INT
130; EG-DAG: AND_INT
131; EG-DAG: ASHR
132; EG-DAG: AND_INT
133; EG-DAG: OR_INT
134; EG-DAG: SUB_INT
135; EG-DAG: LSHL
136; EG-DAG: LSHL
137; EG-DAG: SUB_INT
138; EG-DAG: LSHR
139; EG-DAG: LSHR
140; EG-DAG: SETGT_UINT
141; EG-DAG: SETGT_INT
142; EG-DAG: XOR_INT
143; EG-DAG: XOR_INT
144; EG-DAG: SUB_INT
145; EG-DAG: SUB_INT
146; EG-DAG: CNDE_INT
147; EG-DAG: CNDE_INT
148; EG-DAG: AND_INT
149; EG-DAG: LSHR
150; EG-DAG: SUB_INT
151; EG-DAG: AND_INT
152; EG-DAG: ASHR
153; EG-DAG: AND_INT
154; EG-DAG: OR_INT
155; EG-DAG: SUB_INT
156; EG-DAG: LSHL
157; EG-DAG: LSHL
158; EG-DAG: SUB_INT
159; EG-DAG: LSHR
160; EG-DAG: LSHR
161; EG-DAG: SETGT_UINT
162; EG-DAG: SETGT_INT
163; EG-DAG: XOR_INT
164; EG-DAG: XOR_INT
165; EG-DAG: SUB_INT
166; EG-DAG: SUB_INT
167; EG-DAG: CNDE_INT
168; EG-DAG: CNDE_INT
169; EG-DAG: AND_INT
170; EG-DAG: LSHR
171; EG-DAG: SUB_INT
172; EG-DAG: AND_INT
173; EG-DAG: ASHR
174; EG-DAG: AND_INT
175; EG-DAG: OR_INT
176; EG-DAG: SUB_INT
177; EG-DAG: LSHL
178; EG-DAG: LSHL
179; EG-DAG: SUB_INT
180; EG-DAG: LSHR
181; EG-DAG: LSHR
182; EG-DAG: SETGT_UINT
183; EG-DAG: SETGT_INT
184; EG-DAG: XOR_INT
185; EG-DAG: XOR_INT
186; EG-DAG: SUB_INT
187; EG-DAG: SUB_INT
188; EG-DAG: CNDE_INT
189; EG-DAG: CNDE_INT
190; EG-DAG: AND_INT
191; EG-DAG: LSHR
192; EG-DAG: SUB_INT
193; EG-DAG: AND_INT
194; EG-DAG: ASHR
195; EG-DAG: AND_INT
196; EG-DAG: OR_INT
197; EG-DAG: SUB_INT
198; EG-DAG: LSHL
199; EG-DAG: LSHL
200; EG-DAG: SUB_INT
201; EG-DAG: LSHR
202; EG-DAG: LSHR
203; EG-DAG: SETGT_UINT
204; EG-DAG: SETGT_INT
205; EG-DAG: XOR_INT
206; EG-DAG: XOR_INT
207; EG-DAG: SUB_INT
208; EG-DAG: SUB_INT
209; EG-DAG: CNDE_INT
210; EG-DAG: CNDE_INT
211
212; SI: s_endpgm
213define void @fp_to_uint_v4f32_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x float> %x) {
214  %conv = fptoui <4 x float> %x to <4 x i64>
215  store <4 x i64> %conv, <4 x i64> addrspace(1)* %out
216  ret void
217}
218