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
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
13 define 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
19 ; FUNC-LABEL: {{^}}local_copy_i1_to_i1:
21 ; SI: v_and_b32_e32 v{{[0-9]+}}, 1
25 ; EG: LDS_UBYTE_READ_RET
28 define 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
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
42 define 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
48 ; FUNC-LABEL: {{^}}global_sextload_i1_to_i32:
49 ; SI: buffer_load_ubyte
51 ; SI: buffer_store_dword
56 define 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
63 ; FUNC-LABEL: {{^}}global_zextload_i1_to_i32:
64 ; SI: buffer_load_ubyte
65 ; SI: buffer_store_dword
68 define 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
75 ; FUNC-LABEL: {{^}}global_sextload_i1_to_i64:
76 ; SI: buffer_load_ubyte
78 ; SI: buffer_store_dwordx2
80 define 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
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
92 define 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
99 ; FUNC-LABEL: {{^}}i1_arg:
100 ; SI: buffer_load_ubyte
102 ; SI: buffer_store_byte
104 define void @i1_arg(i1 addrspace(1)* %out, i1 %x) nounwind {
105 store i1 %x, i1 addrspace(1)* %out, align 1
109 ; FUNC-LABEL: {{^}}i1_arg_zext_i32:
110 ; SI: buffer_load_ubyte
111 ; SI: buffer_store_dword
113 define 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
119 ; FUNC-LABEL: {{^}}i1_arg_zext_i64:
120 ; SI: buffer_load_ubyte
121 ; SI: buffer_store_dwordx2
123 define 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
129 ; FUNC-LABEL: {{^}}i1_arg_sext_i32:
130 ; SI: buffer_load_ubyte
131 ; SI: buffer_store_dword
133 define 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
139 ; FUNC-LABEL: {{^}}i1_arg_sext_i64:
140 ; SI: buffer_load_ubyte
143 ; SI: buffer_store_dwordx2
145 define 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