[SystemZ] Extend integer absolute selection
[oota-llvm.git] / test / CodeGen / SystemZ / int-neg-02.ll
1 ; Test negative integer absolute.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5 ; Test i32->i32 negative absolute using slt.
6 define i32 @f1(i32 %val) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: lnr %r2, %r2
9 ; CHECK: br %r14
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
14   ret i32 %res
15 }
16
17 ; Test i32->i32 negative absolute using sle.
18 define i32 @f2(i32 %val) {
19 ; CHECK-LABEL: f2:
20 ; CHECK: lnr %r2, %r2
21 ; CHECK: br %r14
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
26   ret i32 %res
27 }
28
29 ; Test i32->i32 negative absolute using sgt.
30 define i32 @f3(i32 %val) {
31 ; CHECK-LABEL: f3:
32 ; CHECK: lnr %r2, %r2
33 ; CHECK: br %r14
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
38   ret i32 %res
39 }
40
41 ; Test i32->i32 negative absolute using sge.
42 define i32 @f4(i32 %val) {
43 ; CHECK-LABEL: f4:
44 ; CHECK: lnr %r2, %r2
45 ; CHECK: br %r14
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
50   ret i32 %res
51 }
52
53 ; Test i32->i64 negative absolute.
54 define i64 @f5(i32 %val) {
55 ; CHECK-LABEL: f5:
56 ; CHECK: lngfr %r2, %r2
57 ; CHECK: br %r14
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
63   ret i64 %res
64 }
65
66 ; Test i32->i64 negative absolute that uses an "in-register" form of
67 ; sign extension.
68 define i64 @f6(i64 %val) {
69 ; CHECK-LABEL: f6:
70 ; CHECK: lngfr %r2, %r2
71 ; CHECK: br %r14
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
78   ret i64 %res
79 }
80
81 ; Test i64 negative absolute.
82 define i64 @f7(i64 %val) {
83 ; CHECK-LABEL: f7:
84 ; CHECK: lngr %r2, %r2
85 ; CHECK: br %r14
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
90   ret i64 %res
91 }
92
93 ; Test another form of f6, which is that produced by InstCombine.
94 define i64 @f8(i64 %val) {
95 ; CHECK-LABEL: f8:
96 ; CHECK: lngfr %r2, %r2
97 ; CHECK: br %r14
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
104   ret i64 %res
105 }
106
107 ; Try again with sle rather than slt.
108 define i64 @f9(i64 %val) {
109 ; CHECK-LABEL: f9:
110 ; CHECK: lngfr %r2, %r2
111 ; CHECK: br %r14
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
118   ret i64 %res
119 }
120
121 ; Repeat f8 with the operands reversed.
122 define i64 @f10(i64 %val) {
123 ; CHECK-LABEL: f10:
124 ; CHECK: lngfr %r2, %r2
125 ; CHECK: br %r14
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
132   ret i64 %res
133 }
134
135 ; Try again with sge rather than sgt.
136 define i64 @f11(i64 %val) {
137 ; CHECK-LABEL: f11:
138 ; CHECK: lngfr %r2, %r2
139 ; CHECK: br %r14
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
146   ret i64 %res
147 }
148
149 ; Repeat f8 with the negation coming from swapped operands.
150 define i64 @f12(i64 %val) {
151 ; CHECK-LABEL: f12:
152 ; CHECK: lngfr %r2, %r2
153 ; CHECK: br %r14
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
159   ret i64 %negabs
160 }
161
162 ; Likewise f9.
163 define i64 @f13(i64 %val) {
164 ; CHECK-LABEL: f13:
165 ; CHECK: lngfr %r2, %r2
166 ; CHECK: br %r14
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
172   ret i64 %negabs
173 }
174
175 ; Likewise f10.
176 define i64 @f14(i64 %val) {
177 ; CHECK-LABEL: f14:
178 ; CHECK: lngfr %r2, %r2
179 ; CHECK: br %r14
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
185   ret i64 %negabs
186 }
187
188 ; Likewise f11.
189 define i64 @f15(i64 %val) {
190 ; CHECK-LABEL: f15:
191 ; CHECK: lngfr %r2, %r2
192 ; CHECK: br %r14
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
198   ret i64 %negabs
199 }
200
201 ; Repeat f5 with the comparison on the unextended value.
202 define i64 @f16(i32 %val) {
203 ; CHECK-LABEL: f16:
204 ; CHECK: lngfr %r2, %r2
205 ; CHECK: br %r14
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
211   ret i64 %res
212 }
213
214 ; And again with the negation coming from swapped operands.
215 define i64 @f17(i32 %val) {
216 ; CHECK-LABEL: f17:
217 ; CHECK: lngfr %r2, %r2
218 ; CHECK: br %r14
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
223   ret i64 %abs
224 }