[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-mul.ll
blobda978b49fff749c8909d4b0e112bc25af8a61bef
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=arm64-eabi | FileCheck %s
4 ; rdar://9296808
5 ; rdar://9349137
7 define i128 @t1(i64 %a, i64 %b) nounwind readnone ssp {
8 ; CHECK-LABEL: t1:
9 ; CHECK:       // %bb.0: // %entry
10 ; CHECK-NEXT:    mul x8, x0, x1
11 ; CHECK-NEXT:    umulh x1, x0, x1
12 ; CHECK-NEXT:    mov x0, x8
13 ; CHECK-NEXT:    ret
14 entry:
15   %tmp1 = zext i64 %a to i128
16   %tmp2 = zext i64 %b to i128
17   %tmp3 = mul i128 %tmp1, %tmp2
18   ret i128 %tmp3
21 define i128 @t2(i64 %a, i64 %b) nounwind readnone ssp {
22 ; CHECK-LABEL: t2:
23 ; CHECK:       // %bb.0: // %entry
24 ; CHECK-NEXT:    mul x8, x0, x1
25 ; CHECK-NEXT:    smulh x1, x0, x1
26 ; CHECK-NEXT:    mov x0, x8
27 ; CHECK-NEXT:    ret
28 entry:
29   %tmp1 = sext i64 %a to i128
30   %tmp2 = sext i64 %b to i128
31   %tmp3 = mul i128 %tmp1, %tmp2
32   ret i128 %tmp3
35 define i64 @t3(i32 %a, i32 %b) nounwind {
36 ; CHECK-LABEL: t3:
37 ; CHECK:       // %bb.0: // %entry
38 ; CHECK-NEXT:    umull x0, w0, w1
39 ; CHECK-NEXT:    ret
40 entry:
41   %tmp1 = zext i32 %a to i64
42   %tmp2 = zext i32 %b to i64
43   %tmp3 = mul i64 %tmp1, %tmp2
44   ret i64 %tmp3
47 define i64 @t4(i32 %a, i32 %b) nounwind {
48 ; CHECK-LABEL: t4:
49 ; CHECK:       // %bb.0: // %entry
50 ; CHECK-NEXT:    smull x0, w0, w1
51 ; CHECK-NEXT:    ret
52 entry:
53   %tmp1 = sext i32 %a to i64
54   %tmp2 = sext i32 %b to i64
55   %tmp3 = mul i64 %tmp1, %tmp2
56   ret i64 %tmp3
59 define i64 @t5(i32 %a, i32 %b, i64 %c) nounwind {
60 ; CHECK-LABEL: t5:
61 ; CHECK:       // %bb.0: // %entry
62 ; CHECK-NEXT:    umaddl x0, w0, w1, x2
63 ; CHECK-NEXT:    ret
64 entry:
65   %tmp1 = zext i32 %a to i64
66   %tmp2 = zext i32 %b to i64
67   %tmp3 = mul i64 %tmp1, %tmp2
68   %tmp4 = add i64 %c, %tmp3
69   ret i64 %tmp4
72 define i64 @t6(i32 %a, i32 %b, i64 %c) nounwind {
73 ; CHECK-LABEL: t6:
74 ; CHECK:       // %bb.0: // %entry
75 ; CHECK-NEXT:    smsubl x0, w0, w1, x2
76 ; CHECK-NEXT:    ret
77 entry:
78   %tmp1 = sext i32 %a to i64
79   %tmp2 = sext i32 %b to i64
80   %tmp3 = mul i64 %tmp1, %tmp2
81   %tmp4 = sub i64 %c, %tmp3
82   ret i64 %tmp4
85 define i64 @t7(i32 %a, i32 %b) nounwind {
86 ; CHECK-LABEL: t7:
87 ; CHECK:       // %bb.0: // %entry
88 ; CHECK-NEXT:    umnegl x0, w0, w1
89 ; CHECK-NEXT:    ret
90 entry:
91   %tmp1 = zext i32 %a to i64
92   %tmp2 = zext i32 %b to i64
93   %tmp3 = mul i64 %tmp1, %tmp2
94   %tmp4 = sub i64 0, %tmp3
95   ret i64 %tmp4
98 define i64 @t8(i32 %a, i32 %b) nounwind {
99 ; CHECK-LABEL: t8:
100 ; CHECK:       // %bb.0: // %entry
101 ; CHECK-NEXT:    smnegl x0, w0, w1
102 ; CHECK-NEXT:    ret
103 entry:
104   %tmp1 = sext i32 %a to i64
105   %tmp2 = sext i32 %b to i64
106   %tmp3 = mul i64 %tmp1, %tmp2
107   %tmp4 = sub i64 0, %tmp3
108   ret i64 %tmp4
111 define i64 @t9(i32 %a) nounwind {
112 ; CHECK-LABEL: t9:
113 ; CHECK:       // %bb.0: // %entry
114 ; CHECK-NEXT:    mov w8, #8896 // =0x22c0
115 ; CHECK-NEXT:    movk w8, #2, lsl #16
116 ; CHECK-NEXT:    umull x0, w0, w8
117 ; CHECK-NEXT:    ret
118 entry:
119   %tmp1 = zext i32 %a to i64
120   %tmp2 = mul i64 %tmp1, 139968
121   ret i64 %tmp2
124 ; Check 64-bit multiplication is used for constants > 32 bits.
125 define i64 @t10(i32 %a) nounwind {
126 ; CHECK-LABEL: t10:
127 ; CHECK:       // %bb.0: // %entry
128 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
129 ; CHECK-NEXT:    sxtw x8, w0
130 ; CHECK-NEXT:    mov w9, #2 // =0x2
131 ; CHECK-NEXT:    movk w9, #32768, lsl #16
132 ; CHECK-NEXT:    mul x0, x8, x9
133 ; CHECK-NEXT:    ret
134 entry:
135   %tmp1 = sext i32 %a to i64
136   %tmp2 = mul i64 %tmp1, 2147483650 ; = 2^31 + 2
137   ret i64 %tmp2
140 ; Check the sext_inreg case.
141 define i64 @t11(i64 %a) nounwind {
142 ; CHECK-LABEL: t11:
143 ; CHECK:       // %bb.0: // %entry
144 ; CHECK-NEXT:    mov w8, #29594 // =0x739a
145 ; CHECK-NEXT:    movk w8, #65499, lsl #16
146 ; CHECK-NEXT:    smnegl x0, w0, w8
147 ; CHECK-NEXT:    ret
148 entry:
149   %tmp1 = trunc i64 %a to i32
150   %tmp2 = sext i32 %tmp1 to i64
151   %tmp3 = mul i64 %tmp2, -2395238
152   %tmp4 = sub i64 0, %tmp3
153   ret i64 %tmp4
156 define i64 @t12(i64 %a, i64 %b) nounwind {
157 ; CHECK-LABEL: t12:
158 ; CHECK:       // %bb.0: // %entry
159 ; CHECK-NEXT:    mov w8, #35118 // =0x892e
160 ; CHECK-NEXT:    movk w8, #65008, lsl #16
161 ; CHECK-NEXT:    smaddl x0, w0, w8, x1
162 ; CHECK-NEXT:    ret
163 entry:
164   %tmp1 = trunc i64 %a to i32
165   %tmp2 = sext i32 %tmp1 to i64
166   %tmp3 = mul i64 %tmp2, -34567890
167   %tmp4 = add i64 %b, %tmp3
168   ret i64 %tmp4
171 define i64 @t13(i32 %a, i64 %b) nounwind {
172 ; CHECK-LABEL: t13:
173 ; CHECK:       // %bb.0: // %entry
174 ; CHECK-NEXT:    mov w8, #24910 // =0x614e
175 ; CHECK-NEXT:    movk w8, #188, lsl #16
176 ; CHECK-NEXT:    umsubl x0, w0, w8, x1
177 ; CHECK-NEXT:    ret
178 entry:
179   %tmp1 = zext i32 %a to i64
180   %tmp3 = mul i64 %tmp1, 12345678
181   %tmp4 = sub i64 %b, %tmp3
182   ret i64 %tmp4
185 define i64 @t14(i32 %a, i64 %b) nounwind {
186 ; CHECK-LABEL: t14:
187 ; CHECK:       // %bb.0: // %entry
188 ; CHECK-NEXT:    mov w8, #40626 // =0x9eb2
189 ; CHECK-NEXT:    movk w8, #65347, lsl #16
190 ; CHECK-NEXT:    smsubl x0, w0, w8, x1
191 ; CHECK-NEXT:    ret
192 entry:
193   %tmp1 = sext i32 %a to i64
194   %tmp3 = mul i64 %tmp1, -12345678
195   %tmp4 = sub i64 %b, %tmp3
196   ret i64 %tmp4