xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/half.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; half args should be promoted to float
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}load_f16_arg:
7*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[ARG:s[0-9]+]]
8*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32 [[CVT:v[0-9]+]], [[ARG]]
9*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_short [[CVT]]
10*9880d681SAndroid Build Coastguard Workerdefine void @load_f16_arg(half addrspace(1)* %out, half %arg) #0 {
11*9880d681SAndroid Build Coastguard Worker  store half %arg, half addrspace(1)* %out
12*9880d681SAndroid Build Coastguard Worker  ret void
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}load_v2f16_arg:
16*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort [[V0:v[0-9]+]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:44
17*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort [[V1:v[0-9]+]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:46
18*9880d681SAndroid Build Coastguard Worker; GCN: v_lshlrev_b32_e32 [[HI:v[0-9]+]], 16, [[V1]]
19*9880d681SAndroid Build Coastguard Worker; GCN: v_or_b32_e32 [[PACKED:v[0-9]+]], [[V0]], [[HI]]
20*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[PACKED]], off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}}
21*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
22*9880d681SAndroid Build Coastguard Workerdefine void @load_v2f16_arg(<2 x half> addrspace(1)* %out, <2 x half> %arg) #0 {
23*9880d681SAndroid Build Coastguard Worker  store <2 x half> %arg, <2 x half> addrspace(1)* %out
24*9880d681SAndroid Build Coastguard Worker  ret void
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}load_v3f16_arg:
28*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
29*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
30*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
31*9880d681SAndroid Build Coastguard Worker; GCN-NOT: buffer_load
32*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword
33*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_short
34*9880d681SAndroid Build Coastguard Worker; GCN-NOT: buffer_store
35*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
36*9880d681SAndroid Build Coastguard Workerdefine void @load_v3f16_arg(<3 x half> addrspace(1)* %out, <3 x half> %arg) #0 {
37*9880d681SAndroid Build Coastguard Worker  store <3 x half> %arg, <3 x half> addrspace(1)* %out
38*9880d681SAndroid Build Coastguard Worker  ret void
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}load_v4f16_arg:
42*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
43*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
44*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
45*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
46*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2
47*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
48*9880d681SAndroid Build Coastguard Workerdefine void @load_v4f16_arg(<4 x half> addrspace(1)* %out, <4 x half> %arg) #0 {
49*9880d681SAndroid Build Coastguard Worker  store <4 x half> %arg, <4 x half> addrspace(1)* %out
50*9880d681SAndroid Build Coastguard Worker  ret void
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}load_v8f16_arg:
54*9880d681SAndroid Build Coastguard Workerdefine void @load_v8f16_arg(<8 x half> addrspace(1)* %out, <8 x half> %arg) #0 {
55*9880d681SAndroid Build Coastguard Worker  store <8 x half> %arg, <8 x half> addrspace(1)* %out
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_v2f16_arg:
60*9880d681SAndroid Build Coastguard Workerdefine void @extload_v2f16_arg(<2 x float> addrspace(1)* %out, <2 x half> %in) #0 {
61*9880d681SAndroid Build Coastguard Worker  %fpext = fpext <2 x half> %in to <2 x float>
62*9880d681SAndroid Build Coastguard Worker  store <2 x float> %fpext, <2 x float> addrspace(1)* %out
63*9880d681SAndroid Build Coastguard Worker  ret void
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_f16_to_f32_arg:
67*9880d681SAndroid Build Coastguard Workerdefine void @extload_f16_to_f32_arg(float addrspace(1)* %out, half %arg) #0 {
68*9880d681SAndroid Build Coastguard Worker  %ext = fpext half %arg to float
69*9880d681SAndroid Build Coastguard Worker  store float %ext, float addrspace(1)* %out
70*9880d681SAndroid Build Coastguard Worker  ret void
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_v2f16_to_v2f32_arg:
74*9880d681SAndroid Build Coastguard Workerdefine void @extload_v2f16_to_v2f32_arg(<2 x float> addrspace(1)* %out, <2 x half> %arg) #0 {
75*9880d681SAndroid Build Coastguard Worker  %ext = fpext <2 x half> %arg to <2 x float>
76*9880d681SAndroid Build Coastguard Worker  store <2 x float> %ext, <2 x float> addrspace(1)* %out
77*9880d681SAndroid Build Coastguard Worker  ret void
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_v3f16_to_v3f32_arg:
81*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
82*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
83*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
84*9880d681SAndroid Build Coastguard Worker; GCN-NOT: buffer_load
85*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
86*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
87*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
88*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cvt_f32_f16
89*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword
90*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dwordx2
91*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
92*9880d681SAndroid Build Coastguard Workerdefine void @extload_v3f16_to_v3f32_arg(<3 x float> addrspace(1)* %out, <3 x half> %arg) #0 {
93*9880d681SAndroid Build Coastguard Worker  %ext = fpext <3 x half> %arg to <3 x float>
94*9880d681SAndroid Build Coastguard Worker  store <3 x float> %ext, <3 x float> addrspace(1)* %out
95*9880d681SAndroid Build Coastguard Worker  ret void
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_v4f16_to_v4f32_arg:
99*9880d681SAndroid Build Coastguard Workerdefine void @extload_v4f16_to_v4f32_arg(<4 x float> addrspace(1)* %out, <4 x half> %arg) #0 {
100*9880d681SAndroid Build Coastguard Worker  %ext = fpext <4 x half> %arg to <4 x float>
101*9880d681SAndroid Build Coastguard Worker  store <4 x float> %ext, <4 x float> addrspace(1)* %out
102*9880d681SAndroid Build Coastguard Worker  ret void
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_v8f16_to_v8f32_arg:
106*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
107*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
108*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
109*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
110*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
111*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
112*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
113*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
116*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
117*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
118*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
119*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
120*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
121*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
122*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx4
125*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx4
126*9880d681SAndroid Build Coastguard Workerdefine void @extload_v8f16_to_v8f32_arg(<8 x float> addrspace(1)* %out, <8 x half> %arg) #0 {
127*9880d681SAndroid Build Coastguard Worker  %ext = fpext <8 x half> %arg to <8 x float>
128*9880d681SAndroid Build Coastguard Worker  store <8 x float> %ext, <8 x float> addrspace(1)* %out
129*9880d681SAndroid Build Coastguard Worker  ret void
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_f16_to_f64_arg:
133*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[ARG:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb{{$}}
134*9880d681SAndroid Build Coastguard Worker; VI: s_load_dword [[ARG:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x2c{{$}}
135*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f64_f32_e32 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[ARG]]
136*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 [[RESULT]]
137*9880d681SAndroid Build Coastguard Workerdefine void @extload_f16_to_f64_arg(double addrspace(1)* %out, half %arg) #0 {
138*9880d681SAndroid Build Coastguard Worker  %ext = fpext half %arg to double
139*9880d681SAndroid Build Coastguard Worker  store double %ext, double addrspace(1)* %out
140*9880d681SAndroid Build Coastguard Worker  ret void
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_v2f16_to_v2f64_arg:
144*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
145*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
146*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
147*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
148*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
149*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
150*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
151*9880d681SAndroid Build Coastguard Workerdefine void @extload_v2f16_to_v2f64_arg(<2 x double> addrspace(1)* %out, <2 x half> %arg) #0 {
152*9880d681SAndroid Build Coastguard Worker  %ext = fpext <2 x half> %arg to <2 x double>
153*9880d681SAndroid Build Coastguard Worker  store <2 x double> %ext, <2 x double> addrspace(1)* %out
154*9880d681SAndroid Build Coastguard Worker  ret void
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_v3f16_to_v3f64_arg:
158*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
159*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
160*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
161*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
162*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
163*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
164*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
165*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
166*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
167*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
168*9880d681SAndroid Build Coastguard Workerdefine void @extload_v3f16_to_v3f64_arg(<3 x double> addrspace(1)* %out, <3 x half> %arg) #0 {
169*9880d681SAndroid Build Coastguard Worker  %ext = fpext <3 x half> %arg to <3 x double>
170*9880d681SAndroid Build Coastguard Worker  store <3 x double> %ext, <3 x double> addrspace(1)* %out
171*9880d681SAndroid Build Coastguard Worker  ret void
172*9880d681SAndroid Build Coastguard Worker}
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_v4f16_to_v4f64_arg:
175*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
176*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
177*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
178*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
179*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
180*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
181*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
182*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
183*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
184*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
185*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
186*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
187*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
188*9880d681SAndroid Build Coastguard Workerdefine void @extload_v4f16_to_v4f64_arg(<4 x double> addrspace(1)* %out, <4 x half> %arg) #0 {
189*9880d681SAndroid Build Coastguard Worker  %ext = fpext <4 x half> %arg to <4 x double>
190*9880d681SAndroid Build Coastguard Worker  store <4 x double> %ext, <4 x double> addrspace(1)* %out
191*9880d681SAndroid Build Coastguard Worker  ret void
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extload_v8f16_to_v8f64_arg:
195*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
196*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
197*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
198*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
201*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
202*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
203*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_ushort v
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
206*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
207*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
208*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
211*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
212*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
213*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
216*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
217*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
218*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
221*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
222*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
223*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
226*9880d681SAndroid Build Coastguard Workerdefine void @extload_v8f16_to_v8f64_arg(<8 x double> addrspace(1)* %out, <8 x half> %arg) #0 {
227*9880d681SAndroid Build Coastguard Worker  %ext = fpext <8 x half> %arg to <8 x double>
228*9880d681SAndroid Build Coastguard Worker  store <8 x double> %ext, <8 x double> addrspace(1)* %out
229*9880d681SAndroid Build Coastguard Worker  ret void
230*9880d681SAndroid Build Coastguard Worker}
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_load_store_f16:
233*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort [[TMP:v[0-9]+]]
234*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_short [[TMP]]
235*9880d681SAndroid Build Coastguard Workerdefine void @global_load_store_f16(half addrspace(1)* %out, half addrspace(1)* %in) #0 {
236*9880d681SAndroid Build Coastguard Worker  %val = load half, half addrspace(1)* %in
237*9880d681SAndroid Build Coastguard Worker  store half %val, half addrspace(1)* %out
238*9880d681SAndroid Build Coastguard Worker  ret void
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_load_store_v2f16:
242*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[TMP:v[0-9]+]]
243*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[TMP]]
244*9880d681SAndroid Build Coastguard Workerdefine void @global_load_store_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
245*9880d681SAndroid Build Coastguard Worker  %val = load <2 x half>, <2 x half> addrspace(1)* %in
246*9880d681SAndroid Build Coastguard Worker  store <2 x half> %val, <2 x half> addrspace(1)* %out
247*9880d681SAndroid Build Coastguard Worker  ret void
248*9880d681SAndroid Build Coastguard Worker}
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_load_store_v4f16:
251*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 [[TMP:v\[[0-9]+:[0-9]+\]]]
252*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 [[TMP]]
253*9880d681SAndroid Build Coastguard Workerdefine void @global_load_store_v4f16(<4 x half> addrspace(1)* %in, <4 x half> addrspace(1)* %out) #0 {
254*9880d681SAndroid Build Coastguard Worker  %val = load <4 x half>, <4 x half> addrspace(1)* %in
255*9880d681SAndroid Build Coastguard Worker  store <4 x half> %val, <4 x half> addrspace(1)* %out
256*9880d681SAndroid Build Coastguard Worker  ret void
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_load_store_v8f16:
260*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4 [[TMP:v\[[0-9]+:[0-9]+\]]]
261*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx4 [[TMP:v\[[0-9]+:[0-9]+\]]]
262*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
263*9880d681SAndroid Build Coastguard Workerdefine void @global_load_store_v8f16(<8 x half> addrspace(1)* %out, <8 x half> addrspace(1)* %in) #0 {
264*9880d681SAndroid Build Coastguard Worker  %val = load <8 x half>, <8 x half> addrspace(1)* %in
265*9880d681SAndroid Build Coastguard Worker  store <8 x half> %val, <8 x half> addrspace(1)* %out
266*9880d681SAndroid Build Coastguard Worker  ret void
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_f16_to_f32:
270*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort [[LOAD:v[0-9]+]]
271*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32 [[CVT:v[0-9]+]], [[LOAD]]
272*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[CVT]]
273*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_f16_to_f32(float addrspace(1)* %out, half addrspace(1)* %in) #0 {
274*9880d681SAndroid Build Coastguard Worker  %val = load half, half addrspace(1)* %in
275*9880d681SAndroid Build Coastguard Worker  %cvt = fpext half %val to float
276*9880d681SAndroid Build Coastguard Worker  store float %cvt, float addrspace(1)* %out
277*9880d681SAndroid Build Coastguard Worker  ret void
278*9880d681SAndroid Build Coastguard Worker}
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v2f16_to_v2f32:
281*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[LOAD:v[0-9]+]], off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}}
282*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32 v[[CVT0:[0-9]+]], [[LOAD]]
283*9880d681SAndroid Build Coastguard Worker; GCN: v_lshrrev_b32_e32 [[HI:v[0-9]+]], 16, [[LOAD]]
284*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32 v[[CVT1:[0-9]+]], [[HI]]
285*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 v{{\[}}[[CVT0]]:[[CVT1]]{{\]}}
286*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
287*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v2f16_to_v2f32(<2 x float> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
288*9880d681SAndroid Build Coastguard Worker  %val = load <2 x half>, <2 x half> addrspace(1)* %in
289*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <2 x half> %val to <2 x float>
290*9880d681SAndroid Build Coastguard Worker  store <2 x float> %cvt, <2 x float> addrspace(1)* %out
291*9880d681SAndroid Build Coastguard Worker  ret void
292*9880d681SAndroid Build Coastguard Worker}
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v3f16_to_v3f32:
295*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v3f16_to_v3f32(<3 x float> addrspace(1)* %out, <3 x half> addrspace(1)* %in) #0 {
296*9880d681SAndroid Build Coastguard Worker  %val = load <3 x half>, <3 x half> addrspace(1)* %in
297*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <3 x half> %val to <3 x float>
298*9880d681SAndroid Build Coastguard Worker  store <3 x float> %cvt, <3 x float> addrspace(1)* %out
299*9880d681SAndroid Build Coastguard Worker  ret void
300*9880d681SAndroid Build Coastguard Worker}
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v4f16_to_v4f32:
303*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v4f16_to_v4f32(<4 x float> addrspace(1)* %out, <4 x half> addrspace(1)* %in) #0 {
304*9880d681SAndroid Build Coastguard Worker  %val = load <4 x half>, <4 x half> addrspace(1)* %in
305*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <4 x half> %val to <4 x float>
306*9880d681SAndroid Build Coastguard Worker  store <4 x float> %cvt, <4 x float> addrspace(1)* %out
307*9880d681SAndroid Build Coastguard Worker  ret void
308*9880d681SAndroid Build Coastguard Worker}
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v8f16_to_v8f32:
311*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v8f16_to_v8f32(<8 x float> addrspace(1)* %out, <8 x half> addrspace(1)* %in) #0 {
312*9880d681SAndroid Build Coastguard Worker  %val = load <8 x half>, <8 x half> addrspace(1)* %in
313*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <8 x half> %val to <8 x float>
314*9880d681SAndroid Build Coastguard Worker  store <8 x float> %cvt, <8 x float> addrspace(1)* %out
315*9880d681SAndroid Build Coastguard Worker  ret void
316*9880d681SAndroid Build Coastguard Worker}
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v16f16_to_v16f32:
319*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
320*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
323*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
324*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
325*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
326*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
327*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
328*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
329*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
330*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
331*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
332*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
333*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
334*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
335*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
336*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
337*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx4
340*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx4
341*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx4
342*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx4
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
345*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v16f16_to_v16f32(<16 x float> addrspace(1)* %out, <16 x half> addrspace(1)* %in) #0 {
346*9880d681SAndroid Build Coastguard Worker  %val = load <16 x half>, <16 x half> addrspace(1)* %in
347*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <16 x half> %val to <16 x float>
348*9880d681SAndroid Build Coastguard Worker  store <16 x float> %cvt, <16 x float> addrspace(1)* %out
349*9880d681SAndroid Build Coastguard Worker  ret void
350*9880d681SAndroid Build Coastguard Worker}
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_f16_to_f64:
353*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort [[LOAD:v[0-9]+]]
354*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f32_f16_e32 [[CVT0:v[0-9]+]], [[LOAD]]
355*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f64_f32_e32 [[CVT1:v\[[0-9]+:[0-9]+\]]], [[CVT0]]
356*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2 [[CVT1]]
357*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_f16_to_f64(double addrspace(1)* %out, half addrspace(1)* %in) #0 {
358*9880d681SAndroid Build Coastguard Worker  %val = load half, half addrspace(1)* %in
359*9880d681SAndroid Build Coastguard Worker  %cvt = fpext half %val to double
360*9880d681SAndroid Build Coastguard Worker  store double %cvt, double addrspace(1)* %out
361*9880d681SAndroid Build Coastguard Worker  ret void
362*9880d681SAndroid Build Coastguard Worker}
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v2f16_to_v2f64:
365*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_dword [[LOAD:v[0-9]+]], off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}}
366*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshrrev_b32_e32 [[HI:v[0-9]+]], 16, [[LOAD]]
367*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32 v[[CVT0:[0-9]+]], [[LOAD]]
368*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32 v[[CVT1:[0-9]+]], [[HI]]
369*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32 v{{\[}}[[CVT2_LO:[0-9]+]]:[[CVT2_HI:[0-9]+]]{{\]}}, v[[CVT0]]
370*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f64_f32_e32 v{{\[}}[[CVT3_LO:[0-9]+]]:[[CVT3_HI:[0-9]+]]{{\]}}, v[[CVT1]]
371*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dwordx4 v{{\[}}[[CVT2_LO]]:[[CVT3_HI]]{{\]}}
372*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
373*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v2f16_to_v2f64(<2 x double> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 {
374*9880d681SAndroid Build Coastguard Worker  %val = load <2 x half>, <2 x half> addrspace(1)* %in
375*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <2 x half> %val to <2 x double>
376*9880d681SAndroid Build Coastguard Worker  store <2 x double> %cvt, <2 x double> addrspace(1)* %out
377*9880d681SAndroid Build Coastguard Worker  ret void
378*9880d681SAndroid Build Coastguard Worker}
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v3f16_to_v3f64:
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 [[LOAD:v\[[0-9]+:[0-9]+\]]]
383*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
384*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshrrev_b32_e32 {{v[0-9]+}}, 16, {{v[0-9]+}}
385*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
386*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f32_f16_e32
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f64_f32_e32
389*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f64_f32_e32
390*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f64_f32_e32
391*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cvt_f64_f32_e32
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dwordx4 v{{\[[0-9]+:[0-9]+\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}}
394*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:16
395*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
396*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v3f16_to_v3f64(<3 x double> addrspace(1)* %out, <3 x half> addrspace(1)* %in) #0 {
397*9880d681SAndroid Build Coastguard Worker  %val = load <3 x half>, <3 x half> addrspace(1)* %in
398*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <3 x half> %val to <3 x double>
399*9880d681SAndroid Build Coastguard Worker  store <3 x double> %cvt, <3 x double> addrspace(1)* %out
400*9880d681SAndroid Build Coastguard Worker  ret void
401*9880d681SAndroid Build Coastguard Worker}
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v4f16_to_v4f64:
404*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v4f16_to_v4f64(<4 x double> addrspace(1)* %out, <4 x half> addrspace(1)* %in) #0 {
405*9880d681SAndroid Build Coastguard Worker  %val = load <4 x half>, <4 x half> addrspace(1)* %in
406*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <4 x half> %val to <4 x double>
407*9880d681SAndroid Build Coastguard Worker  store <4 x double> %cvt, <4 x double> addrspace(1)* %out
408*9880d681SAndroid Build Coastguard Worker  ret void
409*9880d681SAndroid Build Coastguard Worker}
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v8f16_to_v8f64:
412*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v8f16_to_v8f64(<8 x double> addrspace(1)* %out, <8 x half> addrspace(1)* %in) #0 {
413*9880d681SAndroid Build Coastguard Worker  %val = load <8 x half>, <8 x half> addrspace(1)* %in
414*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <8 x half> %val to <8 x double>
415*9880d681SAndroid Build Coastguard Worker  store <8 x double> %cvt, <8 x double> addrspace(1)* %out
416*9880d681SAndroid Build Coastguard Worker  ret void
417*9880d681SAndroid Build Coastguard Worker}
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_extload_v16f16_to_v16f64:
420*9880d681SAndroid Build Coastguard Workerdefine void @global_extload_v16f16_to_v16f64(<16 x double> addrspace(1)* %out, <16 x half> addrspace(1)* %in) #0 {
421*9880d681SAndroid Build Coastguard Worker  %val = load <16 x half>, <16 x half> addrspace(1)* %in
422*9880d681SAndroid Build Coastguard Worker  %cvt = fpext <16 x half> %val to <16 x double>
423*9880d681SAndroid Build Coastguard Worker  store <16 x double> %cvt, <16 x double> addrspace(1)* %out
424*9880d681SAndroid Build Coastguard Worker  ret void
425*9880d681SAndroid Build Coastguard Worker}
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_truncstore_f32_to_f16:
428*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[LOAD:v[0-9]+]]
429*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32 [[CVT:v[0-9]+]], [[LOAD]]
430*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_short [[CVT]]
431*9880d681SAndroid Build Coastguard Workerdefine void @global_truncstore_f32_to_f16(half addrspace(1)* %out, float addrspace(1)* %in) #0 {
432*9880d681SAndroid Build Coastguard Worker  %val = load float, float addrspace(1)* %in
433*9880d681SAndroid Build Coastguard Worker  %cvt = fptrunc float %val to half
434*9880d681SAndroid Build Coastguard Worker  store half %cvt, half addrspace(1)* %out
435*9880d681SAndroid Build Coastguard Worker  ret void
436*9880d681SAndroid Build Coastguard Worker}
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_truncstore_v2f32_to_v2f16:
439*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 v{{\[}}[[LO:[0-9]+]]:[[HI:[0-9]+]]{{\]}}
440*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32 [[CVT0:v[0-9]+]], v[[LO]]
441*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32 [[CVT1:v[0-9]+]], v[[HI]]
442*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshlrev_b32_e32 [[SHL:v[0-9]+]], 16, [[CVT1]]
443*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_or_b32_e32 [[PACKED:v[0-9]+]], [[CVT0]], [[SHL]]
444*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dword [[PACKED]]
445*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
446*9880d681SAndroid Build Coastguard Workerdefine void @global_truncstore_v2f32_to_v2f16(<2 x half> addrspace(1)* %out, <2 x float> addrspace(1)* %in) #0 {
447*9880d681SAndroid Build Coastguard Worker  %val = load <2 x float>, <2 x float> addrspace(1)* %in
448*9880d681SAndroid Build Coastguard Worker  %cvt = fptrunc <2 x float> %val to <2 x half>
449*9880d681SAndroid Build Coastguard Worker  store <2 x half> %cvt, <2 x half> addrspace(1)* %out
450*9880d681SAndroid Build Coastguard Worker  ret void
451*9880d681SAndroid Build Coastguard Worker}
452*9880d681SAndroid Build Coastguard Worker
453*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_truncstore_v3f32_to_v3f16:
454*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
455*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
456*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
457*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
458*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cvt_f16_f32_e32
459*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_short
460*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword
461*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
462*9880d681SAndroid Build Coastguard Workerdefine void @global_truncstore_v3f32_to_v3f16(<3 x half> addrspace(1)* %out, <3 x float> addrspace(1)* %in) #0 {
463*9880d681SAndroid Build Coastguard Worker  %val = load <3 x float>, <3 x float> addrspace(1)* %in
464*9880d681SAndroid Build Coastguard Worker  %cvt = fptrunc <3 x float> %val to <3 x half>
465*9880d681SAndroid Build Coastguard Worker  store <3 x half> %cvt, <3 x half> addrspace(1)* %out
466*9880d681SAndroid Build Coastguard Worker  ret void
467*9880d681SAndroid Build Coastguard Worker}
468*9880d681SAndroid Build Coastguard Worker
469*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_truncstore_v4f32_to_v4f16:
470*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
471*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
472*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
473*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
474*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
475*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2
476*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
477*9880d681SAndroid Build Coastguard Workerdefine void @global_truncstore_v4f32_to_v4f16(<4 x half> addrspace(1)* %out, <4 x float> addrspace(1)* %in) #0 {
478*9880d681SAndroid Build Coastguard Worker  %val = load <4 x float>, <4 x float> addrspace(1)* %in
479*9880d681SAndroid Build Coastguard Worker  %cvt = fptrunc <4 x float> %val to <4 x half>
480*9880d681SAndroid Build Coastguard Worker  store <4 x half> %cvt, <4 x half> addrspace(1)* %out
481*9880d681SAndroid Build Coastguard Worker  ret void
482*9880d681SAndroid Build Coastguard Worker}
483*9880d681SAndroid Build Coastguard Worker
484*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_truncstore_v8f32_to_v8f16:
485*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
486*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
487*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
488*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
489*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
490*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
491*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
492*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
493*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
494*9880d681SAndroid Build Coastguard Worker; GCN: v_cvt_f16_f32_e32
495*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx4
496*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
497*9880d681SAndroid Build Coastguard Workerdefine void @global_truncstore_v8f32_to_v8f16(<8 x half> addrspace(1)* %out, <8 x float> addrspace(1)* %in) #0 {
498*9880d681SAndroid Build Coastguard Worker  %val = load <8 x float>, <8 x float> addrspace(1)* %in
499*9880d681SAndroid Build Coastguard Worker  %cvt = fptrunc <8 x float> %val to <8 x half>
500*9880d681SAndroid Build Coastguard Worker  store <8 x half> %cvt, <8 x half> addrspace(1)* %out
501*9880d681SAndroid Build Coastguard Worker  ret void
502*9880d681SAndroid Build Coastguard Worker}
503*9880d681SAndroid Build Coastguard Worker
504*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_truncstore_v16f32_to_v16f16:
505*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
506*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
507*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
508*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
509*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
510*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
511*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
512*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
513*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
514*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
515*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
516*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
517*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
518*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
519*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
520*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
521*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
522*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
523*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
524*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cvt_f16_f32_e32
525*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dwordx4
526*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_store_dwordx4
527*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
528*9880d681SAndroid Build Coastguard Workerdefine void @global_truncstore_v16f32_to_v16f16(<16 x half> addrspace(1)* %out, <16 x float> addrspace(1)* %in) #0 {
529*9880d681SAndroid Build Coastguard Worker  %val = load <16 x float>, <16 x float> addrspace(1)* %in
530*9880d681SAndroid Build Coastguard Worker  %cvt = fptrunc <16 x float> %val to <16 x half>
531*9880d681SAndroid Build Coastguard Worker  store <16 x half> %cvt, <16 x half> addrspace(1)* %out
532*9880d681SAndroid Build Coastguard Worker  ret void
533*9880d681SAndroid Build Coastguard Worker}
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker; FIXME: Unsafe math should fold conversions away
536*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}fadd_f16:
537*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cvt_f32_f16_e32 v{{[0-9]+}},
538*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cvt_f32_f16_e32 v{{[0-9]+}},
539*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cvt_f32_f16_e32 v{{[0-9]+}},
540*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cvt_f32_f16_e32 v{{[0-9]+}},
541*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
542*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
543*9880d681SAndroid Build Coastguard Workerdefine void @fadd_f16(half addrspace(1)* %out, half %a, half %b) #0 {
544*9880d681SAndroid Build Coastguard Worker   %add = fadd half %a, %b
545*9880d681SAndroid Build Coastguard Worker   store half %add, half addrspace(1)* %out, align 4
546*9880d681SAndroid Build Coastguard Worker   ret void
547*9880d681SAndroid Build Coastguard Worker}
548*9880d681SAndroid Build Coastguard Worker
549*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}fadd_v2f16:
550*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
551*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
552*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
553*9880d681SAndroid Build Coastguard Workerdefine void @fadd_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %a, <2 x half> %b) #0 {
554*9880d681SAndroid Build Coastguard Worker  %add = fadd <2 x half> %a, %b
555*9880d681SAndroid Build Coastguard Worker  store <2 x half> %add, <2 x half> addrspace(1)* %out, align 8
556*9880d681SAndroid Build Coastguard Worker  ret void
557*9880d681SAndroid Build Coastguard Worker}
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}fadd_v4f16:
560*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
561*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
562*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
563*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
564*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
565*9880d681SAndroid Build Coastguard Workerdefine void @fadd_v4f16(<4 x half> addrspace(1)* %out, <4 x half> addrspace(1)* %in) #0 {
566*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr <4 x half>, <4 x half> addrspace(1)* %in, i32 1
567*9880d681SAndroid Build Coastguard Worker  %a = load <4 x half>, <4 x half> addrspace(1)* %in, align 16
568*9880d681SAndroid Build Coastguard Worker  %b = load <4 x half>, <4 x half> addrspace(1)* %b_ptr, align 16
569*9880d681SAndroid Build Coastguard Worker  %result = fadd <4 x half> %a, %b
570*9880d681SAndroid Build Coastguard Worker  store <4 x half> %result, <4 x half> addrspace(1)* %out, align 16
571*9880d681SAndroid Build Coastguard Worker  ret void
572*9880d681SAndroid Build Coastguard Worker}
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}fadd_v8f16:
575*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
576*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
577*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
578*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
579*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
580*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
581*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
582*9880d681SAndroid Build Coastguard Worker; SI: v_add_f32
583*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
584*9880d681SAndroid Build Coastguard Workerdefine void @fadd_v8f16(<8 x half> addrspace(1)* %out, <8 x half> %a, <8 x half> %b) #0 {
585*9880d681SAndroid Build Coastguard Worker  %add = fadd <8 x half> %a, %b
586*9880d681SAndroid Build Coastguard Worker  store <8 x half> %add, <8 x half> addrspace(1)* %out, align 32
587*9880d681SAndroid Build Coastguard Worker  ret void
588*9880d681SAndroid Build Coastguard Worker}
589*9880d681SAndroid Build Coastguard Worker
590*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}fsub_f16:
591*9880d681SAndroid Build Coastguard Worker; GCN: v_subrev_f32_e32
592*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
593*9880d681SAndroid Build Coastguard Workerdefine void @fsub_f16(half addrspace(1)* %out, half addrspace(1)* %in) #0 {
594*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr half, half addrspace(1)* %in, i32 1
595*9880d681SAndroid Build Coastguard Worker  %a = load half, half addrspace(1)* %in
596*9880d681SAndroid Build Coastguard Worker  %b = load half, half addrspace(1)* %b_ptr
597*9880d681SAndroid Build Coastguard Worker  %sub = fsub half %a, %b
598*9880d681SAndroid Build Coastguard Worker  store half %sub, half addrspace(1)* %out
599*9880d681SAndroid Build Coastguard Worker  ret void
600*9880d681SAndroid Build Coastguard Worker}
601*9880d681SAndroid Build Coastguard Worker
602*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_bitcast_from_half:
603*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort [[TMP:v[0-9]+]]
604*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_short [[TMP]]
605*9880d681SAndroid Build Coastguard Workerdefine void @test_bitcast_from_half(half addrspace(1)* %in, i16 addrspace(1)* %out) #0 {
606*9880d681SAndroid Build Coastguard Worker  %val = load half, half addrspace(1)* %in
607*9880d681SAndroid Build Coastguard Worker  %val_int = bitcast half %val to i16
608*9880d681SAndroid Build Coastguard Worker  store i16 %val_int, i16 addrspace(1)* %out
609*9880d681SAndroid Build Coastguard Worker  ret void
610*9880d681SAndroid Build Coastguard Worker}
611*9880d681SAndroid Build Coastguard Worker
612*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_bitcast_to_half:
613*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_ushort [[TMP:v[0-9]+]]
614*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_short [[TMP]]
615*9880d681SAndroid Build Coastguard Workerdefine void @test_bitcast_to_half(half addrspace(1)* %out, i16 addrspace(1)* %in) #0 {
616*9880d681SAndroid Build Coastguard Worker  %val = load i16, i16 addrspace(1)* %in
617*9880d681SAndroid Build Coastguard Worker  %val_fp = bitcast i16 %val to half
618*9880d681SAndroid Build Coastguard Worker  store half %val_fp, half addrspace(1)* %out
619*9880d681SAndroid Build Coastguard Worker  ret void
620*9880d681SAndroid Build Coastguard Worker}
621*9880d681SAndroid Build Coastguard Worker
622*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
623