xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/fp-dp3.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu -fp-contract=fast | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s -check-prefix=CHECK-NOFAST
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float, float, float)
5*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double, double, double)
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine float @test_fmadd(float %a, float %b, float %c) {
8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmadd:
9*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fmadd:
10*9880d681SAndroid Build Coastguard Worker  %val = call float @llvm.fma.f32(float %a, float %b, float %c)
11*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
12*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
13*9880d681SAndroid Build Coastguard Worker  ret float %val
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine float @test_fmsub(float %a, float %b, float %c) {
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmsub:
18*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fmsub:
19*9880d681SAndroid Build Coastguard Worker  %nega = fsub float -0.0, %a
20*9880d681SAndroid Build Coastguard Worker  %val = call float @llvm.fma.f32(float %nega, float %b, float %c)
21*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
22*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
23*9880d681SAndroid Build Coastguard Worker  ret float %val
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdefine float @test_fnmadd(float %a, float %b, float %c) {
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fnmadd:
28*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fnmadd:
29*9880d681SAndroid Build Coastguard Worker  %nega = fsub float -0.0, %a
30*9880d681SAndroid Build Coastguard Worker  %negc = fsub float -0.0, %c
31*9880d681SAndroid Build Coastguard Worker  %val = call float @llvm.fma.f32(float %nega, float %b, float %negc)
32*9880d681SAndroid Build Coastguard Worker; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
33*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
34*9880d681SAndroid Build Coastguard Worker  ret float %val
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine float @test_fnmsub(float %a, float %b, float %c) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fnmsub:
39*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fnmsub:
40*9880d681SAndroid Build Coastguard Worker  %negc = fsub float -0.0, %c
41*9880d681SAndroid Build Coastguard Worker  %val = call float @llvm.fma.f32(float %a, float %b, float %negc)
42*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
43*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
44*9880d681SAndroid Build Coastguard Worker  ret float %val
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine double @testd_fmadd(double %a, double %b, double %c) {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testd_fmadd:
49*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: testd_fmadd:
50*9880d681SAndroid Build Coastguard Worker  %val = call double @llvm.fma.f64(double %a, double %b, double %c)
51*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
52*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
53*9880d681SAndroid Build Coastguard Worker  ret double %val
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine double @testd_fmsub(double %a, double %b, double %c) {
57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testd_fmsub:
58*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: testd_fmsub:
59*9880d681SAndroid Build Coastguard Worker  %nega = fsub double -0.0, %a
60*9880d681SAndroid Build Coastguard Worker  %val = call double @llvm.fma.f64(double %nega, double %b, double %c)
61*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
62*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
63*9880d681SAndroid Build Coastguard Worker  ret double %val
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerdefine double @testd_fnmadd(double %a, double %b, double %c) {
67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testd_fnmadd:
68*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: testd_fnmadd:
69*9880d681SAndroid Build Coastguard Worker  %nega = fsub double -0.0, %a
70*9880d681SAndroid Build Coastguard Worker  %negc = fsub double -0.0, %c
71*9880d681SAndroid Build Coastguard Worker  %val = call double @llvm.fma.f64(double %nega, double %b, double %negc)
72*9880d681SAndroid Build Coastguard Worker; CHECK: fnmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
73*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fnmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
74*9880d681SAndroid Build Coastguard Worker  ret double %val
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine double @testd_fnmsub(double %a, double %b, double %c) {
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testd_fnmsub:
79*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: testd_fnmsub:
80*9880d681SAndroid Build Coastguard Worker  %negc = fsub double -0.0, %c
81*9880d681SAndroid Build Coastguard Worker  %val = call double @llvm.fma.f64(double %a, double %b, double %negc)
82*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
83*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fnmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}
84*9880d681SAndroid Build Coastguard Worker  ret double %val
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine float @test_fmadd_unfused(float %a, float %b, float %c) {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmadd_unfused:
89*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fmadd_unfused:
90*9880d681SAndroid Build Coastguard Worker  %prod = fmul float %b, %c
91*9880d681SAndroid Build Coastguard Worker  %sum = fadd float %a, %prod
92*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
93*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
94*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
95*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
96*9880d681SAndroid Build Coastguard Worker  ret float %sum
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine float @test_fmsub_unfused(float %a, float %b, float %c) {
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmsub_unfused:
101*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fmsub_unfused:
102*9880d681SAndroid Build Coastguard Worker  %prod = fmul float %b, %c
103*9880d681SAndroid Build Coastguard Worker  %diff = fsub float %a, %prod
104*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
105*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-NOT: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
106*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
107*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
108*9880d681SAndroid Build Coastguard Worker  ret float %diff
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine float @test_fnmadd_unfused(float %a, float %b, float %c) {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fnmadd_unfused:
113*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fnmadd_unfused:
114*9880d681SAndroid Build Coastguard Worker  %nega = fsub float -0.0, %a
115*9880d681SAndroid Build Coastguard Worker  %prod = fmul float %b, %c
116*9880d681SAndroid Build Coastguard Worker  %diff = fsub float %nega, %prod
117*9880d681SAndroid Build Coastguard Worker; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
118*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-NOT: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
119*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
120*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
121*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: ret
122*9880d681SAndroid Build Coastguard Worker  ret float %diff
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine float @test_fnmsub_unfused(float %a, float %b, float %c) {
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fnmsub_unfused:
127*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fnmsub_unfused:
128*9880d681SAndroid Build Coastguard Worker  %nega = fsub float -0.0, %a
129*9880d681SAndroid Build Coastguard Worker  %prod = fmul float %b, %c
130*9880d681SAndroid Build Coastguard Worker  %sum = fadd float %nega, %prod
131*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
132*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-NOT: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
133*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
134*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
135*9880d681SAndroid Build Coastguard Worker  ret float %sum
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; Another set of tests that check for multiply single use
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine float @test_fmadd_unfused_su(float %a, float %b, float %c) {
141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmadd_unfused_su:
142*9880d681SAndroid Build Coastguard Worker  %prod = fmul float %b, %c
143*9880d681SAndroid Build Coastguard Worker  %sum = fadd float %a, %prod
144*9880d681SAndroid Build Coastguard Worker  %res = fadd float %sum, %prod
145*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
146*9880d681SAndroid Build Coastguard Worker; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
147*9880d681SAndroid Build Coastguard Worker; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
148*9880d681SAndroid Build Coastguard Worker; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
149*9880d681SAndroid Build Coastguard Worker  ret float %res
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdefine float @test_fmsub_unfused_su(float %a, float %b, float %c) {
153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmsub_unfused_su:
154*9880d681SAndroid Build Coastguard Worker  %prod = fmul float %b, %c
155*9880d681SAndroid Build Coastguard Worker  %diff = fsub float %a, %prod
156*9880d681SAndroid Build Coastguard Worker  %res = fsub float %diff, %prod
157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
158*9880d681SAndroid Build Coastguard Worker; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
159*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
160*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
161*9880d681SAndroid Build Coastguard Worker  ret float %res
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164