xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/xor.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s -check-prefix=X32
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-linux -mattr=+sse2 | FileCheck %s -check-prefix=X64
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-win32 -mattr=+sse2 | FileCheck %s -check-prefix=X64
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Though it is undefined, we want xor undef,undef to produce zero.
6*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test1() nounwind {
7*9880d681SAndroid Build Coastguard Worker	%tmp = xor <4 x i32> undef, undef
8*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test1:
11*9880d681SAndroid Build Coastguard Worker; X32:	xorps	%xmm0, %xmm0
12*9880d681SAndroid Build Coastguard Worker; X32:	ret
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; Though it is undefined, we want xor undef,undef to produce zero.
16*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() nounwind{
17*9880d681SAndroid Build Coastguard Worker	%tmp = xor i32 undef, undef
18*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp
19*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test2:
20*9880d681SAndroid Build Coastguard Worker; X32:	xorl	%eax, %eax
21*9880d681SAndroid Build Coastguard Worker; X32:	ret
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %a, i32 %b) nounwind  {
25*9880d681SAndroid Build Coastguard Workerentry:
26*9880d681SAndroid Build Coastguard Worker        %tmp1not = xor i32 %b, -2
27*9880d681SAndroid Build Coastguard Worker	%tmp3 = and i32 %tmp1not, %a
28*9880d681SAndroid Build Coastguard Worker        %tmp4 = lshr i32 %tmp3, 1
29*9880d681SAndroid Build Coastguard Worker        ret i32 %tmp4
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test3:
32*9880d681SAndroid Build Coastguard Worker; X64:	notl
33*9880d681SAndroid Build Coastguard Worker; X64:	andl
34*9880d681SAndroid Build Coastguard Worker; X64:	shrl
35*9880d681SAndroid Build Coastguard Worker; X64:	ret
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test3:
38*9880d681SAndroid Build Coastguard Worker; X32: 	movl	8(%esp), %eax
39*9880d681SAndroid Build Coastguard Worker; X32: 	notl	%eax
40*9880d681SAndroid Build Coastguard Worker; X32: 	andl	4(%esp), %eax
41*9880d681SAndroid Build Coastguard Worker; X32: 	shrl	%eax
42*9880d681SAndroid Build Coastguard Worker; X32: 	ret
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %a, i32 %b) nounwind  {
46*9880d681SAndroid Build Coastguard Workerentry:
47*9880d681SAndroid Build Coastguard Worker        br label %bb
48*9880d681SAndroid Build Coastguard Workerbb:
49*9880d681SAndroid Build Coastguard Worker	%b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ]
50*9880d681SAndroid Build Coastguard Worker        %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ]
51*9880d681SAndroid Build Coastguard Worker	%tmp3 = xor i32 %a_addr.0, %b_addr.0
52*9880d681SAndroid Build Coastguard Worker        %tmp4not = xor i32 %tmp3, 2147483647
53*9880d681SAndroid Build Coastguard Worker        %tmp6 = and i32 %tmp4not, %b_addr.0
54*9880d681SAndroid Build Coastguard Worker        %tmp8 = shl i32 %tmp6, 1
55*9880d681SAndroid Build Coastguard Worker        %tmp10 = icmp eq i32 %tmp8, 0
56*9880d681SAndroid Build Coastguard Worker	br i1 %tmp10, label %bb12, label %bb
57*9880d681SAndroid Build Coastguard Workerbb12:
58*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp3
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test4:
61*9880d681SAndroid Build Coastguard Worker; X64:    notl	[[REG:%[a-z]+]]
62*9880d681SAndroid Build Coastguard Worker; X64:    andl	{{.*}}[[REG]]
63*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test4:
64*9880d681SAndroid Build Coastguard Worker; X32:    notl	[[REG:%[a-z]+]]
65*9880d681SAndroid Build Coastguard Worker; X32:    andl	{{.*}}[[REG]]
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine i16 @test5(i16 %a, i16 %b) nounwind  {
69*9880d681SAndroid Build Coastguard Workerentry:
70*9880d681SAndroid Build Coastguard Worker        br label %bb
71*9880d681SAndroid Build Coastguard Workerbb:
72*9880d681SAndroid Build Coastguard Worker	%b_addr.0 = phi i16 [ %b, %entry ], [ %tmp8, %bb ]
73*9880d681SAndroid Build Coastguard Worker        %a_addr.0 = phi i16 [ %a, %entry ], [ %tmp3, %bb ]
74*9880d681SAndroid Build Coastguard Worker	%tmp3 = xor i16 %a_addr.0, %b_addr.0
75*9880d681SAndroid Build Coastguard Worker        %tmp4not = xor i16 %tmp3, 32767
76*9880d681SAndroid Build Coastguard Worker        %tmp6 = and i16 %tmp4not, %b_addr.0
77*9880d681SAndroid Build Coastguard Worker        %tmp8 = shl i16 %tmp6, 1
78*9880d681SAndroid Build Coastguard Worker        %tmp10 = icmp eq i16 %tmp8, 0
79*9880d681SAndroid Build Coastguard Worker	br i1 %tmp10, label %bb12, label %bb
80*9880d681SAndroid Build Coastguard Workerbb12:
81*9880d681SAndroid Build Coastguard Worker	ret i16 %tmp3
82*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test5:
83*9880d681SAndroid Build Coastguard Worker; X64:    notl	[[REG:%[a-z]+]]
84*9880d681SAndroid Build Coastguard Worker; X64:    andl	{{.*}}[[REG]]
85*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test5:
86*9880d681SAndroid Build Coastguard Worker; X32:    notl	[[REG:%[a-z]+]]
87*9880d681SAndroid Build Coastguard Worker; X32:    andl	{{.*}}[[REG]]
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine i8 @test6(i8 %a, i8 %b) nounwind  {
91*9880d681SAndroid Build Coastguard Workerentry:
92*9880d681SAndroid Build Coastguard Worker        br label %bb
93*9880d681SAndroid Build Coastguard Workerbb:
94*9880d681SAndroid Build Coastguard Worker	%b_addr.0 = phi i8 [ %b, %entry ], [ %tmp8, %bb ]
95*9880d681SAndroid Build Coastguard Worker        %a_addr.0 = phi i8 [ %a, %entry ], [ %tmp3, %bb ]
96*9880d681SAndroid Build Coastguard Worker	%tmp3 = xor i8 %a_addr.0, %b_addr.0
97*9880d681SAndroid Build Coastguard Worker        %tmp4not = xor i8 %tmp3, 127
98*9880d681SAndroid Build Coastguard Worker        %tmp6 = and i8 %tmp4not, %b_addr.0
99*9880d681SAndroid Build Coastguard Worker        %tmp8 = shl i8 %tmp6, 1
100*9880d681SAndroid Build Coastguard Worker        %tmp10 = icmp eq i8 %tmp8, 0
101*9880d681SAndroid Build Coastguard Worker	br i1 %tmp10, label %bb12, label %bb
102*9880d681SAndroid Build Coastguard Workerbb12:
103*9880d681SAndroid Build Coastguard Worker	ret i8 %tmp3
104*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test6:
105*9880d681SAndroid Build Coastguard Worker; X64:    notb	[[REG:%[a-z]+]]
106*9880d681SAndroid Build Coastguard Worker; X64:    andb	{{.*}}[[REG]]
107*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test6:
108*9880d681SAndroid Build Coastguard Worker; X32:    notb	[[REG:%[a-z]+]]
109*9880d681SAndroid Build Coastguard Worker; X32:    andb	{{.*}}[[REG]]
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %a, i32 %b) nounwind  {
113*9880d681SAndroid Build Coastguard Workerentry:
114*9880d681SAndroid Build Coastguard Worker        br label %bb
115*9880d681SAndroid Build Coastguard Workerbb:
116*9880d681SAndroid Build Coastguard Worker	%b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ]
117*9880d681SAndroid Build Coastguard Worker        %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ]
118*9880d681SAndroid Build Coastguard Worker	%tmp3 = xor i32 %a_addr.0, %b_addr.0
119*9880d681SAndroid Build Coastguard Worker        %tmp4not = xor i32 %tmp3, 2147483646
120*9880d681SAndroid Build Coastguard Worker        %tmp6 = and i32 %tmp4not, %b_addr.0
121*9880d681SAndroid Build Coastguard Worker        %tmp8 = shl i32 %tmp6, 1
122*9880d681SAndroid Build Coastguard Worker        %tmp10 = icmp eq i32 %tmp8, 0
123*9880d681SAndroid Build Coastguard Worker	br i1 %tmp10, label %bb12, label %bb
124*9880d681SAndroid Build Coastguard Workerbb12:
125*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp3
126*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test7:
127*9880d681SAndroid Build Coastguard Worker; X64:    xorl	$2147483646, [[REG:%[a-z]+]]
128*9880d681SAndroid Build Coastguard Worker; X64:    andl	{{.*}}[[REG]]
129*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test7:
130*9880d681SAndroid Build Coastguard Worker; X32:    xorl	$2147483646, [[REG:%[a-z]+]]
131*9880d681SAndroid Build Coastguard Worker; X32:    andl	{{.*}}[[REG]]
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %a) nounwind {
135*9880d681SAndroid Build Coastguard Worker; rdar://7553032
136*9880d681SAndroid Build Coastguard Workerentry:
137*9880d681SAndroid Build Coastguard Worker  %t1 = sub i32 0, %a
138*9880d681SAndroid Build Coastguard Worker  %t2 = add i32 %t1, -1
139*9880d681SAndroid Build Coastguard Worker  ret i32 %t2
140*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test8:
141*9880d681SAndroid Build Coastguard Worker; X64:   notl {{%eax|%edi|%ecx}}
142*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test8:
143*9880d681SAndroid Build Coastguard Worker; X32:   notl %eax
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %a) nounwind {
147*9880d681SAndroid Build Coastguard Worker  %1 = and i32 %a, 4096
148*9880d681SAndroid Build Coastguard Worker  %2 = xor i32 %1, 4096
149*9880d681SAndroid Build Coastguard Worker  ret i32 %2
150*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test9:
151*9880d681SAndroid Build Coastguard Worker; X64:    notl	[[REG:%[a-z]+]]
152*9880d681SAndroid Build Coastguard Worker; X64:    andl	{{.*}}[[REG:%[a-z]+]]
153*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test9:
154*9880d681SAndroid Build Coastguard Worker; X32:    notl	[[REG:%[a-z]+]]
155*9880d681SAndroid Build Coastguard Worker; X32:    andl	{{.*}}[[REG:%[a-z]+]]
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker; PR15948
159*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test10(<4 x i32> %a) nounwind {
160*9880d681SAndroid Build Coastguard Worker  %1 = and <4 x i32> %a, <i32 4096, i32 4096, i32 4096, i32 4096>
161*9880d681SAndroid Build Coastguard Worker  %2 = xor <4 x i32> %1, <i32 4096, i32 4096, i32 4096, i32 4096>
162*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
163*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test10:
164*9880d681SAndroid Build Coastguard Worker; X64:    andnps
165*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test10:
166*9880d681SAndroid Build Coastguard Worker; X32:    andnps
167*9880d681SAndroid Build Coastguard Worker}
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Workerdefine i32 @PR17487(i1 %tobool) {
170*9880d681SAndroid Build Coastguard Worker  %tmp = insertelement <2 x i1> undef, i1 %tobool, i32 1
171*9880d681SAndroid Build Coastguard Worker  %tmp1 = zext <2 x i1> %tmp to <2 x i64>
172*9880d681SAndroid Build Coastguard Worker  %tmp2 = xor <2 x i64> %tmp1, <i64 1, i64 1>
173*9880d681SAndroid Build Coastguard Worker  %tmp3 = extractelement <2 x i64> %tmp2, i32 1
174*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 0, %tmp3
175*9880d681SAndroid Build Coastguard Worker  %cmp6 = icmp ne i64 %add, 1
176*9880d681SAndroid Build Coastguard Worker  %conv7 = zext i1 %cmp6 to i32
177*9880d681SAndroid Build Coastguard Worker  ret i32 %conv7
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker; X64-LABEL: PR17487:
180*9880d681SAndroid Build Coastguard Worker; X64: andn
181*9880d681SAndroid Build Coastguard Worker; X32-LABEL: PR17487:
182*9880d681SAndroid Build Coastguard Worker; X32: andn
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %b) {
186*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %b
187*9880d681SAndroid Build Coastguard Worker  %neg = xor i32 %shl, -1
188*9880d681SAndroid Build Coastguard Worker  ret i32 %neg
189*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test11:
190*9880d681SAndroid Build Coastguard Worker; X64: movl    $-2, %[[REG:.*]]
191*9880d681SAndroid Build Coastguard Worker; X64: roll    %{{.*}}, %[[REG]]
192*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test11:
193*9880d681SAndroid Build Coastguard Worker; X32: movl    $-2, %[[REG:.*]]
194*9880d681SAndroid Build Coastguard Worker; X32: roll    %{{.*}}, %[[REG]]
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker%struct.ref_s = type { %union.v, i16, i16 }
198*9880d681SAndroid Build Coastguard Worker%union.v = type { i64 }
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerdefine %struct.ref_s* @test12(%struct.ref_s* %op, i64 %osbot, i64 %intval) {
201*9880d681SAndroid Build Coastguard Worker  %neg = shl i64 %intval, 32
202*9880d681SAndroid Build Coastguard Worker  %sext = xor i64 %neg, -4294967296
203*9880d681SAndroid Build Coastguard Worker  %idx.ext = ashr exact i64 %sext, 32
204*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds %struct.ref_s, %struct.ref_s* %op, i64 %idx.ext
205*9880d681SAndroid Build Coastguard Worker  ret %struct.ref_s* %add.ptr
206*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test12:
207*9880d681SAndroid Build Coastguard Worker; X64: shlq	$32, %[[REG:.*]]
208*9880d681SAndroid Build Coastguard Worker; X64-NOT: not
209*9880d681SAndroid Build Coastguard Worker; X64: sarq	$28, %[[REG]]
210*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test12:
211*9880d681SAndroid Build Coastguard Worker; X32: leal
212*9880d681SAndroid Build Coastguard Worker; X32-NOT: not
213*9880d681SAndroid Build Coastguard Worker; X32: shll	$2, %eax
214*9880d681SAndroid Build Coastguard Worker}
215