1; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=FUNC %s
2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI -check-prefix=FUNC %s
3
4; FIXME: This should be merged with sint_to_fp.ll, but s_sint_to_fp_v2i64 crashes on r600
5
6; FUNC-LABEL: {{^}}s_sint_to_fp_i64_to_f16:
7define void @s_sint_to_fp_i64_to_f16(half addrspace(1)* %out, i64 %in) #0 {
8  %result = sitofp i64 %in to half
9  store half %result, half addrspace(1)* %out
10  ret void
11}
12
13; FUNC-LABEL: {{^}}v_sint_to_fp_i64_to_f16:
14; GCN: {{buffer|flat}}_load_dwordx2
15
16; GCN: v_ashrrev_i32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}}
17; GCN: v_xor_b32
18
19; GCN: v_ffbh_u32
20; GCN: v_ffbh_u32
21; GCN: v_cndmask
22; GCN: v_cndmask
23
24; GCN-DAG: v_cmp_eq_u64
25; GCN-DAG: v_cmp_lt_u64
26
27; GCN: v_xor_b32_e32 v{{[0-9]+}}, 0x80000000, v{{[0-9]+}}
28; GCN: v_cndmask_b32_e{{32|64}} [[SIGN_SEL:v[0-9]+]],
29; GCN: v_cvt_f16_f32_e32 [[SIGN_SEL_F16:v[0-9]+]], [[SIGN_SEL]]
30; GCN: {{buffer|flat}}_store_short {{.*}}[[SIGN_SEL_F16]]
31define void @v_sint_to_fp_i64_to_f16(half addrspace(1)* %out, i64 addrspace(1)* %in) #0 {
32  %tid = call i32 @llvm.amdgcn.workitem.id.x()
33  %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
34  %out.gep = getelementptr half, half addrspace(1)* %out, i32 %tid
35  %val = load i64, i64 addrspace(1)* %in.gep
36  %result = sitofp i64 %val to half
37  store half %result, half addrspace(1)* %out.gep
38  ret void
39}
40
41; FUNC-LABEL: {{^}}s_sint_to_fp_i64_to_f32:
42define void @s_sint_to_fp_i64_to_f32(float addrspace(1)* %out, i64 %in) #0 {
43  %result = sitofp i64 %in to float
44  store float %result, float addrspace(1)* %out
45  ret void
46}
47
48; FUNC-LABEL: {{^}}v_sint_to_fp_i64_to_f32:
49; GCN: {{buffer|flat}}_load_dwordx2
50
51; GCN: v_ashrrev_i32_e32 v{{[0-9]+}}, 31, v{{[0-9]+}}
52; GCN: v_xor_b32
53
54; GCN: v_ffbh_u32
55; GCN: v_ffbh_u32
56; GCN: v_cndmask
57; GCN: v_cndmask
58
59; GCN-DAG: v_cmp_eq_u64
60; GCN-DAG: v_cmp_lt_u64
61
62; GCN: v_xor_b32_e32 v{{[0-9]+}}, 0x80000000, v{{[0-9]+}}
63; GCN: v_cndmask_b32_e{{32|64}} [[SIGN_SEL:v[0-9]+]],
64; GCN: {{buffer|flat}}_store_dword {{.*}}[[SIGN_SEL]]
65define void @v_sint_to_fp_i64_to_f32(float addrspace(1)* %out, i64 addrspace(1)* %in) #0 {
66  %tid = call i32 @llvm.amdgcn.workitem.id.x()
67  %in.gep = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
68  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
69  %val = load i64, i64 addrspace(1)* %in.gep
70  %result = sitofp i64 %val to float
71  store float %result, float addrspace(1)* %out.gep
72  ret void
73}
74
75; FUNC-LABEL: {{^}}s_sint_to_fp_v2i64_to_v2f32:
76; GCN-NOT: v_and_b32_e32 v{{[0-9]+}}, -1,
77define void @s_sint_to_fp_v2i64_to_v2f32(<2 x float> addrspace(1)* %out, <2 x i64> %in) #0{
78  %result = sitofp <2 x i64> %in to <2 x float>
79  store <2 x float> %result, <2 x float> addrspace(1)* %out
80  ret void
81}
82
83; FUNC-LABEL: {{^}}v_sint_to_fp_v4i64_to_v4f32:
84define void @v_sint_to_fp_v4i64_to_v4f32(<4 x float> addrspace(1)* %out, <4 x i64> addrspace(1)* %in) #0 {
85  %tid = call i32 @llvm.amdgcn.workitem.id.x()
86  %in.gep = getelementptr <4 x i64>, <4 x i64> addrspace(1)* %in, i32 %tid
87  %out.gep = getelementptr <4 x float>, <4 x float> addrspace(1)* %out, i32 %tid
88  %value = load <4 x i64>, <4 x i64> addrspace(1)* %in.gep
89  %result = sitofp <4 x i64> %value to <4 x float>
90  store <4 x float> %result, <4 x float> addrspace(1)* %out.gep
91  ret void
92}
93
94; FUNC-LABEL: {{^}}s_sint_to_fp_v2i64_to_v2f16:
95; GCN-NOT: v_and_b32_e32 v{{[0-9]+}}, -1,
96define void @s_sint_to_fp_v2i64_to_v2f16(<2 x half> addrspace(1)* %out, <2 x i64> %in) #0{
97  %result = sitofp <2 x i64> %in to <2 x half>
98  store <2 x half> %result, <2 x half> addrspace(1)* %out
99  ret void
100}
101
102; FUNC-LABEL: {{^}}v_sint_to_fp_v4i64_to_v4f16:
103define void @v_sint_to_fp_v4i64_to_v4f16(<4 x half> addrspace(1)* %out, <4 x i64> addrspace(1)* %in) #0 {
104  %tid = call i32 @llvm.amdgcn.workitem.id.x()
105  %in.gep = getelementptr <4 x i64>, <4 x i64> addrspace(1)* %in, i32 %tid
106  %out.gep = getelementptr <4 x half>, <4 x half> addrspace(1)* %out, i32 %tid
107  %value = load <4 x i64>, <4 x i64> addrspace(1)* %in.gep
108  %result = sitofp <4 x i64> %value to <4 x half>
109  store <4 x half> %result, <4 x half> addrspace(1)* %out.gep
110  ret void
111}
112
113declare i32 @llvm.amdgcn.workitem.id.x() #1
114
115attributes #0 = { nounwind }
116attributes #1 = { nounwind readnone }
117