xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-vecCmpBr.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -aarch64-neon-syntax=apple < %s -mcpu=cyclone | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; ModuleID = 'arm64_vecCmpBr.c'
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32:64-S128"
4*9880d681SAndroid Build Coastguard Workertarget triple = "arm64-apple-ios3.0.0"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine i32 @anyZero64(<4 x i16> %a) #0 {
8*9880d681SAndroid Build Coastguard Worker; CHECK: _anyZero64:
9*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8b b[[REGNO1:[0-9]+]], v0
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]]
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]]
12*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]:
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b _bar
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %a to <8 x i8>
16*9880d681SAndroid Build Coastguard Worker  %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> %0) #3
17*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %vminv.i to i8
18*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %1, 0
19*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.then, label %return
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
22*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4
23*9880d681SAndroid Build Coastguard Worker  br label %return
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %entry, %if.then
26*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
27*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdeclare i32 @bar(...) #1
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine i32 @anyZero128(<8 x i16> %a) #0 {
33*9880d681SAndroid Build Coastguard Worker; CHECK: _anyZero128:
34*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.16b b[[REGNO1:[0-9]+]], v0
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]]
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]]
37*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]:
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b _bar
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerentry:
41*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i16> %a to <16 x i8>
42*9880d681SAndroid Build Coastguard Worker  %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> %0) #3
43*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %vminv.i to i8
44*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %1, 0
45*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.then, label %return
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
48*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4
49*9880d681SAndroid Build Coastguard Worker  br label %return
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %entry, %if.then
52*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
53*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine i32 @anyNonZero64(<4 x i16> %a) #0 {
57*9880d681SAndroid Build Coastguard Worker; CHECK: _anyNonZero64:
58*9880d681SAndroid Build Coastguard Worker; CHECK: umaxv.8b b[[REGNO1:[0-9]+]], v0
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]]
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]]
61*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]:
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov w0, #0
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerentry:
65*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %a to <8 x i8>
66*9880d681SAndroid Build Coastguard Worker  %vmaxv.i = tail call i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8> %0) #3
67*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %vmaxv.i to i8
68*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %1, 0
69*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %return, label %if.then
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
72*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4
73*9880d681SAndroid Build Coastguard Worker  br label %return
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %entry, %if.then
76*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
77*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine i32 @anyNonZero128(<8 x i16> %a) #0 {
81*9880d681SAndroid Build Coastguard Worker; CHECK: _anyNonZero128:
82*9880d681SAndroid Build Coastguard Worker; CHECK: umaxv.16b b[[REGNO1:[0-9]+]], v0
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]]
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]]
85*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]:
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov w0, #0
87*9880d681SAndroid Build Coastguard Workerentry:
88*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i16> %a to <16 x i8>
89*9880d681SAndroid Build Coastguard Worker  %vmaxv.i = tail call i32 @llvm.aarch64.neon.umaxv.i32.v16i8(<16 x i8> %0) #3
90*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %vmaxv.i to i8
91*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %1, 0
92*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %return, label %if.then
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
95*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4
96*9880d681SAndroid Build Coastguard Worker  br label %return
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %entry, %if.then
99*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
100*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine i32 @allZero64(<4 x i16> %a) #0 {
104*9880d681SAndroid Build Coastguard Worker; CHECK: _allZero64:
105*9880d681SAndroid Build Coastguard Worker; CHECK: umaxv.8b b[[REGNO1:[0-9]+]], v0
106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]]
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]]
108*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]:
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b _bar
110*9880d681SAndroid Build Coastguard Workerentry:
111*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %a to <8 x i8>
112*9880d681SAndroid Build Coastguard Worker  %vmaxv.i = tail call i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8> %0) #3
113*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %vmaxv.i to i8
114*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %1, 0
115*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.then, label %return
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
118*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4
119*9880d681SAndroid Build Coastguard Worker  br label %return
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %entry, %if.then
122*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
123*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine i32 @allZero128(<8 x i16> %a) #0 {
127*9880d681SAndroid Build Coastguard Worker; CHECK: _allZero128:
128*9880d681SAndroid Build Coastguard Worker; CHECK: umaxv.16b b[[REGNO1:[0-9]+]], v0
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]]
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]]
131*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]:
132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b _bar
133*9880d681SAndroid Build Coastguard Workerentry:
134*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i16> %a to <16 x i8>
135*9880d681SAndroid Build Coastguard Worker  %vmaxv.i = tail call i32 @llvm.aarch64.neon.umaxv.i32.v16i8(<16 x i8> %0) #3
136*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %vmaxv.i to i8
137*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %1, 0
138*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.then, label %return
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
141*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4
142*9880d681SAndroid Build Coastguard Worker  br label %return
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %entry, %if.then
145*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
146*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine i32 @allNonZero64(<4 x i16> %a) #0 {
150*9880d681SAndroid Build Coastguard Worker; CHECK: _allNonZero64:
151*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8b b[[REGNO1:[0-9]+]], v0
152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]]
153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]]
154*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]:
155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov w0, #0
156*9880d681SAndroid Build Coastguard Workerentry:
157*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16> %a to <8 x i8>
158*9880d681SAndroid Build Coastguard Worker  %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> %0) #3
159*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %vminv.i to i8
160*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %1, 0
161*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %return, label %if.then
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
164*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4
165*9880d681SAndroid Build Coastguard Worker  br label %return
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %entry, %if.then
168*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
169*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdefine i32 @allNonZero128(<8 x i16> %a) #0 {
173*9880d681SAndroid Build Coastguard Worker; CHECK: _allNonZero128:
174*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.16b b[[REGNO1:[0-9]+]], v0
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w[[REGNO2:[0-9]+]], s[[REGNO1]]
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cbz w[[REGNO2]], [[LABEL:[A-Z_0-9]+]]
177*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL]]:
178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov w0, #0
179*9880d681SAndroid Build Coastguard Workerentry:
180*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <8 x i16> %a to <16 x i8>
181*9880d681SAndroid Build Coastguard Worker  %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> %0) #3
182*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %vminv.i to i8
183*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %1, 0
184*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %return, label %if.then
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
187*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() #4
188*9880d681SAndroid Build Coastguard Worker  br label %return
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %entry, %if.then
191*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ]
192*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.umaxv.i32.v16i8(<16 x i8>) #2
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8>) #2
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8>) #2
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8>) #2
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind ssp "target-cpu"="cyclone" }
204*9880d681SAndroid Build Coastguard Workerattributes #1 = { "target-cpu"="cyclone" }
205*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind readnone }
206*9880d681SAndroid Build Coastguard Workerattributes #3 = { nounwind }
207*9880d681SAndroid Build Coastguard Workerattributes #4 = { nobuiltin nounwind }
208