[SystemZ] Extend RISBG optimization
[oota-llvm.git] / test / CodeGen / SystemZ / risbg-02.ll
1 ; Test sequences that can use RISBG with a normal first operand.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5 ; Test a case with two ANDs.
6 define i32 @f1(i32 %a, i32 %b) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: risbg %r2, %r3, 60, 62, 0
9 ; CHECK: br %r14
10   %anda = and i32 %a, -15
11   %andb = and i32 %b, 14
12   %or = or i32 %anda, %andb
13   ret i32 %or
14 }
15
16 ; ...and again with i64.
17 define i64 @f2(i64 %a, i64 %b) {
18 ; CHECK-LABEL: f2:
19 ; CHECK: risbg %r2, %r3, 60, 62, 0
20 ; CHECK: br %r14
21   %anda = and i64 %a, -15
22   %andb = and i64 %b, 14
23   %or = or i64 %anda, %andb
24   ret i64 %or
25 }
26
27 ; Test a case with two ANDs and a shift.
28 define i32 @f3(i32 %a, i32 %b) {
29 ; CHECK-LABEL: f3:
30 ; CHECK: risbg %r2, %r3, 60, 63, 56
31 ; CHECK: br %r14
32   %anda = and i32 %a, -16
33   %shr = lshr i32 %b, 8
34   %andb = and i32 %shr, 15
35   %or = or i32 %anda, %andb
36   ret i32 %or
37 }
38
39 ; ...and again with i64.
40 define i64 @f4(i64 %a, i64 %b) {
41 ; CHECK-LABEL: f4:
42 ; CHECK: risbg %r2, %r3, 60, 63, 56
43 ; CHECK: br %r14
44   %anda = and i64 %a, -16
45   %shr = lshr i64 %b, 8
46   %andb = and i64 %shr, 15
47   %or = or i64 %anda, %andb
48   ret i64 %or
49 }
50
51 ; Test a case with a single AND and a left shift.
52 define i32 @f5(i32 %a, i32 %b) {
53 ; CHECK-LABEL: f5:
54 ; CHECK: risbg %r2, %r3, 32, 53, 10
55 ; CHECK: br %r14
56   %anda = and i32 %a, 1023
57   %shlb = shl i32 %b, 10
58   %or = or i32 %anda, %shlb
59   ret i32 %or
60 }
61
62 ; ...and again with i64.
63 define i64 @f6(i64 %a, i64 %b) {
64 ; CHECK-LABEL: f6:
65 ; CHECK: risbg %r2, %r3, 0, 53, 10
66 ; CHECK: br %r14
67   %anda = and i64 %a, 1023
68   %shlb = shl i64 %b, 10
69   %or = or i64 %anda, %shlb
70   ret i64 %or
71 }
72
73 ; Test a case with a single AND and a right shift.
74 define i32 @f7(i32 %a, i32 %b) {
75 ; CHECK-LABEL: f7:
76 ; CHECK: risbg %r2, %r3, 40, 63, 56
77 ; CHECK: br %r14
78   %anda = and i32 %a, -16777216
79   %shrb = lshr i32 %b, 8
80   %or = or i32 %anda, %shrb
81   ret i32 %or
82 }
83
84 ; ...and again with i64.
85 define i64 @f8(i64 %a, i64 %b) {
86 ; CHECK-LABEL: f8:
87 ; CHECK: risbg %r2, %r3, 8, 63, 56
88 ; CHECK: br %r14
89   %anda = and i64 %a, -72057594037927936
90   %shrb = lshr i64 %b, 8
91   %or = or i64 %anda, %shrb
92   ret i64 %or
93 }