xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/dp-3source.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @test_madd32(i32 %val0, i32 %val1, i32 %val2) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_madd32:
5*9880d681SAndroid Build Coastguard Worker  %mid = mul i32 %val1, %val2
6*9880d681SAndroid Build Coastguard Worker  %res = add i32 %val0, %mid
7*9880d681SAndroid Build Coastguard Worker; CHECK: madd {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
8*9880d681SAndroid Build Coastguard Worker  ret i32 %res
9*9880d681SAndroid Build Coastguard Worker}
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine i64 @test_madd64(i64 %val0, i64 %val1, i64 %val2) {
12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_madd64:
13*9880d681SAndroid Build Coastguard Worker  %mid = mul i64 %val1, %val2
14*9880d681SAndroid Build Coastguard Worker  %res = add i64 %val0, %mid
15*9880d681SAndroid Build Coastguard Worker; CHECK: madd {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
16*9880d681SAndroid Build Coastguard Worker  ret i64 %res
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdefine i32 @test_msub32(i32 %val0, i32 %val1, i32 %val2) {
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_msub32:
21*9880d681SAndroid Build Coastguard Worker  %mid = mul i32 %val1, %val2
22*9880d681SAndroid Build Coastguard Worker  %res = sub i32 %val0, %mid
23*9880d681SAndroid Build Coastguard Worker; CHECK: msub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
24*9880d681SAndroid Build Coastguard Worker  ret i32 %res
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine i64 @test_msub64(i64 %val0, i64 %val1, i64 %val2) {
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_msub64:
29*9880d681SAndroid Build Coastguard Worker  %mid = mul i64 %val1, %val2
30*9880d681SAndroid Build Coastguard Worker  %res = sub i64 %val0, %mid
31*9880d681SAndroid Build Coastguard Worker; CHECK: msub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
32*9880d681SAndroid Build Coastguard Worker  ret i64 %res
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine i64 @test_smaddl(i64 %acc, i32 %val1, i32 %val2) {
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_smaddl:
37*9880d681SAndroid Build Coastguard Worker  %ext1 = sext i32 %val1 to i64
38*9880d681SAndroid Build Coastguard Worker  %ext2 = sext i32 %val2 to i64
39*9880d681SAndroid Build Coastguard Worker  %prod = mul i64 %ext1, %ext2
40*9880d681SAndroid Build Coastguard Worker  %res = add i64 %acc, %prod
41*9880d681SAndroid Build Coastguard Worker; CHECK: smaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
42*9880d681SAndroid Build Coastguard Worker  ret i64 %res
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine i64 @test_smsubl(i64 %acc, i32 %val1, i32 %val2) {
46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_smsubl:
47*9880d681SAndroid Build Coastguard Worker  %ext1 = sext i32 %val1 to i64
48*9880d681SAndroid Build Coastguard Worker  %ext2 = sext i32 %val2 to i64
49*9880d681SAndroid Build Coastguard Worker  %prod = mul i64 %ext1, %ext2
50*9880d681SAndroid Build Coastguard Worker  %res = sub i64 %acc, %prod
51*9880d681SAndroid Build Coastguard Worker; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
52*9880d681SAndroid Build Coastguard Worker  ret i64 %res
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdefine i64 @test_umaddl(i64 %acc, i32 %val1, i32 %val2) {
56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_umaddl:
57*9880d681SAndroid Build Coastguard Worker  %ext1 = zext i32 %val1 to i64
58*9880d681SAndroid Build Coastguard Worker  %ext2 = zext i32 %val2 to i64
59*9880d681SAndroid Build Coastguard Worker  %prod = mul i64 %ext1, %ext2
60*9880d681SAndroid Build Coastguard Worker  %res = add i64 %acc, %prod
61*9880d681SAndroid Build Coastguard Worker; CHECK: umaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
62*9880d681SAndroid Build Coastguard Worker  ret i64 %res
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine i64 @test_umsubl(i64 %acc, i32 %val1, i32 %val2) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_umsubl:
67*9880d681SAndroid Build Coastguard Worker  %ext1 = zext i32 %val1 to i64
68*9880d681SAndroid Build Coastguard Worker  %ext2 = zext i32 %val2 to i64
69*9880d681SAndroid Build Coastguard Worker  %prod = mul i64 %ext1, %ext2
70*9880d681SAndroid Build Coastguard Worker  %res = sub i64 %acc, %prod
71*9880d681SAndroid Build Coastguard Worker; CHECK: umsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
72*9880d681SAndroid Build Coastguard Worker  ret i64 %res
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdefine i64 @test_smulh(i64 %lhs, i64 %rhs) {
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_smulh:
77*9880d681SAndroid Build Coastguard Worker  %ext1 = sext i64 %lhs to i128
78*9880d681SAndroid Build Coastguard Worker  %ext2 = sext i64 %rhs to i128
79*9880d681SAndroid Build Coastguard Worker  %res = mul i128 %ext1, %ext2
80*9880d681SAndroid Build Coastguard Worker  %high = lshr i128 %res, 64
81*9880d681SAndroid Build Coastguard Worker  %val = trunc i128 %high to i64
82*9880d681SAndroid Build Coastguard Worker; CHECK: smulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
83*9880d681SAndroid Build Coastguard Worker  ret i64 %val
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdefine i64 @test_umulh(i64 %lhs, i64 %rhs) {
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_umulh:
88*9880d681SAndroid Build Coastguard Worker  %ext1 = zext i64 %lhs to i128
89*9880d681SAndroid Build Coastguard Worker  %ext2 = zext i64 %rhs to i128
90*9880d681SAndroid Build Coastguard Worker  %res = mul i128 %ext1, %ext2
91*9880d681SAndroid Build Coastguard Worker  %high = lshr i128 %res, 64
92*9880d681SAndroid Build Coastguard Worker  %val = trunc i128 %high to i64
93*9880d681SAndroid Build Coastguard Worker; CHECK: umulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
94*9880d681SAndroid Build Coastguard Worker  ret i64 %val
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine i32 @test_mul32(i32 %lhs, i32 %rhs) {
98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_mul32:
99*9880d681SAndroid Build Coastguard Worker  %res = mul i32 %lhs, %rhs
100*9880d681SAndroid Build Coastguard Worker; CHECK: mul {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
101*9880d681SAndroid Build Coastguard Worker  ret i32 %res
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerdefine i64 @test_mul64(i64 %lhs, i64 %rhs) {
105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_mul64:
106*9880d681SAndroid Build Coastguard Worker  %res = mul i64 %lhs, %rhs
107*9880d681SAndroid Build Coastguard Worker; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
108*9880d681SAndroid Build Coastguard Worker  ret i64 %res
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine i32 @test_mneg32(i32 %lhs, i32 %rhs) {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_mneg32:
113*9880d681SAndroid Build Coastguard Worker  %prod = mul i32 %lhs, %rhs
114*9880d681SAndroid Build Coastguard Worker  %res = sub i32 0, %prod
115*9880d681SAndroid Build Coastguard Worker; CHECK: mneg {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
116*9880d681SAndroid Build Coastguard Worker  ret i32 %res
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine i64 @test_mneg64(i64 %lhs, i64 %rhs) {
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_mneg64:
121*9880d681SAndroid Build Coastguard Worker  %prod = mul i64 %lhs, %rhs
122*9880d681SAndroid Build Coastguard Worker  %res = sub i64 0, %prod
123*9880d681SAndroid Build Coastguard Worker; CHECK: mneg {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
124*9880d681SAndroid Build Coastguard Worker  ret i64 %res
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerdefine i64 @test_smull(i32 %lhs, i32 %rhs) {
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_smull:
129*9880d681SAndroid Build Coastguard Worker  %ext1 = sext i32 %lhs to i64
130*9880d681SAndroid Build Coastguard Worker  %ext2 = sext i32 %rhs to i64
131*9880d681SAndroid Build Coastguard Worker  %res = mul i64 %ext1, %ext2
132*9880d681SAndroid Build Coastguard Worker; CHECK: smull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
133*9880d681SAndroid Build Coastguard Worker  ret i64 %res
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdefine i64 @test_umull(i32 %lhs, i32 %rhs) {
137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_umull:
138*9880d681SAndroid Build Coastguard Worker  %ext1 = zext i32 %lhs to i64
139*9880d681SAndroid Build Coastguard Worker  %ext2 = zext i32 %rhs to i64
140*9880d681SAndroid Build Coastguard Worker  %res = mul i64 %ext1, %ext2
141*9880d681SAndroid Build Coastguard Worker; CHECK: umull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
142*9880d681SAndroid Build Coastguard Worker  ret i64 %res
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine i64 @test_smnegl(i32 %lhs, i32 %rhs) {
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_smnegl:
147*9880d681SAndroid Build Coastguard Worker  %ext1 = sext i32 %lhs to i64
148*9880d681SAndroid Build Coastguard Worker  %ext2 = sext i32 %rhs to i64
149*9880d681SAndroid Build Coastguard Worker  %prod = mul i64 %ext1, %ext2
150*9880d681SAndroid Build Coastguard Worker  %res = sub i64 0, %prod
151*9880d681SAndroid Build Coastguard Worker; CHECK: smnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
152*9880d681SAndroid Build Coastguard Worker  ret i64 %res
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine i64 @test_umnegl(i32 %lhs, i32 %rhs) {
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_umnegl:
157*9880d681SAndroid Build Coastguard Worker  %ext1 = zext i32 %lhs to i64
158*9880d681SAndroid Build Coastguard Worker  %ext2 = zext i32 %rhs to i64
159*9880d681SAndroid Build Coastguard Worker  %prod = mul i64 %ext1, %ext2
160*9880d681SAndroid Build Coastguard Worker  %res = sub i64 0, %prod
161*9880d681SAndroid Build Coastguard Worker; CHECK: umnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
162*9880d681SAndroid Build Coastguard Worker  ret i64 %res
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker@a = common global i32 0, align 4
166*9880d681SAndroid Build Coastguard Worker@b = common global i32 0, align 4
167*9880d681SAndroid Build Coastguard Worker@c = common global i32 0, align 4
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Workerdefine void @test_mneg(){
170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_mneg:
171*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @a, align 4
172*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @b, align 4
173*9880d681SAndroid Build Coastguard Worker  %3 = sub i32 0, %1
174*9880d681SAndroid Build Coastguard Worker  %4 = mul i32 %2, %3
175*9880d681SAndroid Build Coastguard Worker  store i32 %4, i32* @c, align 4
176*9880d681SAndroid Build Coastguard Worker; CHECK: mneg {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
177*9880d681SAndroid Build Coastguard Worker  ret void
178*9880d681SAndroid Build Coastguard Worker}
179