xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-arith-saturating.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -mcpu=cyclone | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @qadds(<4 x i32> %b, <4 x i32> %c) nounwind readnone optsize ssp {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: qadds:
5*9880d681SAndroid Build Coastguard Worker; CHECK: sqadd s0, s0, s1
6*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <4 x i32> %b, i32 0
7*9880d681SAndroid Build Coastguard Worker  %vecext1 = extractelement <4 x i32> %c, i32 0
8*9880d681SAndroid Build Coastguard Worker  %vqadd.i = tail call i32 @llvm.aarch64.neon.sqadd.i32(i32 %vecext, i32 %vecext1) nounwind
9*9880d681SAndroid Build Coastguard Worker  ret i32 %vqadd.i
10*9880d681SAndroid Build Coastguard Worker}
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine i64 @qaddd(<2 x i64> %b, <2 x i64> %c) nounwind readnone optsize ssp {
13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: qaddd:
14*9880d681SAndroid Build Coastguard Worker; CHECK: sqadd d0, d0, d1
15*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %b, i32 0
16*9880d681SAndroid Build Coastguard Worker  %vecext1 = extractelement <2 x i64> %c, i32 0
17*9880d681SAndroid Build Coastguard Worker  %vqadd.i = tail call i64 @llvm.aarch64.neon.sqadd.i64(i64 %vecext, i64 %vecext1) nounwind
18*9880d681SAndroid Build Coastguard Worker  ret i64 %vqadd.i
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine i32 @uqadds(<4 x i32> %b, <4 x i32> %c) nounwind readnone optsize ssp {
22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uqadds:
23*9880d681SAndroid Build Coastguard Worker; CHECK: uqadd s0, s0, s1
24*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <4 x i32> %b, i32 0
25*9880d681SAndroid Build Coastguard Worker  %vecext1 = extractelement <4 x i32> %c, i32 0
26*9880d681SAndroid Build Coastguard Worker  %vqadd.i = tail call i32 @llvm.aarch64.neon.uqadd.i32(i32 %vecext, i32 %vecext1) nounwind
27*9880d681SAndroid Build Coastguard Worker  ret i32 %vqadd.i
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine i64 @uqaddd(<2 x i64> %b, <2 x i64> %c) nounwind readnone optsize ssp {
31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uqaddd:
32*9880d681SAndroid Build Coastguard Worker; CHECK: uqadd d0, d0, d1
33*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %b, i32 0
34*9880d681SAndroid Build Coastguard Worker  %vecext1 = extractelement <2 x i64> %c, i32 0
35*9880d681SAndroid Build Coastguard Worker  %vqadd.i = tail call i64 @llvm.aarch64.neon.uqadd.i64(i64 %vecext, i64 %vecext1) nounwind
36*9880d681SAndroid Build Coastguard Worker  ret i64 %vqadd.i
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.uqadd.i64(i64, i64) nounwind readnone
40*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uqadd.i32(i32, i32) nounwind readnone
41*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.sqadd.i64(i64, i64) nounwind readnone
42*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sqadd.i32(i32, i32) nounwind readnone
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine i32 @qsubs(<4 x i32> %b, <4 x i32> %c) nounwind readnone optsize ssp {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: qsubs:
46*9880d681SAndroid Build Coastguard Worker; CHECK: sqsub s0, s0, s1
47*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <4 x i32> %b, i32 0
48*9880d681SAndroid Build Coastguard Worker  %vecext1 = extractelement <4 x i32> %c, i32 0
49*9880d681SAndroid Build Coastguard Worker  %vqsub.i = tail call i32 @llvm.aarch64.neon.sqsub.i32(i32 %vecext, i32 %vecext1) nounwind
50*9880d681SAndroid Build Coastguard Worker  ret i32 %vqsub.i
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine i64 @qsubd(<2 x i64> %b, <2 x i64> %c) nounwind readnone optsize ssp {
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: qsubd:
55*9880d681SAndroid Build Coastguard Worker; CHECK: sqsub d0, d0, d1
56*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %b, i32 0
57*9880d681SAndroid Build Coastguard Worker  %vecext1 = extractelement <2 x i64> %c, i32 0
58*9880d681SAndroid Build Coastguard Worker  %vqsub.i = tail call i64 @llvm.aarch64.neon.sqsub.i64(i64 %vecext, i64 %vecext1) nounwind
59*9880d681SAndroid Build Coastguard Worker  ret i64 %vqsub.i
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdefine i32 @uqsubs(<4 x i32> %b, <4 x i32> %c) nounwind readnone optsize ssp {
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uqsubs:
64*9880d681SAndroid Build Coastguard Worker; CHECK: uqsub s0, s0, s1
65*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <4 x i32> %b, i32 0
66*9880d681SAndroid Build Coastguard Worker  %vecext1 = extractelement <4 x i32> %c, i32 0
67*9880d681SAndroid Build Coastguard Worker  %vqsub.i = tail call i32 @llvm.aarch64.neon.uqsub.i32(i32 %vecext, i32 %vecext1) nounwind
68*9880d681SAndroid Build Coastguard Worker  ret i32 %vqsub.i
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine i64 @uqsubd(<2 x i64> %b, <2 x i64> %c) nounwind readnone optsize ssp {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uqsubd:
73*9880d681SAndroid Build Coastguard Worker; CHECK: uqsub d0, d0, d1
74*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %b, i32 0
75*9880d681SAndroid Build Coastguard Worker  %vecext1 = extractelement <2 x i64> %c, i32 0
76*9880d681SAndroid Build Coastguard Worker  %vqsub.i = tail call i64 @llvm.aarch64.neon.uqsub.i64(i64 %vecext, i64 %vecext1) nounwind
77*9880d681SAndroid Build Coastguard Worker  ret i64 %vqsub.i
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.uqsub.i64(i64, i64) nounwind readnone
81*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uqsub.i32(i32, i32) nounwind readnone
82*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.sqsub.i64(i64, i64) nounwind readnone
83*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sqsub.i32(i32, i32) nounwind readnone
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine i32 @qabss(<4 x i32> %b, <4 x i32> %c) nounwind readnone {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: qabss:
87*9880d681SAndroid Build Coastguard Worker; CHECK: sqabs s0, s0
88*9880d681SAndroid Build Coastguard Worker; CHECK: ret
89*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <4 x i32> %b, i32 0
90*9880d681SAndroid Build Coastguard Worker  %vqabs.i = tail call i32 @llvm.aarch64.neon.sqabs.i32(i32 %vecext) nounwind
91*9880d681SAndroid Build Coastguard Worker  ret i32 %vqabs.i
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdefine i64 @qabsd(<2 x i64> %b, <2 x i64> %c) nounwind readnone {
95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: qabsd:
96*9880d681SAndroid Build Coastguard Worker; CHECK: sqabs d0, d0
97*9880d681SAndroid Build Coastguard Worker; CHECK: ret
98*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %b, i32 0
99*9880d681SAndroid Build Coastguard Worker  %vqabs.i = tail call i64 @llvm.aarch64.neon.sqabs.i64(i64 %vecext) nounwind
100*9880d681SAndroid Build Coastguard Worker  ret i64 %vqabs.i
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine i32 @qnegs(<4 x i32> %b, <4 x i32> %c) nounwind readnone {
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: qnegs:
105*9880d681SAndroid Build Coastguard Worker; CHECK: sqneg s0, s0
106*9880d681SAndroid Build Coastguard Worker; CHECK: ret
107*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <4 x i32> %b, i32 0
108*9880d681SAndroid Build Coastguard Worker  %vqneg.i = tail call i32 @llvm.aarch64.neon.sqneg.i32(i32 %vecext) nounwind
109*9880d681SAndroid Build Coastguard Worker  ret i32 %vqneg.i
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine i64 @qnegd(<2 x i64> %b, <2 x i64> %c) nounwind readnone {
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: qnegd:
114*9880d681SAndroid Build Coastguard Worker; CHECK: sqneg d0, d0
115*9880d681SAndroid Build Coastguard Worker; CHECK: ret
116*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %b, i32 0
117*9880d681SAndroid Build Coastguard Worker  %vqneg.i = tail call i64 @llvm.aarch64.neon.sqneg.i64(i64 %vecext) nounwind
118*9880d681SAndroid Build Coastguard Worker  ret i64 %vqneg.i
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.sqneg.i64(i64) nounwind readnone
122*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sqneg.i32(i32) nounwind readnone
123*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.sqabs.i64(i64) nounwind readnone
124*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sqabs.i32(i32) nounwind readnone
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerdefine i32 @vqmovund(<2 x i64> %b) nounwind readnone {
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vqmovund:
129*9880d681SAndroid Build Coastguard Worker; CHECK: sqxtun s0, d0
130*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %b, i32 0
131*9880d681SAndroid Build Coastguard Worker  %vqmovun.i = tail call i32 @llvm.aarch64.neon.scalar.sqxtun.i32.i64(i64 %vecext) nounwind
132*9880d681SAndroid Build Coastguard Worker  ret i32 %vqmovun.i
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine i32 @vqmovnd_s(<2 x i64> %b) nounwind readnone {
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vqmovnd_s:
137*9880d681SAndroid Build Coastguard Worker; CHECK: sqxtn s0, d0
138*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %b, i32 0
139*9880d681SAndroid Build Coastguard Worker  %vqmovn.i = tail call i32 @llvm.aarch64.neon.scalar.sqxtn.i32.i64(i64 %vecext) nounwind
140*9880d681SAndroid Build Coastguard Worker  ret i32 %vqmovn.i
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerdefine i32 @vqmovnd_u(<2 x i64> %b) nounwind readnone {
144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vqmovnd_u:
145*9880d681SAndroid Build Coastguard Worker; CHECK: uqxtn s0, d0
146*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %b, i32 0
147*9880d681SAndroid Build Coastguard Worker  %vqmovn.i = tail call i32 @llvm.aarch64.neon.scalar.uqxtn.i32.i64(i64 %vecext) nounwind
148*9880d681SAndroid Build Coastguard Worker  ret i32 %vqmovn.i
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.scalar.uqxtn.i32.i64(i64) nounwind readnone
152*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.scalar.sqxtn.i32.i64(i64) nounwind readnone
153*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.scalar.sqxtun.i32.i64(i64) nounwind readnone
154