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.
6define 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.
18define 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.
30define 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.
42define 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.
54define 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.
68define 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.
82define 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