xref: /llvm-project/llvm/test/CodeGen/PowerPC/bcd-intrinsics.ll (revision 1492c88f494cb09de0ebc7fb77a84c41d0aa93ce)
1*c933c2ebSNemanja Ivanovic; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*c933c2ebSNemanja Ivanovic; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
3*c933c2ebSNemanja Ivanovic; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names \
4*c933c2ebSNemanja Ivanovic; RUN:   -ppc-vsr-nums-as-vr < %s | FileCheck %s
5*c933c2ebSNemanja Ivanovic; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
6*c933c2ebSNemanja Ivanovic; RUN:   -mcpu=pwr9 -ppc-asm-full-reg-names \
7*c933c2ebSNemanja Ivanovic; RUN:   -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-P9
8*c933c2ebSNemanja Ivanovic
9*c933c2ebSNemanja Ivanovicdefine dso_local i64 @test_invalid(<16 x i8> %a) local_unnamed_addr #0 {
10*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_invalid:
11*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
12*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdsub. v2, v2, v2, 0
13*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    setbc r3, 4*cr6+un
14*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
15*c933c2ebSNemanja Ivanovic;
16*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_invalid:
17*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
18*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdsub. v2, v2, v2, 0
19*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    mfocrf r3, 2
20*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    rlwinm r3, r3, 28, 31, 31
21*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
22*c933c2ebSNemanja Ivanovicentry:
23*c933c2ebSNemanja Ivanovic  %0 = tail call i32 @llvm.ppc.bcdsub.p(i32 6, <16 x i8> %a, <16 x i8> %a) #2
24*c933c2ebSNemanja Ivanovic  %conv.i = sext i32 %0 to i64
25*c933c2ebSNemanja Ivanovic  ret i64 %conv.i
26*c933c2ebSNemanja Ivanovic}
27*c933c2ebSNemanja Ivanovic
28*c933c2ebSNemanja Ivanovicdefine dso_local <16 x i8> @test_add(<16 x i8> %a, <16 x i8> %b, i64 %ps) local_unnamed_addr #0 {
29*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_add:
30*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
31*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdadd. v2, v2, v3, 1
32*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
33*c933c2ebSNemanja Ivanovic;
34*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_add:
35*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
36*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdadd. v2, v2, v3, 1
37*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
38*c933c2ebSNemanja Ivanovicentry:
39*c933c2ebSNemanja Ivanovic  %0 = tail call <16 x i8> @llvm.ppc.bcdadd(<16 x i8> %a, <16 x i8> %b, i32 1)
40*c933c2ebSNemanja Ivanovic  ret <16 x i8> %0
41*c933c2ebSNemanja Ivanovic}
42*c933c2ebSNemanja Ivanovic
43*c933c2ebSNemanja Ivanovicdefine dso_local i64 @test_add_ofl(<16 x i8> %a, <16 x i8> %b, i64 %ps) local_unnamed_addr #0 {
44*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_add_ofl:
45*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
46*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdadd. v2, v2, v3, 0
47*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    setbc r3, 4*cr6+un
48*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
49*c933c2ebSNemanja Ivanovic;
50*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_add_ofl:
51*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
52*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdadd. v2, v2, v3, 0
53*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    mfocrf r3, 2
54*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    rlwinm r3, r3, 28, 31, 31
55*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
56*c933c2ebSNemanja Ivanovicentry:
57*c933c2ebSNemanja Ivanovic  %0 = tail call i32 @llvm.ppc.bcdadd.p(i32 6, <16 x i8> %a, <16 x i8> %b) #2
58*c933c2ebSNemanja Ivanovic  %conv.i = sext i32 %0 to i64
59*c933c2ebSNemanja Ivanovic  ret i64 %conv.i
60*c933c2ebSNemanja Ivanovic}
61*c933c2ebSNemanja Ivanovic
62*c933c2ebSNemanja Ivanovicdefine dso_local <16 x i8> @test_sub(<16 x i8> %a, <16 x i8> %b, i64 %ps) local_unnamed_addr #0 {
63*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_sub:
64*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
65*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdsub. v2, v2, v3, 0
66*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
67*c933c2ebSNemanja Ivanovic;
68*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_sub:
69*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
70*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdsub. v2, v2, v3, 0
71*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
72*c933c2ebSNemanja Ivanovicentry:
73*c933c2ebSNemanja Ivanovic  %0 = tail call <16 x i8> @llvm.ppc.bcdsub(<16 x i8> %a, <16 x i8> %b, i32 0)
74*c933c2ebSNemanja Ivanovic  ret <16 x i8> %0
75*c933c2ebSNemanja Ivanovic}
76*c933c2ebSNemanja Ivanovic
77*c933c2ebSNemanja Ivanovicdefine dso_local i64 @test_sub_ofl(<16 x i8> %a, <16 x i8> %b, i64 %ps) local_unnamed_addr #0 {
78*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_sub_ofl:
79*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
80*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdsub. v2, v2, v3, 0
81*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    setbc r3, 4*cr6+un
82*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
83*c933c2ebSNemanja Ivanovic;
84*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_sub_ofl:
85*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
86*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdsub. v2, v2, v3, 0
87*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    mfocrf r3, 2
88*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    rlwinm r3, r3, 28, 31, 31
89*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
90*c933c2ebSNemanja Ivanovicentry:
91*c933c2ebSNemanja Ivanovic  %0 = tail call i32 @llvm.ppc.bcdsub.p(i32 6, <16 x i8> %a, <16 x i8> %b) #2
92*c933c2ebSNemanja Ivanovic  %conv.i = sext i32 %0 to i64
93*c933c2ebSNemanja Ivanovic  ret i64 %conv.i
94*c933c2ebSNemanja Ivanovic}
95*c933c2ebSNemanja Ivanovic
96*c933c2ebSNemanja Ivanovicdefine dso_local i64 @test_cmplt(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
97*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_cmplt:
98*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
99*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdsub. v2, v2, v3, 0
100*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    setbc r3, 4*cr6+lt
101*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
102*c933c2ebSNemanja Ivanovic;
103*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_cmplt:
104*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
105*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdsub. v2, v2, v3, 0
106*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    mfocrf r3, 2
107*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    rlwinm r3, r3, 25, 31, 31
108*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
109*c933c2ebSNemanja Ivanovicentry:
110*c933c2ebSNemanja Ivanovic  %0 = tail call i32 @llvm.ppc.bcdsub.p(i32 2, <16 x i8> %a, <16 x i8> %b) #2
111*c933c2ebSNemanja Ivanovic  %conv.i = sext i32 %0 to i64
112*c933c2ebSNemanja Ivanovic  ret i64 %conv.i
113*c933c2ebSNemanja Ivanovic}
114*c933c2ebSNemanja Ivanovic
115*c933c2ebSNemanja Ivanovicdefine dso_local i64 @test_cmpgt(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
116*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_cmpgt:
117*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
118*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdsub. v2, v2, v3, 0
119*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    setbc r3, 4*cr6+gt
120*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
121*c933c2ebSNemanja Ivanovic;
122*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_cmpgt:
123*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
124*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdsub. v2, v2, v3, 0
125*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    mfocrf r3, 2
126*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    rlwinm r3, r3, 26, 31, 31
127*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
128*c933c2ebSNemanja Ivanovicentry:
129*c933c2ebSNemanja Ivanovic  %0 = tail call i32 @llvm.ppc.bcdsub.p(i32 4, <16 x i8> %a, <16 x i8> %b) #2
130*c933c2ebSNemanja Ivanovic  %conv.i = sext i32 %0 to i64
131*c933c2ebSNemanja Ivanovic  ret i64 %conv.i
132*c933c2ebSNemanja Ivanovic}
133*c933c2ebSNemanja Ivanovic
134*c933c2ebSNemanja Ivanovicdefine dso_local i64 @test_cmpeq(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
135*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_cmpeq:
136*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
137*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdsub. v2, v2, v3, 0
138*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    setbc r3, 4*cr6+eq
139*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
140*c933c2ebSNemanja Ivanovic;
141*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_cmpeq:
142*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
143*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdsub. v2, v2, v3, 0
144*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    mfocrf r3, 2
145*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    rlwinm r3, r3, 27, 31, 31
146*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
147*c933c2ebSNemanja Ivanovicentry:
148*c933c2ebSNemanja Ivanovic  %0 = tail call i32 @llvm.ppc.bcdsub.p(i32 0, <16 x i8> %a, <16 x i8> %b) #2
149*c933c2ebSNemanja Ivanovic  %conv.i = sext i32 %0 to i64
150*c933c2ebSNemanja Ivanovic  ret i64 %conv.i
151*c933c2ebSNemanja Ivanovic}
152*c933c2ebSNemanja Ivanovic
153*c933c2ebSNemanja Ivanovicdefine dso_local i64 @test_cmpge(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
154*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_cmpge:
155*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
156*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdsub. v2, v2, v3, 0
157*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    setbcr r3, 4*cr6+lt
158*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
159*c933c2ebSNemanja Ivanovic;
160*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_cmpge:
161*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
162*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdsub. v2, v2, v3, 0
163*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    mfocrf r3, 2
164*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    rlwinm r3, r3, 25, 31, 31
165*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    xori r3, r3, 1
166*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
167*c933c2ebSNemanja Ivanovicentry:
168*c933c2ebSNemanja Ivanovic  %0 = tail call i32 @llvm.ppc.bcdsub.p(i32 3, <16 x i8> %a, <16 x i8> %b) #2
169*c933c2ebSNemanja Ivanovic  %conv.i = sext i32 %0 to i64
170*c933c2ebSNemanja Ivanovic  ret i64 %conv.i
171*c933c2ebSNemanja Ivanovic}
172*c933c2ebSNemanja Ivanovic
173*c933c2ebSNemanja Ivanovicdefine dso_local i64 @test_cmple(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
174*c933c2ebSNemanja Ivanovic; CHECK-LABEL: test_cmple:
175*c933c2ebSNemanja Ivanovic; CHECK:       # %bb.0: # %entry
176*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    bcdsub. v2, v2, v3, 0
177*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    setbcr r3, 4*cr6+gt
178*c933c2ebSNemanja Ivanovic; CHECK-NEXT:    blr
179*c933c2ebSNemanja Ivanovic;
180*c933c2ebSNemanja Ivanovic; CHECK-P9-LABEL: test_cmple:
181*c933c2ebSNemanja Ivanovic; CHECK-P9:       # %bb.0: # %entry
182*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    bcdsub. v2, v2, v3, 0
183*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    mfocrf r3, 2
184*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    rlwinm r3, r3, 26, 31, 31
185*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    xori r3, r3, 1
186*c933c2ebSNemanja Ivanovic; CHECK-P9-NEXT:    blr
187*c933c2ebSNemanja Ivanovicentry:
188*c933c2ebSNemanja Ivanovic  %0 = tail call i32 @llvm.ppc.bcdsub.p(i32 5, <16 x i8> %a, <16 x i8> %b) #2
189*c933c2ebSNemanja Ivanovic  %conv.i = sext i32 %0 to i64
190*c933c2ebSNemanja Ivanovic  ret i64 %conv.i
191*c933c2ebSNemanja Ivanovic}
192*c933c2ebSNemanja Ivanovic
193*c933c2ebSNemanja Ivanovicdeclare i32 @llvm.ppc.bcdsub.p(i32 immarg, <16 x i8>, <16 x i8>) #1
194*c933c2ebSNemanja Ivanovicdeclare i32 @llvm.ppc.bcdadd.p(i32 immarg, <16 x i8>, <16 x i8>) #1
195*c933c2ebSNemanja Ivanovicdeclare <16 x i8> @llvm.ppc.bcdadd(<16 x i8>, <16 x i8>, i32 immarg) #1
196*c933c2ebSNemanja Ivanovicdeclare <16 x i8> @llvm.ppc.bcdsub(<16 x i8>, <16 x i8>, i32 immarg) #1
197