e26194c162d424d20d7d61875a12c0f5038c52fc
[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 }