xref: /aosp_15_r20/external/llvm/test/CodeGen/PowerPC/cmpb.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu pwr7 < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-m:e-i64:64-n32:64"
3*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone
6*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test16(i16 zeroext %x, i16 zeroext %y) #0 {
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker  %0 = xor i16 %y, %x
9*9880d681SAndroid Build Coastguard Worker  %1 = and i16 %0, 255
10*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i16 %1, 0
11*9880d681SAndroid Build Coastguard Worker  %cmp20 = icmp ult i16 %0, 256
12*9880d681SAndroid Build Coastguard Worker  %conv25 = select i1 %cmp, i32 255, i32 0
13*9880d681SAndroid Build Coastguard Worker  %conv27 = select i1 %cmp20, i32 65280, i32 0
14*9880d681SAndroid Build Coastguard Worker  %or = or i32 %conv25, %conv27
15*9880d681SAndroid Build Coastguard Worker  %conv29 = trunc i32 %or to i16
16*9880d681SAndroid Build Coastguard Worker  ret i16 %conv29
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16
19*9880d681SAndroid Build Coastguard Worker; CHECK: cmpb [[REG1:[0-9]+]], 4, 3
20*9880d681SAndroid Build Coastguard Worker; CHECK: clrldi 3, [[REG1]], 48
21*9880d681SAndroid Build Coastguard Worker; CHECK: blr
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test16p1(i16 zeroext %x, i16 zeroext %y) #0 {
25*9880d681SAndroid Build Coastguard Workerentry:
26*9880d681SAndroid Build Coastguard Worker  %0 = xor i16 %y, %x
27*9880d681SAndroid Build Coastguard Worker  %1 = and i16 %0, 255
28*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i16 %1, 0
29*9880d681SAndroid Build Coastguard Worker  %cmp20 = icmp ult i16 %0, 256
30*9880d681SAndroid Build Coastguard Worker  %conv28 = select i1 %cmp, i32 5, i32 0
31*9880d681SAndroid Build Coastguard Worker  %conv30 = select i1 %cmp20, i32 65280, i32 0
32*9880d681SAndroid Build Coastguard Worker  %or = or i32 %conv28, %conv30
33*9880d681SAndroid Build Coastguard Worker  %conv32 = trunc i32 %or to i16
34*9880d681SAndroid Build Coastguard Worker  ret i16 %conv32
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16p1
37*9880d681SAndroid Build Coastguard Worker; CHECK: cmpb [[REG1:[0-9]+]], 4, 3
38*9880d681SAndroid Build Coastguard Worker; CHECK: andi. 3, [[REG1]], 65285
39*9880d681SAndroid Build Coastguard Worker; CHECK: blr
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone
43*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test16p2(i16 zeroext %x, i16 zeroext %y) #0 {
44*9880d681SAndroid Build Coastguard Workerentry:
45*9880d681SAndroid Build Coastguard Worker  %0 = xor i16 %y, %x
46*9880d681SAndroid Build Coastguard Worker  %1 = and i16 %0, 255
47*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i16 %1, 0
48*9880d681SAndroid Build Coastguard Worker  %cmp20 = icmp ult i16 %0, 256
49*9880d681SAndroid Build Coastguard Worker  %conv28 = select i1 %cmp, i32 255, i32 0
50*9880d681SAndroid Build Coastguard Worker  %conv30 = select i1 %cmp20, i32 1280, i32 0
51*9880d681SAndroid Build Coastguard Worker  %or = or i32 %conv28, %conv30
52*9880d681SAndroid Build Coastguard Worker  %conv32 = trunc i32 %or to i16
53*9880d681SAndroid Build Coastguard Worker  ret i16 %conv32
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16p2
56*9880d681SAndroid Build Coastguard Worker; CHECK: cmpb [[REG1:[0-9]+]], 4, 3
57*9880d681SAndroid Build Coastguard Worker; CHECK: andi. 3, [[REG1]], 1535
58*9880d681SAndroid Build Coastguard Worker; CHECK: blr
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone
62*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test16p3(i16 zeroext %x, i16 zeroext %y) #0 {
63*9880d681SAndroid Build Coastguard Workerentry:
64*9880d681SAndroid Build Coastguard Worker  %0 = xor i16 %y, %x
65*9880d681SAndroid Build Coastguard Worker  %1 = and i16 %0, 255
66*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i16 %1, 0
67*9880d681SAndroid Build Coastguard Worker  %cmp20 = icmp ult i16 %0, 256
68*9880d681SAndroid Build Coastguard Worker  %conv27 = select i1 %cmp, i32 255, i32 0
69*9880d681SAndroid Build Coastguard Worker  %conv29 = select i1 %cmp20, i32 1024, i32 1280
70*9880d681SAndroid Build Coastguard Worker  %or = or i32 %conv27, %conv29
71*9880d681SAndroid Build Coastguard Worker  %conv31 = trunc i32 %or to i16
72*9880d681SAndroid Build Coastguard Worker  ret i16 %conv31
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16p3
75*9880d681SAndroid Build Coastguard Worker; CHECK: cmpb [[REG1:[0-9]+]], 4, 3
76*9880d681SAndroid Build Coastguard Worker; CHECK: clrldi [[REG2:[0-9]+]], [[REG1]], 55
77*9880d681SAndroid Build Coastguard Worker; CHECK: xori 3, [[REG2]], 1280
78*9880d681SAndroid Build Coastguard Worker; CHECK: blr
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test32(i32 zeroext %x, i32 zeroext %y) #0 {
82*9880d681SAndroid Build Coastguard Workerentry:
83*9880d681SAndroid Build Coastguard Worker  %0 = xor i32 %y, %x
84*9880d681SAndroid Build Coastguard Worker  %1 = and i32 %0, 255
85*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %1, 0
86*9880d681SAndroid Build Coastguard Worker  %2 = and i32 %0, 65280
87*9880d681SAndroid Build Coastguard Worker  %cmp28 = icmp eq i32 %2, 0
88*9880d681SAndroid Build Coastguard Worker  %3 = and i32 %0, 16711680
89*9880d681SAndroid Build Coastguard Worker  %cmp34 = icmp eq i32 %3, 0
90*9880d681SAndroid Build Coastguard Worker  %cmp40 = icmp ult i32 %0, 16777216
91*9880d681SAndroid Build Coastguard Worker  %conv44 = select i1 %cmp, i32 255, i32 0
92*9880d681SAndroid Build Coastguard Worker  %conv45 = select i1 %cmp28, i32 65280, i32 0
93*9880d681SAndroid Build Coastguard Worker  %conv47 = select i1 %cmp34, i32 16711680, i32 0
94*9880d681SAndroid Build Coastguard Worker  %conv50 = select i1 %cmp40, i32 -16777216, i32 0
95*9880d681SAndroid Build Coastguard Worker  %or = or i32 %conv45, %conv50
96*9880d681SAndroid Build Coastguard Worker  %or49 = or i32 %or, %conv44
97*9880d681SAndroid Build Coastguard Worker  %or52 = or i32 %or49, %conv47
98*9880d681SAndroid Build Coastguard Worker  ret i32 %or52
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32
101*9880d681SAndroid Build Coastguard Worker; CHECK: cmpb [[REG1:[0-9]+]], 4, 3
102*9880d681SAndroid Build Coastguard Worker; CHECK: clrldi 3, [[REG1]], 32
103*9880d681SAndroid Build Coastguard Worker; CHECK: blr
104*9880d681SAndroid Build Coastguard Worker}
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test32p1(i32 zeroext %x, i32 zeroext %y) #0 {
107*9880d681SAndroid Build Coastguard Workerentry:
108*9880d681SAndroid Build Coastguard Worker  %0 = xor i32 %y, %x
109*9880d681SAndroid Build Coastguard Worker  %1 = and i32 %0, 255
110*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %1, 0
111*9880d681SAndroid Build Coastguard Worker  %2 = and i32 %0, 65280
112*9880d681SAndroid Build Coastguard Worker  %cmp28 = icmp eq i32 %2, 0
113*9880d681SAndroid Build Coastguard Worker  %3 = and i32 %0, 16711680
114*9880d681SAndroid Build Coastguard Worker  %cmp34 = icmp eq i32 %3, 0
115*9880d681SAndroid Build Coastguard Worker  %cmp40 = icmp ult i32 %0, 16777216
116*9880d681SAndroid Build Coastguard Worker  %conv47 = select i1 %cmp, i32 255, i32 0
117*9880d681SAndroid Build Coastguard Worker  %conv48 = select i1 %cmp28, i32 65280, i32 0
118*9880d681SAndroid Build Coastguard Worker  %conv50 = select i1 %cmp34, i32 458752, i32 0
119*9880d681SAndroid Build Coastguard Worker  %conv53 = select i1 %cmp40, i32 -16777216, i32 0
120*9880d681SAndroid Build Coastguard Worker  %or = or i32 %conv48, %conv53
121*9880d681SAndroid Build Coastguard Worker  %or52 = or i32 %or, %conv47
122*9880d681SAndroid Build Coastguard Worker  %or55 = or i32 %or52, %conv50
123*9880d681SAndroid Build Coastguard Worker  ret i32 %or55
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32p1
126*9880d681SAndroid Build Coastguard Worker; CHECK: li [[REG1:[0-9]+]], 0
127*9880d681SAndroid Build Coastguard Worker; CHECK: cmpb [[REG4:[0-9]+]], 4, 3
128*9880d681SAndroid Build Coastguard Worker; CHECK: oris [[REG2:[0-9]+]], [[REG1]], 65287
129*9880d681SAndroid Build Coastguard Worker; CHECK: ori [[REG3:[0-9]+]], [[REG2]], 65535
130*9880d681SAndroid Build Coastguard Worker; CHECK: and 3, [[REG4]], [[REG3]]
131*9880d681SAndroid Build Coastguard Worker; CHECK: blr
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test32p2(i32 zeroext %x, i32 zeroext %y) #0 {
135*9880d681SAndroid Build Coastguard Workerentry:
136*9880d681SAndroid Build Coastguard Worker  %0 = xor i32 %y, %x
137*9880d681SAndroid Build Coastguard Worker  %1 = and i32 %0, 255
138*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %1, 0
139*9880d681SAndroid Build Coastguard Worker  %2 = and i32 %0, 65280
140*9880d681SAndroid Build Coastguard Worker  %cmp22 = icmp eq i32 %2, 0
141*9880d681SAndroid Build Coastguard Worker  %cmp28 = icmp ult i32 %0, 16777216
142*9880d681SAndroid Build Coastguard Worker  %conv32 = select i1 %cmp, i32 255, i32 0
143*9880d681SAndroid Build Coastguard Worker  %conv33 = select i1 %cmp22, i32 65280, i32 0
144*9880d681SAndroid Build Coastguard Worker  %conv35 = select i1 %cmp28, i32 -16777216, i32 0
145*9880d681SAndroid Build Coastguard Worker  %or = or i32 %conv33, %conv35
146*9880d681SAndroid Build Coastguard Worker  %or37 = or i32 %or, %conv32
147*9880d681SAndroid Build Coastguard Worker  ret i32 %or37
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32p2
150*9880d681SAndroid Build Coastguard Worker; CHECK: li [[REG1:[0-9]+]], 0
151*9880d681SAndroid Build Coastguard Worker; CHECK: cmpb [[REG4:[0-9]+]], 4, 3
152*9880d681SAndroid Build Coastguard Worker; CHECK: oris [[REG2:[0-9]+]], [[REG1]], 65280
153*9880d681SAndroid Build Coastguard Worker; CHECK: ori [[REG3:[0-9]+]], [[REG2]], 65535
154*9880d681SAndroid Build Coastguard Worker; CHECK: and 3, [[REG4]], [[REG3]]
155*9880d681SAndroid Build Coastguard Worker; CHECK: blr
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine i64 @test64(i64 %x, i64 %y) #0 {
159*9880d681SAndroid Build Coastguard Workerentry:
160*9880d681SAndroid Build Coastguard Worker  %shr19 = lshr i64 %x, 56
161*9880d681SAndroid Build Coastguard Worker  %conv21 = trunc i64 %shr19 to i32
162*9880d681SAndroid Build Coastguard Worker  %shr43 = lshr i64 %y, 56
163*9880d681SAndroid Build Coastguard Worker  %conv45 = trunc i64 %shr43 to i32
164*9880d681SAndroid Build Coastguard Worker  %0 = xor i64 %y, %x
165*9880d681SAndroid Build Coastguard Worker  %1 = and i64 %0, 255
166*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %1, 0
167*9880d681SAndroid Build Coastguard Worker  %2 = and i64 %0, 65280
168*9880d681SAndroid Build Coastguard Worker  %cmp52 = icmp eq i64 %2, 0
169*9880d681SAndroid Build Coastguard Worker  %3 = and i64 %0, 16711680
170*9880d681SAndroid Build Coastguard Worker  %cmp58 = icmp eq i64 %3, 0
171*9880d681SAndroid Build Coastguard Worker  %4 = and i64 %0, 4278190080
172*9880d681SAndroid Build Coastguard Worker  %cmp64 = icmp eq i64 %4, 0
173*9880d681SAndroid Build Coastguard Worker  %5 = and i64 %0, 1095216660480
174*9880d681SAndroid Build Coastguard Worker  %cmp70 = icmp eq i64 %5, 0
175*9880d681SAndroid Build Coastguard Worker  %6 = and i64 %0, 280375465082880
176*9880d681SAndroid Build Coastguard Worker  %cmp76 = icmp eq i64 %6, 0
177*9880d681SAndroid Build Coastguard Worker  %7 = and i64 %0, 71776119061217280
178*9880d681SAndroid Build Coastguard Worker  %cmp82 = icmp eq i64 %7, 0
179*9880d681SAndroid Build Coastguard Worker  %cmp88 = icmp eq i32 %conv21, %conv45
180*9880d681SAndroid Build Coastguard Worker  %conv92 = select i1 %cmp, i64 255, i64 0
181*9880d681SAndroid Build Coastguard Worker  %conv93 = select i1 %cmp52, i64 65280, i64 0
182*9880d681SAndroid Build Coastguard Worker  %or = or i64 %conv92, %conv93
183*9880d681SAndroid Build Coastguard Worker  %conv95 = select i1 %cmp58, i64 16711680, i64 0
184*9880d681SAndroid Build Coastguard Worker  %or97 = or i64 %or, %conv95
185*9880d681SAndroid Build Coastguard Worker  %conv98 = select i1 %cmp64, i64 4278190080, i64 0
186*9880d681SAndroid Build Coastguard Worker  %or100 = or i64 %or97, %conv98
187*9880d681SAndroid Build Coastguard Worker  %conv101 = select i1 %cmp70, i64 1095216660480, i64 0
188*9880d681SAndroid Build Coastguard Worker  %or103 = or i64 %or100, %conv101
189*9880d681SAndroid Build Coastguard Worker  %conv104 = select i1 %cmp76, i64 280375465082880, i64 0
190*9880d681SAndroid Build Coastguard Worker  %or106 = or i64 %or103, %conv104
191*9880d681SAndroid Build Coastguard Worker  %conv107 = select i1 %cmp82, i64 71776119061217280, i64 0
192*9880d681SAndroid Build Coastguard Worker  %or109 = or i64 %or106, %conv107
193*9880d681SAndroid Build Coastguard Worker  %conv110 = select i1 %cmp88, i64 -72057594037927936, i64 0
194*9880d681SAndroid Build Coastguard Worker  %or112 = or i64 %or109, %conv110
195*9880d681SAndroid Build Coastguard Worker  ret i64 %or112
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test64
198*9880d681SAndroid Build Coastguard Worker; CHECK: cmpb 3, 3, 4
199*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rldicl
200*9880d681SAndroid Build Coastguard Worker; CHECK: blr
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone }
204*9880d681SAndroid Build Coastguard Worker
205