1; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4
5; FUNC-LABEL: {{^}}global_copy_i1_to_i1:
6; SI: buffer_load_ubyte
7; SI: v_and_b32_e32 v{{[0-9]+}}, 1
8; SI: buffer_store_byte
9; SI: s_endpgm
10
11; EG: VTX_READ_8
12; EG: AND_INT
13define void @global_copy_i1_to_i1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
14  %load = load i1, i1 addrspace(1)* %in
15  store i1 %load, i1 addrspace(1)* %out, align 1
16  ret void
17}
18
19; FUNC-LABEL: {{^}}local_copy_i1_to_i1:
20; SI: ds_read_u8
21; SI: v_and_b32_e32 v{{[0-9]+}}, 1
22; SI: ds_write_b8
23; SI: s_endpgm
24
25; EG: LDS_UBYTE_READ_RET
26; EG: AND_INT
27; EG: LDS_BYTE_WRITE
28define void @local_copy_i1_to_i1(i1 addrspace(3)* %out, i1 addrspace(3)* %in) nounwind {
29  %load = load i1, i1 addrspace(3)* %in
30  store i1 %load, i1 addrspace(3)* %out, align 1
31  ret void
32}
33
34; FUNC-LABEL: {{^}}constant_copy_i1_to_i1:
35; SI: buffer_load_ubyte
36; SI: v_and_b32_e32 v{{[0-9]+}}, 1
37; SI: buffer_store_byte
38; SI: s_endpgm
39
40; EG: VTX_READ_8
41; EG: AND_INT
42define void @constant_copy_i1_to_i1(i1 addrspace(1)* %out, i1 addrspace(2)* %in) nounwind {
43  %load = load i1, i1 addrspace(2)* %in
44  store i1 %load, i1 addrspace(1)* %out, align 1
45  ret void
46}
47
48; FUNC-LABEL: {{^}}global_sextload_i1_to_i32:
49; SI: buffer_load_ubyte
50; SI: v_bfe_i32
51; SI: buffer_store_dword
52; SI: s_endpgm
53
54; EG: VTX_READ_8
55; EG: BFE_INT
56define void @global_sextload_i1_to_i32(i32 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
57  %load = load i1, i1 addrspace(1)* %in
58  %ext = sext i1 %load to i32
59  store i32 %ext, i32 addrspace(1)* %out, align 4
60  ret void
61}
62
63; FUNC-LABEL: {{^}}global_zextload_i1_to_i32:
64; SI: buffer_load_ubyte
65; SI: buffer_store_dword
66; SI: s_endpgm
67
68define void @global_zextload_i1_to_i32(i32 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
69  %load = load i1, i1 addrspace(1)* %in
70  %ext = zext i1 %load to i32
71  store i32 %ext, i32 addrspace(1)* %out, align 4
72  ret void
73}
74
75; FUNC-LABEL: {{^}}global_sextload_i1_to_i64:
76; SI: buffer_load_ubyte
77; SI: v_bfe_i32
78; SI: buffer_store_dwordx2
79; SI: s_endpgm
80define void @global_sextload_i1_to_i64(i64 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
81  %load = load i1, i1 addrspace(1)* %in
82  %ext = sext i1 %load to i64
83  store i64 %ext, i64 addrspace(1)* %out, align 4
84  ret void
85}
86
87; FUNC-LABEL: {{^}}global_zextload_i1_to_i64:
88; SI: buffer_load_ubyte
89; SI: v_mov_b32_e32 {{v[0-9]+}}, 0
90; SI: buffer_store_dwordx2
91; SI: s_endpgm
92define void @global_zextload_i1_to_i64(i64 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
93  %load = load i1, i1 addrspace(1)* %in
94  %ext = zext i1 %load to i64
95  store i64 %ext, i64 addrspace(1)* %out, align 4
96  ret void
97}
98
99; FUNC-LABEL: {{^}}i1_arg:
100; SI: buffer_load_ubyte
101; SI: v_and_b32_e32
102; SI: buffer_store_byte
103; SI: s_endpgm
104define void @i1_arg(i1 addrspace(1)* %out, i1 %x) nounwind {
105  store i1 %x, i1 addrspace(1)* %out, align 1
106  ret void
107}
108
109; FUNC-LABEL: {{^}}i1_arg_zext_i32:
110; SI: buffer_load_ubyte
111; SI: buffer_store_dword
112; SI: s_endpgm
113define void @i1_arg_zext_i32(i32 addrspace(1)* %out, i1 %x) nounwind {
114  %ext = zext i1 %x to i32
115  store i32 %ext, i32 addrspace(1)* %out, align 4
116  ret void
117}
118
119; FUNC-LABEL: {{^}}i1_arg_zext_i64:
120; SI: buffer_load_ubyte
121; SI: buffer_store_dwordx2
122; SI: s_endpgm
123define void @i1_arg_zext_i64(i64 addrspace(1)* %out, i1 %x) nounwind {
124  %ext = zext i1 %x to i64
125  store i64 %ext, i64 addrspace(1)* %out, align 8
126  ret void
127}
128
129; FUNC-LABEL: {{^}}i1_arg_sext_i32:
130; SI: buffer_load_ubyte
131; SI: buffer_store_dword
132; SI: s_endpgm
133define void @i1_arg_sext_i32(i32 addrspace(1)* %out, i1 %x) nounwind {
134  %ext = sext i1 %x to i32
135  store i32 %ext, i32addrspace(1)* %out, align 4
136  ret void
137}
138
139; FUNC-LABEL: {{^}}i1_arg_sext_i64:
140; SI: buffer_load_ubyte
141; SI: v_bfe_i32
142; SI: v_ashrrev_i32
143; SI: buffer_store_dwordx2
144; SI: s_endpgm
145define void @i1_arg_sext_i64(i64 addrspace(1)* %out, i1 %x) nounwind {
146  %ext = sext i1 %x to i64
147  store i64 %ext, i64 addrspace(1)* %out, align 8
148  ret void
149}
150