1; RUN: llc -march=amdgcn -verify-machineinstrs -enable-unsafe-fp-math < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
2; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs -enable-unsafe-fp-math < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
3
4; GCN-LABEL: {{^}}sitofp_i16_to_f16
5; GCN: buffer_load_{{sshort|ushort}} v[[A_I16:[0-9]+]]
6; GCN: v_cvt_f32_i32_e32 v[[A_F32:[0-9]+]], v[[A_I16]]
7; GCN: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[A_F32]]
8; GCN: buffer_store_short v[[R_F16]]
9; GCN: s_endpgm
10define void @sitofp_i16_to_f16(
11    half addrspace(1)* %r,
12    i16 addrspace(1)* %a) {
13entry:
14  %a.val = load i16, i16 addrspace(1)* %a
15  %r.val = sitofp i16 %a.val to half
16  store half %r.val, half addrspace(1)* %r
17  ret void
18}
19
20; GCN-LABEL: {{^}}sitofp_i32_to_f16
21; GCN: buffer_load_dword v[[A_I32:[0-9]+]]
22; GCN: v_cvt_f32_i32_e32 v[[A_I16:[0-9]+]], v[[A_I32]]
23; GCN: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[A_I16]]
24; GCN: buffer_store_short v[[R_F16]]
25; GCN: s_endpgm
26define void @sitofp_i32_to_f16(
27    half addrspace(1)* %r,
28    i32 addrspace(1)* %a) {
29entry:
30  %a.val = load i32, i32 addrspace(1)* %a
31  %r.val = sitofp i32 %a.val to half
32  store half %r.val, half addrspace(1)* %r
33  ret void
34}
35
36; f16 = sitofp i64 is in sint_to_fp.i64.ll
37
38; GCN-LABEL: {{^}}sitofp_v2i16_to_v2f16
39; GCN:     buffer_load_dword
40; GCN:     v_cvt_f32_i32_e32
41; GCN:     v_cvt_f32_i32_e32
42; GCN:     v_cvt_f16_f32_e32
43; GCN:     v_cvt_f16_f32_e32
44; GCN-DAG: v_lshlrev_b32_e32
45; GCN-DAG: v_or_b32_e32
46; GCN:     buffer_store_dword
47; GCN:     s_endpgm
48define void @sitofp_v2i16_to_v2f16(
49    <2 x half> addrspace(1)* %r,
50    <2 x i16> addrspace(1)* %a) {
51entry:
52  %a.val = load <2 x i16>, <2 x i16> addrspace(1)* %a
53  %r.val = sitofp <2 x i16> %a.val to <2 x half>
54  store <2 x half> %r.val, <2 x half> addrspace(1)* %r
55  ret void
56}
57
58; GCN-LABEL: {{^}}sitofp_v2i32_to_v2f16
59; GCN:     buffer_load_dwordx2
60; GCN:     v_cvt_f32_i32_e32
61; GCN:     v_cvt_f32_i32_e32
62; GCN:     v_cvt_f16_f32_e32
63; GCN:     v_cvt_f16_f32_e32
64; GCN-DAG: v_and_b32_e32
65; GCN-DAG: v_lshlrev_b32_e32
66; GCN-DAG: v_or_b32_e32
67; GCN:     buffer_store_dword
68; GCN:     s_endpgm
69define void @sitofp_v2i32_to_v2f16(
70    <2 x half> addrspace(1)* %r,
71    <2 x i32> addrspace(1)* %a) {
72entry:
73  %a.val = load <2 x i32>, <2 x i32> addrspace(1)* %a
74  %r.val = sitofp <2 x i32> %a.val to <2 x half>
75  store <2 x half> %r.val, <2 x half> addrspace(1)* %r
76  ret void
77}
78
79; v2f16 = sitofp v2i64 is in sint_to_fp.i64.ll
80