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