[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / SystemZ / int-mul-05.ll
blob93f140d84504ff1f564ee73facdf6fbe5bf20222
1 ; Test 32-bit multiplication in which the second operand is constant.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5 ; Check multiplication by 2, which should use shifts.
6 define i32 @f1(i32 %a, i32 *%dest) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: sll %r2, 1
9 ; CHECK: br %r14
10   %mul = mul i32 %a, 2
11   ret i32 %mul
14 ; Check multiplication by 3.
15 define i32 @f2(i32 %a, i32 *%dest) {
16 ; CHECK-LABEL: f2:
17 ; CHECK: mhi %r2, 3
18 ; CHECK: br %r14
19   %mul = mul i32 %a, 3
20   ret i32 %mul
23 ; Check the high end of the MHI range.
24 define i32 @f3(i32 %a, i32 *%dest) {
25 ; CHECK-LABEL: f3:
26 ; CHECK: mhi %r2, 32767
27 ; CHECK: br %r14
28   %mul = mul i32 %a, 32767
29   ret i32 %mul
32 ; Check the next value up, which should use shifts.
33 define i32 @f4(i32 %a, i32 *%dest) {
34 ; CHECK-LABEL: f4:
35 ; CHECK: sll %r2, 15
36 ; CHECK: br %r14
37   %mul = mul i32 %a, 32768
38   ret i32 %mul
41 ; Check the next value up again, which can use MSFI.
42 define i32 @f5(i32 %a, i32 *%dest) {
43 ; CHECK-LABEL: f5:
44 ; CHECK: msfi %r2, 32769
45 ; CHECK: br %r14
46   %mul = mul i32 %a, 32769
47   ret i32 %mul
50 ; Check the high end of the MSFI range.
51 define i32 @f6(i32 %a, i32 *%dest) {
52 ; CHECK-LABEL: f6:
53 ; CHECK: msfi %r2, 2147483647
54 ; CHECK: br %r14
55   %mul = mul i32 %a, 2147483647
56   ret i32 %mul
59 ; Check the next value up, which should use shifts.
60 define i32 @f7(i32 %a, i32 *%dest) {
61 ; CHECK-LABEL: f7:
62 ; CHECK: sll %r2, 31
63 ; CHECK: br %r14
64   %mul = mul i32 %a, 2147483648
65   ret i32 %mul
68 ; Check the next value up again, which is treated as a negative value.
69 define i32 @f8(i32 %a, i32 *%dest) {
70 ; CHECK-LABEL: f8:
71 ; CHECK: msfi %r2, -2147483647
72 ; CHECK: br %r14
73   %mul = mul i32 %a, 2147483649
74   ret i32 %mul
77 ; Check multiplication by -1, which is a negation.
78 define i32 @f9(i32 %a, i32 *%dest) {
79 ; CHECK-LABEL: f9:
80 ; CHECK: lcr %r2, %r2
81 ; CHECK: br %r14
82   %mul = mul i32 %a, -1
83   ret i32 %mul
86 ; Check multiplication by -2, which should use shifts.
87 define i32 @f10(i32 %a, i32 *%dest) {
88 ; CHECK-LABEL: f10:
89 ; CHECK: sll %r2, 1
90 ; CHECK: lcr %r2, %r2
91 ; CHECK: br %r14
92   %mul = mul i32 %a, -2
93   ret i32 %mul
96 ; Check multiplication by -3.
97 define i32 @f11(i32 %a, i32 *%dest) {
98 ; CHECK-LABEL: f11:
99 ; CHECK: mhi %r2, -3
100 ; CHECK: br %r14
101   %mul = mul i32 %a, -3
102   ret i32 %mul
105 ; Check the lowest useful MHI value.
106 define i32 @f12(i32 %a, i32 *%dest) {
107 ; CHECK-LABEL: f12:
108 ; CHECK: mhi %r2, -32767
109 ; CHECK: br %r14
110   %mul = mul i32 %a, -32767
111   ret i32 %mul
114 ; Check the next value down, which should use shifts.
115 define i32 @f13(i32 %a, i32 *%dest) {
116 ; CHECK-LABEL: f13:
117 ; CHECK: sll %r2, 15
118 ; CHECK: lcr %r2, %r2
119 ; CHECK: br %r14
120   %mul = mul i32 %a, -32768
121   ret i32 %mul
124 ; Check the next value down again, which can use MSFI.
125 define i32 @f14(i32 %a, i32 *%dest) {
126 ; CHECK-LABEL: f14:
127 ; CHECK: msfi %r2, -32769
128 ; CHECK: br %r14
129   %mul = mul i32 %a, -32769
130   ret i32 %mul
133 ; Check the lowest useful MSFI value.
134 define i32 @f15(i32 %a, i32 *%dest) {
135 ; CHECK-LABEL: f15:
136 ; CHECK: msfi %r2, -2147483647
137 ; CHECK: br %r14
138   %mul = mul i32 %a, -2147483647
139   ret i32 %mul
142 ; Check the next value down, which should use shifts.
143 define i32 @f16(i32 %a, i32 *%dest) {
144 ; CHECK-LABEL: f16:
145 ; CHECK: sll %r2, 31
146 ; CHECK-NOT: lcr
147 ; CHECK: br %r14
148   %mul = mul i32 %a, -2147483648
149   ret i32 %mul
152 ; Check the next value down again, which is treated as a positive value.
153 define i32 @f17(i32 %a, i32 *%dest) {
154 ; CHECK-LABEL: f17:
155 ; CHECK: msfi %r2, 2147483647
156 ; CHECK: br %r14
157   %mul = mul i32 %a, -2147483649
158   ret i32 %mul