[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / aarch64-saturating-arithmetic.ll
blob06cb13429b573219edb50107755b88afd8c483d9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -mtriple=aarch64-linux-gnu -O2 -o - %s | FileCheck %s
4 define i64 @test_ssub_nonneg_rhs(i64 %x) {
5 ; CHECK-LABEL: test_ssub_nonneg_rhs:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    mov x8, #-9223372036854775808 // =0x8000000000000000
8 ; CHECK-NEXT:    subs x9, x0, #1
9 ; CHECK-NEXT:    csel x0, x8, x9, vs
10 ; CHECK-NEXT:    ret
11   %sat = call i64 @llvm.ssub.sat.i64(i64 %x, i64 1)
12   ret i64 %sat
15 define i64 @test_ssub_neg_rhs(i64 %x) {
16 ; CHECK-LABEL: test_ssub_neg_rhs:
17 ; CHECK:       // %bb.0:
18 ; CHECK-NEXT:    mov x8, #9223372036854775807 // =0x7fffffffffffffff
19 ; CHECK-NEXT:    adds x9, x0, #1
20 ; CHECK-NEXT:    csel x0, x8, x9, vs
21 ; CHECK-NEXT:    ret
22   %sat = call i64 @llvm.ssub.sat.i64(i64 %x, i64 -1)
23   ret i64 %sat
26 define i64 @test_sadd_nonneg_rhs(i64 %x) {
27 ; CHECK-LABEL: test_sadd_nonneg_rhs:
28 ; CHECK:       // %bb.0:
29 ; CHECK-NEXT:    mov x8, #9223372036854775807 // =0x7fffffffffffffff
30 ; CHECK-NEXT:    adds x9, x0, #1
31 ; CHECK-NEXT:    csel x0, x8, x9, vs
32 ; CHECK-NEXT:    ret
33   %sat = call i64 @llvm.sadd.sat.i64(i64 %x, i64 1)
34   ret i64 %sat
38 define i64 @test_sadd_neg_rhs(i64 %x) {
39 ; CHECK-LABEL: test_sadd_neg_rhs:
40 ; CHECK:       // %bb.0:
41 ; CHECK-NEXT:    mov x8, #-9223372036854775808 // =0x8000000000000000
42 ; CHECK-NEXT:    subs x9, x0, #1
43 ; CHECK-NEXT:    csel x0, x8, x9, vs
44 ; CHECK-NEXT:    ret
45   %sat = call i64 @llvm.sadd.sat.i64(i64 %x, i64 -1)
46   ret i64 %sat
49 define i64 @test_ssub_nonneg_lhs(i64 %x) {
50 ; CHECK-LABEL: test_ssub_nonneg_lhs:
51 ; CHECK:       // %bb.0:
52 ; CHECK-NEXT:    mov w8, #1 // =0x1
53 ; CHECK-NEXT:    mov x9, #9223372036854775807 // =0x7fffffffffffffff
54 ; CHECK-NEXT:    subs x8, x8, x0
55 ; CHECK-NEXT:    csel x0, x9, x8, vs
56 ; CHECK-NEXT:    ret
57   %sat = call i64 @llvm.ssub.sat.i64(i64 1, i64 %x)
58   ret i64 %sat
61 define i64 @test_ssub_neg_lhs(i64 %x) {
62 ; CHECK-LABEL: test_ssub_neg_lhs:
63 ; CHECK:       // %bb.0:
64 ; CHECK-NEXT:    mov x8, #-1 // =0xffffffffffffffff
65 ; CHECK-NEXT:    mov x9, #-9223372036854775808 // =0x8000000000000000
66 ; CHECK-NEXT:    subs x8, x8, x0
67 ; CHECK-NEXT:    csel x0, x9, x8, vs
68 ; CHECK-NEXT:    ret
69   %sat = call i64 @llvm.ssub.sat.i64(i64 -1, i64 %x)
70   ret i64 %sat
73 define i64 @test_sadd_nonneg_lhs(i64 %x) {
74 ; CHECK-LABEL: test_sadd_nonneg_lhs:
75 ; CHECK:       // %bb.0:
76 ; CHECK-NEXT:    mov x8, #9223372036854775807 // =0x7fffffffffffffff
77 ; CHECK-NEXT:    adds x9, x0, #1
78 ; CHECK-NEXT:    csel x0, x8, x9, vs
79 ; CHECK-NEXT:    ret
80   %sat = call i64 @llvm.sadd.sat.i64(i64 1, i64 %x)
81   ret i64 %sat
84 define i64 @test_sadd_neg_lhs(i64 %x) {
85 ; CHECK-LABEL: test_sadd_neg_lhs:
86 ; CHECK:       // %bb.0:
87 ; CHECK-NEXT:    mov x8, #-9223372036854775808 // =0x8000000000000000
88 ; CHECK-NEXT:    subs x9, x0, #1
89 ; CHECK-NEXT:    csel x0, x8, x9, vs
90 ; CHECK-NEXT:    ret
91   %sat = call i64 @llvm.sadd.sat.i64(i64 -1, i64 %x)
92   ret i64 %sat
95 define i64 @test_ssub_nonneg_rhs_nonconst(i64 %x) {
96 ; CHECK-LABEL: test_ssub_nonneg_rhs_nonconst:
97 ; CHECK:       // %bb.0:
98 ; CHECK-NEXT:    mov w8, #123 // =0x7b
99 ; CHECK-NEXT:    mov x9, #-9223372036854775808 // =0x8000000000000000
100 ; CHECK-NEXT:    and x8, x0, x8
101 ; CHECK-NEXT:    subs x8, x0, x8
102 ; CHECK-NEXT:    csel x0, x9, x8, vs
103 ; CHECK-NEXT:    ret
104   %y = and i64 %x, 123
105   %sat = call i64 @llvm.ssub.sat.i64(i64 %x, i64 %y)
106   ret i64 %sat
109 define i64 @test_ssub_neg_rhs_nonconst(i64 %x) {
110 ; CHECK-LABEL: test_ssub_neg_rhs_nonconst:
111 ; CHECK:       // %bb.0:
112 ; CHECK-NEXT:    cmn x0, #1
113 ; CHECK-NEXT:    mov x8, #9223372036854775807 // =0x7fffffffffffffff
114 ; CHECK-NEXT:    csinv x9, x0, xzr, lt
115 ; CHECK-NEXT:    subs x9, x0, x9
116 ; CHECK-NEXT:    csel x0, x8, x9, vs
117 ; CHECK-NEXT:    ret
118   %y = call i64 @llvm.smin(i64 %x, i64 -1)
119   %sat = call i64 @llvm.ssub.sat.i64(i64 %x, i64 %y)
120   ret i64 %sat
123 define i64 @test_sadd_nonneg_rhs_nonconst(i64 %x) {
124 ; CHECK-LABEL: test_sadd_nonneg_rhs_nonconst:
125 ; CHECK:       // %bb.0:
126 ; CHECK-NEXT:    cmp x0, #1
127 ; CHECK-NEXT:    mov x8, #9223372036854775807 // =0x7fffffffffffffff
128 ; CHECK-NEXT:    csinc x9, x0, xzr, gt
129 ; CHECK-NEXT:    adds x9, x0, x9
130 ; CHECK-NEXT:    csel x0, x8, x9, vs
131 ; CHECK-NEXT:    ret
132   %y = call i64 @llvm.smax(i64 %x, i64 1)
133   %sat = call i64 @llvm.sadd.sat.i64(i64 %x, i64 %y)
134   ret i64 %sat
138 define i64 @test_sadd_neg_rhs_nonconst(i64 %x) {
139 ; CHECK-LABEL: test_sadd_neg_rhs_nonconst:
140 ; CHECK:       // %bb.0:
141 ; CHECK-NEXT:    orr x9, x0, #0x8000000000000000
142 ; CHECK-NEXT:    mov x8, #-9223372036854775808 // =0x8000000000000000
143 ; CHECK-NEXT:    adds x9, x0, x9
144 ; CHECK-NEXT:    csel x0, x8, x9, vs
145 ; CHECK-NEXT:    ret
146   %y = or i64 %x, u0x8000000000000000
147   %sat = call i64 @llvm.sadd.sat.i64(i64 %x, i64 %y)
148   ret i64 %sat
151 define i64 @test_ssub_nonneg_lhs_nonconst(i64 %x) {
152 ; CHECK-LABEL: test_ssub_nonneg_lhs_nonconst:
153 ; CHECK:       // %bb.0:
154 ; CHECK-NEXT:    mov w8, #123 // =0x7b
155 ; CHECK-NEXT:    mov x9, #9223372036854775807 // =0x7fffffffffffffff
156 ; CHECK-NEXT:    and x8, x0, x8
157 ; CHECK-NEXT:    subs x8, x8, x0
158 ; CHECK-NEXT:    csel x0, x9, x8, vs
159 ; CHECK-NEXT:    ret
160   %y = and i64 %x, 123
161   %sat = call i64 @llvm.ssub.sat.i64(i64 %y, i64 %x)
162   ret i64 %sat
165 define i64 @test_ssub_neg_lhs_nonconst(i64 %x) {
166 ; CHECK-LABEL: test_ssub_neg_lhs_nonconst:
167 ; CHECK:       // %bb.0:
168 ; CHECK-NEXT:    cmn x0, #1
169 ; CHECK-NEXT:    mov x8, #-9223372036854775808 // =0x8000000000000000
170 ; CHECK-NEXT:    csinv x9, x0, xzr, lt
171 ; CHECK-NEXT:    subs x9, x9, x0
172 ; CHECK-NEXT:    csel x0, x8, x9, vs
173 ; CHECK-NEXT:    ret
174   %y = call i64 @llvm.smin(i64 %x, i64 -1)
175   %sat = call i64 @llvm.ssub.sat.i64(i64 %y, i64 %x)
176   ret i64 %sat
179 define i64 @test_sadd_nonneg_lhs_nonconst(i64 %x) {
180 ; CHECK-LABEL: test_sadd_nonneg_lhs_nonconst:
181 ; CHECK:       // %bb.0:
182 ; CHECK-NEXT:    cmp x0, #1
183 ; CHECK-NEXT:    mov x8, #9223372036854775807 // =0x7fffffffffffffff
184 ; CHECK-NEXT:    csinc x9, x0, xzr, gt
185 ; CHECK-NEXT:    adds x9, x9, x0
186 ; CHECK-NEXT:    csel x0, x8, x9, vs
187 ; CHECK-NEXT:    ret
188   %y = call i64 @llvm.smax(i64 %x, i64 1)
189   %sat = call i64 @llvm.sadd.sat.i64(i64 %y, i64 %x)
190   ret i64 %sat
193 define i64 @test_sadd_neg_lhs_nonconst(i64 %x) {
194 ; CHECK-LABEL: test_sadd_neg_lhs_nonconst:
195 ; CHECK:       // %bb.0:
196 ; CHECK-NEXT:    orr x9, x0, #0x8000000000000000
197 ; CHECK-NEXT:    mov x8, #-9223372036854775808 // =0x8000000000000000
198 ; CHECK-NEXT:    adds x9, x9, x0
199 ; CHECK-NEXT:    csel x0, x8, x9, vs
200 ; CHECK-NEXT:    ret
201   %y = or i64 %x, u0x8000000000000000
202   %sat = call i64 @llvm.sadd.sat.i64(i64 %y, i64 %x)
203   ret i64 %sat
206 declare i64 @llvm.sadd.sat.i64(i64, i64)
207 declare i64 @llvm.ssub.sat.i64(i64, i64)
208 declare i64 @llvm.smax(i64, i64)
209 declare i64 @llvm.smin(i64, i64)