1 ; RUN: llc < %s -march=aarch64 | FileCheck %s
3 ; Convert mul x, pow2 to shift.
4 ; Convert mul x, pow2 +/- 1 to shift + add/sub.
6 define i32 @test2(i32 %x) {
8 ; CHECK: lsl w0, w0, #1
10 %mul = shl nsw i32 %x, 1
14 define i32 @test3(i32 %x) {
16 ; CHECK: add w0, w0, w0, lsl #1
18 %mul = mul nsw i32 %x, 3
22 define i32 @test4(i32 %x) {
24 ; CHECK: lsl w0, w0, #2
26 %mul = shl nsw i32 %x, 2
30 define i32 @test5(i32 %x) {
32 ; CHECK: add w0, w0, w0, lsl #2
35 %mul = mul nsw i32 %x, 5
39 define i32 @test7(i32 %x) {
41 ; CHECK: lsl {{w[0-9]+}}, w0, #3
42 ; CHECK: sub w0, {{w[0-9]+}}, w0
44 %mul = mul nsw i32 %x, 7
48 define i32 @test8(i32 %x) {
50 ; CHECK: lsl w0, w0, #3
52 %mul = shl nsw i32 %x, 3
56 define i32 @test9(i32 %x) {
58 ; CHECK: add w0, w0, w0, lsl #3
60 %mul = mul nsw i32 %x, 9
64 ; Convert mul x, -pow2 to shift.
65 ; Convert mul x, -(pow2 +/- 1) to shift + add/sub.
67 define i32 @ntest2(i32 %x) {
69 ; CHECK: neg w0, w0, lsl #1
71 %mul = mul nsw i32 %x, -2
75 define i32 @ntest3(i32 %x) {
77 ; CHECK: add {{w[0-9]+}}, w0, w0, lsl #1
78 ; CHECK: neg w0, {{w[0-9]+}}
80 %mul = mul nsw i32 %x, -3
84 define i32 @ntest4(i32 %x) {
86 ; CHECK:neg w0, w0, lsl #2
88 %mul = mul nsw i32 %x, -4
92 define i32 @ntest5(i32 %x) {
94 ; CHECK: add {{w[0-9]+}}, w0, w0, lsl #2
95 ; CHECK: neg w0, {{w[0-9]+}}
96 %mul = mul nsw i32 %x, -5
100 define i32 @ntest7(i32 %x) {
101 ; CHECK-LABEL: ntest7
102 ; CHECK: sub w0, w0, w0, lsl #3
104 %mul = mul nsw i32 %x, -7
108 define i32 @ntest8(i32 %x) {
109 ; CHECK-LABEL: ntest8
110 ; CHECK: neg w0, w0, lsl #3
112 %mul = mul nsw i32 %x, -8
116 define i32 @ntest9(i32 %x) {
117 ; CHECK-LABEL: ntest9
118 ; CHECK: add {{w[0-9]+}}, w0, w0, lsl #3
119 ; CHECK: neg w0, {{w[0-9]+}}
121 %mul = mul nsw i32 %x, -9