1 ; Test negative integer absolute.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5 ; Test i32->i32 negative absolute using slt.
6 define i32 @f1(i32 %val) {
10 %cmp = icmp slt i32 %val, 0
11 %neg = sub i32 0, %val
12 %abs = select i1 %cmp, i32 %neg, i32 %val
13 %res = sub i32 0, %abs
17 ; Test i32->i32 negative absolute using sle.
18 define i32 @f2(i32 %val) {
22 %cmp = icmp sle i32 %val, 0
23 %neg = sub i32 0, %val
24 %abs = select i1 %cmp, i32 %neg, i32 %val
25 %res = sub i32 0, %abs
29 ; Test i32->i32 negative absolute using sgt.
30 define i32 @f3(i32 %val) {
34 %cmp = icmp sgt i32 %val, 0
35 %neg = sub i32 0, %val
36 %abs = select i1 %cmp, i32 %val, i32 %neg
37 %res = sub i32 0, %abs
41 ; Test i32->i32 negative absolute using sge.
42 define i32 @f4(i32 %val) {
46 %cmp = icmp sge i32 %val, 0
47 %neg = sub i32 0, %val
48 %abs = select i1 %cmp, i32 %val, i32 %neg
49 %res = sub i32 0, %abs
53 ; Test i32->i64 negative absolute.
54 define i64 @f5(i32 %val) {
56 ; CHECK: lngfr %r2, %r2
58 %ext = sext i32 %val to i64
59 %cmp = icmp slt i64 %ext, 0
60 %neg = sub i64 0, %ext
61 %abs = select i1 %cmp, i64 %neg, i64 %ext
62 %res = sub i64 0, %abs
66 ; Test i32->i64 negative absolute that uses an "in-register" form of
68 define i64 @f6(i64 %val) {
70 ; CHECK: lngfr %r2, %r2
72 %trunc = trunc i64 %val to i32
73 %ext = sext i32 %trunc to i64
74 %cmp = icmp slt i64 %ext, 0
75 %neg = sub i64 0, %ext
76 %abs = select i1 %cmp, i64 %neg, i64 %ext
77 %res = sub i64 0, %abs
81 ; Test i64 negative absolute.
82 define i64 @f7(i64 %val) {
84 ; CHECK: lngr %r2, %r2
86 %cmp = icmp slt i64 %val, 0
87 %neg = sub i64 0, %val
88 %abs = select i1 %cmp, i64 %neg, i64 %val
89 %res = sub i64 0, %abs
93 ; Test another form of f6, which is that produced by InstCombine.
94 define i64 @f8(i64 %val) {
96 ; CHECK: lngfr %r2, %r2
98 %shl = shl i64 %val, 32
99 %ashr = ashr i64 %shl, 32
100 %neg = sub i64 0, %ashr
101 %cmp = icmp slt i64 %shl, 0
102 %abs = select i1 %cmp, i64 %neg, i64 %ashr
103 %res = sub i64 0, %abs
107 ; Try again with sle rather than slt.
108 define i64 @f9(i64 %val) {
110 ; CHECK: lngfr %r2, %r2
112 %shl = shl i64 %val, 32
113 %ashr = ashr i64 %shl, 32
114 %neg = sub i64 0, %ashr
115 %cmp = icmp sle i64 %shl, 0
116 %abs = select i1 %cmp, i64 %neg, i64 %ashr
117 %res = sub i64 0, %abs
121 ; Repeat f8 with the operands reversed.
122 define i64 @f10(i64 %val) {
124 ; CHECK: lngfr %r2, %r2
126 %shl = shl i64 %val, 32
127 %ashr = ashr i64 %shl, 32
128 %neg = sub i64 0, %ashr
129 %cmp = icmp sgt i64 %shl, 0
130 %abs = select i1 %cmp, i64 %ashr, i64 %neg
131 %res = sub i64 0, %abs
135 ; Try again with sge rather than sgt.
136 define i64 @f11(i64 %val) {
138 ; CHECK: lngfr %r2, %r2
140 %shl = shl i64 %val, 32
141 %ashr = ashr i64 %shl, 32
142 %neg = sub i64 0, %ashr
143 %cmp = icmp sge i64 %shl, 0
144 %abs = select i1 %cmp, i64 %ashr, i64 %neg
145 %res = sub i64 0, %abs
149 ; Repeat f8 with the negation coming from swapped operands.
150 define i64 @f12(i64 %val) {
152 ; CHECK: lngfr %r2, %r2
154 %shl = shl i64 %val, 32
155 %ashr = ashr i64 %shl, 32
156 %neg = sub i64 0, %ashr
157 %cmp = icmp slt i64 %shl, 0
158 %negabs = select i1 %cmp, i64 %ashr, i64 %neg
163 define i64 @f13(i64 %val) {
165 ; CHECK: lngfr %r2, %r2
167 %shl = shl i64 %val, 32
168 %ashr = ashr i64 %shl, 32
169 %neg = sub i64 0, %ashr
170 %cmp = icmp sle i64 %shl, 0
171 %negabs = select i1 %cmp, i64 %ashr, i64 %neg
176 define i64 @f14(i64 %val) {
178 ; CHECK: lngfr %r2, %r2
180 %shl = shl i64 %val, 32
181 %ashr = ashr i64 %shl, 32
182 %neg = sub i64 0, %ashr
183 %cmp = icmp sgt i64 %shl, 0
184 %negabs = select i1 %cmp, i64 %neg, i64 %ashr
189 define i64 @f15(i64 %val) {
191 ; CHECK: lngfr %r2, %r2
193 %shl = shl i64 %val, 32
194 %ashr = ashr i64 %shl, 32
195 %neg = sub i64 0, %ashr
196 %cmp = icmp sge i64 %shl, 0
197 %negabs = select i1 %cmp, i64 %neg, i64 %ashr
201 ; Repeat f5 with the comparison on the unextended value.
202 define i64 @f16(i32 %val) {
204 ; CHECK: lngfr %r2, %r2
206 %ext = sext i32 %val to i64
207 %cmp = icmp slt i32 %val, 0
208 %neg = sub i64 0, %ext
209 %abs = select i1 %cmp, i64 %neg, i64 %ext
210 %res = sub i64 0, %abs
214 ; And again with the negation coming from swapped operands.
215 define i64 @f17(i32 %val) {
217 ; CHECK: lngfr %r2, %r2
219 %ext = sext i32 %val to i64
220 %cmp = icmp slt i32 %val, 0
221 %neg = sub i64 0, %ext
222 %abs = select i1 %cmp, i64 %ext, i64 %neg