xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/xor.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}xor_v2i32:
7*9880d681SAndroid Build Coastguard Worker; EG: XOR_INT {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
8*9880d681SAndroid Build Coastguard Worker; EG: XOR_INT {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
11*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdefine void @xor_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in0, <2 x i32> addrspace(1)* %in1) {
14*9880d681SAndroid Build Coastguard Worker  %a = load <2 x i32>, <2 x i32> addrspace(1) * %in0
15*9880d681SAndroid Build Coastguard Worker  %b = load <2 x i32>, <2 x i32> addrspace(1) * %in1
16*9880d681SAndroid Build Coastguard Worker  %result = xor <2 x i32> %a, %b
17*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %result, <2 x i32> addrspace(1)* %out
18*9880d681SAndroid Build Coastguard Worker  ret void
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}xor_v4i32:
22*9880d681SAndroid Build Coastguard Worker; EG: XOR_INT {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
23*9880d681SAndroid Build Coastguard Worker; EG: XOR_INT {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
24*9880d681SAndroid Build Coastguard Worker; EG: XOR_INT {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
25*9880d681SAndroid Build Coastguard Worker; EG: XOR_INT {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32 {{v[0-9]+, v[0-9]+, v[0-9]+}}
28*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32 {{v[0-9]+, v[0-9]+, v[0-9]+}}
29*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32 {{v[0-9]+, v[0-9]+, v[0-9]+}}
30*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32 {{v[0-9]+, v[0-9]+, v[0-9]+}}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine void @xor_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in0, <4 x i32> addrspace(1)* %in1) {
33*9880d681SAndroid Build Coastguard Worker  %a = load <4 x i32>, <4 x i32> addrspace(1) * %in0
34*9880d681SAndroid Build Coastguard Worker  %b = load <4 x i32>, <4 x i32> addrspace(1) * %in1
35*9880d681SAndroid Build Coastguard Worker  %result = xor <4 x i32> %a, %b
36*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %result, <4 x i32> addrspace(1)* %out
37*9880d681SAndroid Build Coastguard Worker  ret void
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}xor_i1:
41*9880d681SAndroid Build Coastguard Worker; EG: XOR_INT {{\** *}}{{T[0-9]+\.[XYZW]}}, {{PS|PV\.[XYZW]}}, {{PS|PV\.[XYZW]}}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_le_f32_e32 [[CMP0:vcc]], 0, {{v[0-9]+}}
44*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_le_f32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]], 1.0, {{v[0-9]+}}
45*9880d681SAndroid Build Coastguard Worker; SI: s_xor_b64 [[XOR:vcc]], [[CMP0]], [[CMP1]]
46*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32 [[RESULT:v[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}
47*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]]
48*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
49*9880d681SAndroid Build Coastguard Workerdefine void @xor_i1(float addrspace(1)* %out, float addrspace(1)* %in0, float addrspace(1)* %in1) {
50*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1) * %in0
51*9880d681SAndroid Build Coastguard Worker  %b = load float, float addrspace(1) * %in1
52*9880d681SAndroid Build Coastguard Worker  %acmp = fcmp oge float %a, 0.000000e+00
53*9880d681SAndroid Build Coastguard Worker  %bcmp = fcmp oge float %b, 1.000000e+00
54*9880d681SAndroid Build Coastguard Worker  %xor = xor i1 %acmp, %bcmp
55*9880d681SAndroid Build Coastguard Worker  %result = select i1 %xor, float %a, float %b
56*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %out
57*9880d681SAndroid Build Coastguard Worker  ret void
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_xor_i1:
61*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte [[B:v[0-9]+]]
62*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte [[A:v[0-9]+]]
63*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32 [[XOR:v[0-9]+]], [[A]], [[B]]
64*9880d681SAndroid Build Coastguard Worker; SI: v_and_b32_e32 [[RESULT:v[0-9]+]], 1, [[XOR]]
65*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_byte [[RESULT]]
66*9880d681SAndroid Build Coastguard Workerdefine void @v_xor_i1(i1 addrspace(1)* %out, i1 addrspace(1)* %in0, i1 addrspace(1)* %in1) {
67*9880d681SAndroid Build Coastguard Worker  %a = load volatile i1, i1 addrspace(1)* %in0
68*9880d681SAndroid Build Coastguard Worker  %b = load volatile i1, i1 addrspace(1)* %in1
69*9880d681SAndroid Build Coastguard Worker  %xor = xor i1 %a, %b
70*9880d681SAndroid Build Coastguard Worker  store i1 %xor, i1 addrspace(1)* %out
71*9880d681SAndroid Build Coastguard Worker  ret void
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_xor_i32:
75*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32
76*9880d681SAndroid Build Coastguard Workerdefine void @vector_xor_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in0, i32 addrspace(1)* %in1) {
77*9880d681SAndroid Build Coastguard Worker  %a = load i32, i32 addrspace(1)* %in0
78*9880d681SAndroid Build Coastguard Worker  %b = load i32, i32 addrspace(1)* %in1
79*9880d681SAndroid Build Coastguard Worker  %result = xor i32 %a, %b
80*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out
81*9880d681SAndroid Build Coastguard Worker  ret void
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}scalar_xor_i32:
85*9880d681SAndroid Build Coastguard Worker; SI: s_xor_b32
86*9880d681SAndroid Build Coastguard Workerdefine void @scalar_xor_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) {
87*9880d681SAndroid Build Coastguard Worker  %result = xor i32 %a, %b
88*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out
89*9880d681SAndroid Build Coastguard Worker  ret void
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}scalar_not_i32:
93*9880d681SAndroid Build Coastguard Worker; SI: s_not_b32
94*9880d681SAndroid Build Coastguard Workerdefine void @scalar_not_i32(i32 addrspace(1)* %out, i32 %a) {
95*9880d681SAndroid Build Coastguard Worker  %result = xor i32 %a, -1
96*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out
97*9880d681SAndroid Build Coastguard Worker  ret void
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_not_i32:
101*9880d681SAndroid Build Coastguard Worker; SI: v_not_b32
102*9880d681SAndroid Build Coastguard Workerdefine void @vector_not_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in0, i32 addrspace(1)* %in1) {
103*9880d681SAndroid Build Coastguard Worker  %a = load i32, i32 addrspace(1)* %in0
104*9880d681SAndroid Build Coastguard Worker  %b = load i32, i32 addrspace(1)* %in1
105*9880d681SAndroid Build Coastguard Worker  %result = xor i32 %a, -1
106*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out
107*9880d681SAndroid Build Coastguard Worker  ret void
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_xor_i64:
111*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32
112*9880d681SAndroid Build Coastguard Worker; SI: v_xor_b32_e32
113*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
114*9880d681SAndroid Build Coastguard Workerdefine void @vector_xor_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in0, i64 addrspace(1)* %in1) {
115*9880d681SAndroid Build Coastguard Worker  %a = load i64, i64 addrspace(1)* %in0
116*9880d681SAndroid Build Coastguard Worker  %b = load i64, i64 addrspace(1)* %in1
117*9880d681SAndroid Build Coastguard Worker  %result = xor i64 %a, %b
118*9880d681SAndroid Build Coastguard Worker  store i64 %result, i64 addrspace(1)* %out
119*9880d681SAndroid Build Coastguard Worker  ret void
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}scalar_xor_i64:
123*9880d681SAndroid Build Coastguard Worker; SI: s_xor_b64
124*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
125*9880d681SAndroid Build Coastguard Workerdefine void @scalar_xor_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) {
126*9880d681SAndroid Build Coastguard Worker  %result = xor i64 %a, %b
127*9880d681SAndroid Build Coastguard Worker  store i64 %result, i64 addrspace(1)* %out
128*9880d681SAndroid Build Coastguard Worker  ret void
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}scalar_not_i64:
132*9880d681SAndroid Build Coastguard Worker; SI: s_not_b64
133*9880d681SAndroid Build Coastguard Workerdefine void @scalar_not_i64(i64 addrspace(1)* %out, i64 %a) {
134*9880d681SAndroid Build Coastguard Worker  %result = xor i64 %a, -1
135*9880d681SAndroid Build Coastguard Worker  store i64 %result, i64 addrspace(1)* %out
136*9880d681SAndroid Build Coastguard Worker  ret void
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}vector_not_i64:
140*9880d681SAndroid Build Coastguard Worker; SI: v_not_b32
141*9880d681SAndroid Build Coastguard Worker; SI: v_not_b32
142*9880d681SAndroid Build Coastguard Workerdefine void @vector_not_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in0, i64 addrspace(1)* %in1) {
143*9880d681SAndroid Build Coastguard Worker  %a = load i64, i64 addrspace(1)* %in0
144*9880d681SAndroid Build Coastguard Worker  %b = load i64, i64 addrspace(1)* %in1
145*9880d681SAndroid Build Coastguard Worker  %result = xor i64 %a, -1
146*9880d681SAndroid Build Coastguard Worker  store i64 %result, i64 addrspace(1)* %out
147*9880d681SAndroid Build Coastguard Worker  ret void
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker; Test that we have a pattern to match xor inside a branch.
151*9880d681SAndroid Build Coastguard Worker; Note that in the future the backend may be smart enough to
152*9880d681SAndroid Build Coastguard Worker; use an SALU instruction for this.
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}xor_cf:
155*9880d681SAndroid Build Coastguard Worker; SI: s_xor_b64
156*9880d681SAndroid Build Coastguard Workerdefine void @xor_cf(i64 addrspace(1)* %out, i64 addrspace(1)* %in, i64 %a, i64 %b) {
157*9880d681SAndroid Build Coastguard Workerentry:
158*9880d681SAndroid Build Coastguard Worker  %0 = icmp eq i64 %a, 0
159*9880d681SAndroid Build Coastguard Worker  br i1 %0, label %if, label %else
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerif:
162*9880d681SAndroid Build Coastguard Worker  %1 = xor i64 %a, %b
163*9880d681SAndroid Build Coastguard Worker  br label %endif
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerelse:
166*9880d681SAndroid Build Coastguard Worker  %2 = load i64, i64 addrspace(1)* %in
167*9880d681SAndroid Build Coastguard Worker  br label %endif
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Workerendif:
170*9880d681SAndroid Build Coastguard Worker  %3 = phi i64 [%1, %if], [%2, %else]
171*9880d681SAndroid Build Coastguard Worker  store i64 %3, i64 addrspace(1)* %out
172*9880d681SAndroid Build Coastguard Worker  ret void
173*9880d681SAndroid Build Coastguard Worker}
174