[AArch64] Fix bug in prolog clobbering live reg when shrink wrapping.
[oota-llvm.git] / test / CodeGen / AArch64 / dp2.ll
1 ; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64 | FileCheck %s
2
3 @var32_0 = global i32 0
4 @var32_1 = global i32 0
5 @var64_0 = global i64 0
6 @var64_1 = global i64 0
7
8 define void @rorv_i64() {
9 ; CHECK-LABEL: rorv_i64:
10     %val0_tmp = load i64, i64* @var64_0
11     %val1_tmp = load i64, i64* @var64_1
12     %val2_tmp = sub i64 64, %val1_tmp
13     %val3_tmp = shl i64 %val0_tmp, %val2_tmp
14     %val4_tmp = lshr i64 %val0_tmp, %val1_tmp
15     %val5_tmp = or i64 %val3_tmp, %val4_tmp
16 ; CHECK: {{ror|rorv}} {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
17     store volatile i64 %val5_tmp, i64* @var64_0
18     ret void
19 }
20
21 define void @asrv_i64() {
22 ; CHECK-LABEL: asrv_i64:
23     %val0_tmp = load i64, i64* @var64_0
24     %val1_tmp = load i64, i64* @var64_1
25     %val4_tmp = ashr i64 %val0_tmp, %val1_tmp
26 ; CHECK: {{asr|asrv}} {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
27     store volatile i64 %val4_tmp, i64* @var64_1
28     ret void
29 }
30
31 define void @lsrv_i64() {
32 ; CHECK-LABEL: lsrv_i64:
33     %val0_tmp = load i64, i64* @var64_0
34     %val1_tmp = load i64, i64* @var64_1
35     %val4_tmp = lshr i64 %val0_tmp, %val1_tmp
36 ; CHECK: {{lsr|lsrv}} {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
37     store volatile i64 %val4_tmp, i64* @var64_0
38     ret void
39 }
40
41 define void @lslv_i64() {
42 ; CHECK-LABEL: lslv_i64:
43     %val0_tmp = load i64, i64* @var64_0
44     %val1_tmp = load i64, i64* @var64_1
45     %val4_tmp = shl i64 %val0_tmp, %val1_tmp
46 ; CHECK: {{lsl|lslv}} {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
47     store volatile i64 %val4_tmp, i64* @var64_1
48     ret void
49 }
50
51 define void @udiv_i64() {
52 ; CHECK-LABEL: udiv_i64:
53     %val0_tmp = load i64, i64* @var64_0
54     %val1_tmp = load i64, i64* @var64_1
55     %val4_tmp = udiv i64 %val0_tmp, %val1_tmp
56 ; CHECK: udiv   {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
57     store volatile i64 %val4_tmp, i64* @var64_0
58     ret void
59 }
60
61 define void @sdiv_i64() {
62 ; CHECK-LABEL: sdiv_i64:
63     %val0_tmp = load i64, i64* @var64_0
64     %val1_tmp = load i64, i64* @var64_1
65     %val4_tmp = sdiv i64 %val0_tmp, %val1_tmp
66 ; CHECK: sdiv   {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
67     store volatile i64 %val4_tmp, i64* @var64_1
68     ret void
69 }
70
71
72 define void @lsrv_i32() {
73 ; CHECK-LABEL: lsrv_i32:
74     %val0_tmp = load i32, i32* @var32_0
75     %val1_tmp = load i32, i32* @var32_1
76     %val2_tmp = add i32 1, %val1_tmp
77     %val4_tmp = lshr i32 %val0_tmp, %val2_tmp
78 ; CHECK: {{lsr|lsrv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
79     store volatile i32 %val4_tmp, i32* @var32_0
80     ret void
81 }
82
83 define void @lslv_i32() {
84 ; CHECK-LABEL: lslv_i32:
85     %val0_tmp = load i32, i32* @var32_0
86     %val1_tmp = load i32, i32* @var32_1
87     %val2_tmp = add i32 1, %val1_tmp
88     %val4_tmp = shl i32 %val0_tmp, %val2_tmp
89 ; CHECK: {{lsl|lslv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
90     store volatile i32 %val4_tmp, i32* @var32_1
91     ret void
92 }
93
94 define void @rorv_i32() {
95 ; CHECK-LABEL: rorv_i32:
96     %val0_tmp = load i32, i32* @var32_0
97     %val6_tmp = load i32, i32* @var32_1
98     %val1_tmp = add i32 1, %val6_tmp
99     %val2_tmp = sub i32 32, %val1_tmp
100     %val3_tmp = shl i32 %val0_tmp, %val2_tmp
101     %val4_tmp = lshr i32 %val0_tmp, %val1_tmp
102     %val5_tmp = or i32 %val3_tmp, %val4_tmp
103 ; CHECK: {{ror|rorv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
104     store volatile i32 %val5_tmp, i32* @var32_0
105     ret void
106 }
107
108 define void @asrv_i32() {
109 ; CHECK-LABEL: asrv_i32:
110     %val0_tmp = load i32, i32* @var32_0
111     %val1_tmp = load i32, i32* @var32_1
112     %val2_tmp = add i32 1, %val1_tmp
113     %val4_tmp = ashr i32 %val0_tmp, %val2_tmp
114 ; CHECK: {{asr|asrv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
115     store volatile i32 %val4_tmp, i32* @var32_1
116     ret void
117 }
118
119 define void @sdiv_i32() {
120 ; CHECK-LABEL: sdiv_i32:
121     %val0_tmp = load i32, i32* @var32_0
122     %val1_tmp = load i32, i32* @var32_1
123     %val4_tmp = sdiv i32 %val0_tmp, %val1_tmp
124 ; CHECK: sdiv   {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
125     store volatile i32 %val4_tmp, i32* @var32_1
126     ret void
127 }
128
129 define void @udiv_i32() {
130 ; CHECK-LABEL: udiv_i32:
131     %val0_tmp = load i32, i32* @var32_0
132     %val1_tmp = load i32, i32* @var32_1
133     %val4_tmp = udiv i32 %val0_tmp, %val1_tmp
134 ; CHECK: udiv   {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
135     store volatile i32 %val4_tmp, i32* @var32_0
136     ret void
137 }
138
139 ; The point of this test is that we may not actually see (shl GPR32:$Val, (zext GPR32:$Val2))
140 ; in the DAG (the RHS may be natively 64-bit), but we should still use the lsl instructions.
141 define i32 @test_lsl32() {
142 ; CHECK-LABEL: test_lsl32:
143
144   %val = load i32, i32* @var32_0
145   %ret = shl i32 1, %val
146 ; CHECK: {{lsl|lslv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
147
148   ret i32 %ret
149 }
150
151 define i32 @test_lsr32() {
152 ; CHECK-LABEL: test_lsr32:
153
154   %val = load i32, i32* @var32_0
155   %ret = lshr i32 1, %val
156 ; CHECK: {{lsr|lsrv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
157
158   ret i32 %ret
159 }
160
161 define i32 @test_asr32(i32 %in) {
162 ; CHECK-LABEL: test_asr32:
163
164   %val = load i32, i32* @var32_0
165   %ret = ashr i32 %in, %val
166 ; CHECK: {{asr|asrv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
167
168   ret i32 %ret
169 }