1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; Test sequences that can use RISBG with a normal first operand.
4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
6 ; Test a case with two ANDs.
7 define i32 @f1(i32 %a, i32 %b) {
10 ; CHECK-NEXT: # kill: def $r3l killed $r3l def $r3d
11 ; CHECK-NEXT: # kill: def $r2l killed $r2l def $r2d
12 ; CHECK-NEXT: risbg %r2, %r3, 60, 62, 0
13 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d
15 %anda = and i32 %a, -15
16 %andb = and i32 %b, 14
17 %or = or i32 %anda, %andb
21 ; ...and again with i64.
22 define i64 @f2(i64 %a, i64 %b) {
25 ; CHECK-NEXT: risbg %r2, %r3, 60, 62, 0
27 %anda = and i64 %a, -15
28 %andb = and i64 %b, 14
29 %or = or i64 %anda, %andb
33 ; Test a case with two ANDs and a shift.
34 define i32 @f3(i32 %a, i32 %b) {
37 ; CHECK-NEXT: # kill: def $r3l killed $r3l def $r3d
38 ; CHECK-NEXT: # kill: def $r2l killed $r2l def $r2d
39 ; CHECK-NEXT: risbg %r2, %r3, 60, 63, 56
40 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d
42 %anda = and i32 %a, -16
44 %andb = and i32 %shr, 15
45 %or = or i32 %anda, %andb
49 ; ...and again with i64.
50 define i64 @f4(i64 %a, i64 %b) {
53 ; CHECK-NEXT: risbg %r2, %r3, 60, 63, 56
55 %anda = and i64 %a, -16
57 %andb = and i64 %shr, 15
58 %or = or i64 %anda, %andb
62 ; Test a case with a single AND and a left shift.
63 define i32 @f5(i32 %a, i32 %b) {
66 ; CHECK-NEXT: # kill: def $r3l killed $r3l def $r3d
67 ; CHECK-NEXT: # kill: def $r2l killed $r2l def $r2d
68 ; CHECK-NEXT: risbg %r2, %r3, 32, 53, 10
69 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d
71 %anda = and i32 %a, 1023
72 %shlb = shl i32 %b, 10
73 %or = or i32 %anda, %shlb
77 ; ...and again with i64.
78 define i64 @f6(i64 %a, i64 %b) {
81 ; CHECK-NEXT: risbg %r2, %r3, 0, 53, 10
83 %anda = and i64 %a, 1023
84 %shlb = shl i64 %b, 10
85 %or = or i64 %anda, %shlb
89 ; Test a case with a single AND and a right shift.
90 define i32 @f7(i32 %a, i32 %b) {
93 ; CHECK-NEXT: # kill: def $r3l killed $r3l def $r3d
94 ; CHECK-NEXT: # kill: def $r2l killed $r2l def $r2d
95 ; CHECK-NEXT: risbg %r2, %r3, 40, 63, 56
96 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d
98 %anda = and i32 %a, -16777216
99 %shrb = lshr i32 %b, 8
100 %or = or i32 %anda, %shrb
104 ; ...and again with i64.
105 define i64 @f8(i64 %a, i64 %b) {
108 ; CHECK-NEXT: risbg %r2, %r3, 8, 63, 56
109 ; CHECK-NEXT: br %r14
110 %anda = and i64 %a, -72057594037927936
111 %shrb = lshr i64 %b, 8
112 %or = or i64 %anda, %shrb
116 ; Check that we can get the case where a 64-bit shift feeds a 32-bit or of
117 ; ands with complement masks.
118 define signext i32 @f9(i64 %x, i32 signext %y) {
121 ; CHECK-NEXT: risbg %r3, %r2, 48, 63, 16
122 ; CHECK-NEXT: lgfr %r2, %r3
123 ; CHECK-NEXT: br %r14
124 %shr6 = lshr i64 %x, 48
125 %conv = trunc i64 %shr6 to i32
126 %and1 = and i32 %y, -65536
127 %or = or i32 %conv, %and1
131 ; Check that we don't get the case where a 64-bit shift feeds a 32-bit or of
132 ; ands with incompatible masks.
133 define signext i32 @f10(i64 %x, i32 signext %y) {
136 ; CHECK-NEXT: nilf %r3, 4278190080
137 ; CHECK-NEXT: rosbg %r3, %r2, 48, 63, 16
138 ; CHECK-NEXT: lgfr %r2, %r3
139 ; CHECK-NEXT: br %r14
140 %shr6 = lshr i64 %x, 48
141 %conv = trunc i64 %shr6 to i32
142 %and1 = and i32 %y, -16777216
143 %or = or i32 %conv, %and1