[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / AArch64 / arm64-mul.ll
blobd01b05210187ba180c91033e8cfcde656f2a8104
1 ; RUN: llc < %s -mtriple=arm64-eabi | FileCheck %s
3 ; rdar://9296808
4 ; rdar://9349137
6 define i128 @t1(i64 %a, i64 %b) nounwind readnone ssp {
7 entry:
8 ; CHECK-LABEL: t1:
9 ; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
10 ; CHECK: umulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
11   %tmp1 = zext i64 %a to i128
12   %tmp2 = zext i64 %b to i128
13   %tmp3 = mul i128 %tmp1, %tmp2
14   ret i128 %tmp3
17 define i128 @t2(i64 %a, i64 %b) nounwind readnone ssp {
18 entry:
19 ; CHECK-LABEL: t2:
20 ; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
21 ; CHECK: smulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
22   %tmp1 = sext i64 %a to i128
23   %tmp2 = sext i64 %b to i128
24   %tmp3 = mul i128 %tmp1, %tmp2
25   ret i128 %tmp3
28 define i64 @t3(i32 %a, i32 %b) nounwind {
29 entry:
30 ; CHECK-LABEL: t3:
31 ; CHECK: umull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
32   %tmp1 = zext i32 %a to i64
33   %tmp2 = zext i32 %b to i64
34   %tmp3 = mul i64 %tmp1, %tmp2
35   ret i64 %tmp3
38 define i64 @t4(i32 %a, i32 %b) nounwind {
39 entry:
40 ; CHECK-LABEL: t4:
41 ; CHECK: smull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
42   %tmp1 = sext i32 %a to i64
43   %tmp2 = sext i32 %b to i64
44   %tmp3 = mul i64 %tmp1, %tmp2
45   ret i64 %tmp3
48 define i64 @t5(i32 %a, i32 %b, i64 %c) nounwind {
49 entry:
50 ; CHECK-LABEL: t5:
51 ; CHECK: umaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
52   %tmp1 = zext i32 %a to i64
53   %tmp2 = zext i32 %b to i64
54   %tmp3 = mul i64 %tmp1, %tmp2
55   %tmp4 = add i64 %c, %tmp3
56   ret i64 %tmp4
59 define i64 @t6(i32 %a, i32 %b, i64 %c) nounwind {
60 entry:
61 ; CHECK-LABEL: t6:
62 ; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
63   %tmp1 = sext i32 %a to i64
64   %tmp2 = sext i32 %b to i64
65   %tmp3 = mul i64 %tmp1, %tmp2
66   %tmp4 = sub i64 %c, %tmp3
67   ret i64 %tmp4
70 define i64 @t7(i32 %a, i32 %b) nounwind {
71 entry:
72 ; CHECK-LABEL: t7:
73 ; CHECK: umnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
74   %tmp1 = zext i32 %a to i64
75   %tmp2 = zext i32 %b to i64
76   %tmp3 = mul i64 %tmp1, %tmp2
77   %tmp4 = sub i64 0, %tmp3
78   ret i64 %tmp4
81 define i64 @t8(i32 %a, i32 %b) nounwind {
82 entry:
83 ; CHECK-LABEL: t8:
84 ; CHECK: smnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
85   %tmp1 = sext i32 %a to i64
86   %tmp2 = sext i32 %b to i64
87   %tmp3 = mul i64 %tmp1, %tmp2
88   %tmp4 = sub i64 0, %tmp3
89   ret i64 %tmp4
92 define i64 @t9(i32 %a) nounwind {
93 entry:
94 ; CHECK-LABEL: t9:
95 ; CHECK: umull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
96   %tmp1 = zext i32 %a to i64
97   %tmp2 = mul i64 %tmp1, 139968
98   ret i64 %tmp2
101 ; Check 64-bit multiplication is used for constants > 32 bits.
102 define i64 @t10(i32 %a) nounwind {
103 entry:
104 ; CHECK-LABEL: t10:
105 ; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
106   %tmp1 = sext i32 %a to i64
107   %tmp2 = mul i64 %tmp1, 2147483650 ; = 2^31 + 2
108   ret i64 %tmp2
111 ; Check the sext_inreg case.
112 define i64 @t11(i64 %a) nounwind {
113 entry:
114 ; CHECK-LABEL: t11:
115 ; CHECK: smnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
116   %tmp1 = trunc i64 %a to i32
117   %tmp2 = sext i32 %tmp1 to i64
118   %tmp3 = mul i64 %tmp2, -2395238
119   %tmp4 = sub i64 0, %tmp3
120   ret i64 %tmp4
123 define i64 @t12(i64 %a, i64 %b) nounwind {
124 entry:
125 ; CHECK-LABEL: t12:
126 ; CHECK: smaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
127   %tmp1 = trunc i64 %a to i32
128   %tmp2 = sext i32 %tmp1 to i64
129   %tmp3 = mul i64 %tmp2, -34567890
130   %tmp4 = add i64 %b, %tmp3
131   ret i64 %tmp4
134 define i64 @t13(i32 %a, i64 %b) nounwind {
135 entry:
136 ; CHECK-LABEL: t13:
137 ; CHECK: umsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
138   %tmp1 = zext i32 %a to i64
139   %tmp3 = mul i64 %tmp1, 12345678
140   %tmp4 = sub i64 %b, %tmp3
141   ret i64 %tmp4
144 define i64 @t14(i32 %a, i64 %b) nounwind {
145 entry:
146 ; CHECK-LABEL: t14:
147 ; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
148   %tmp1 = sext i32 %a to i64
149   %tmp3 = mul i64 %tmp1, -12345678
150   %tmp4 = sub i64 %b, %tmp3
151   ret i64 %tmp4