xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/fmacs.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+vfp2 %s -o - | FileCheck %s -check-prefix=VFP2
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s -check-prefix=NEON
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s -check-prefix=A8
4*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a9 %s -o - | FileCheck %s -check-prefix=A9
5*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-linux-gnueabi -mcpu=cortex-a9 -float-abi=hard %s -o - | FileCheck %s -check-prefix=HARD
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine float @t1(float %acc, float %a, float %b) {
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker; VFP2-LABEL: t1:
10*9880d681SAndroid Build Coastguard Worker; VFP2: vmla.f32
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; NEON-LABEL: t1:
13*9880d681SAndroid Build Coastguard Worker; NEON: vmla.f32
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t1:
16*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32
17*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32
18*9880d681SAndroid Build Coastguard Worker	%0 = fmul float %a, %b
19*9880d681SAndroid Build Coastguard Worker        %1 = fadd float %acc, %0
20*9880d681SAndroid Build Coastguard Worker	ret float %1
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine double @t2(double %acc, double %a, double %b) {
24*9880d681SAndroid Build Coastguard Workerentry:
25*9880d681SAndroid Build Coastguard Worker; VFP2-LABEL: t2:
26*9880d681SAndroid Build Coastguard Worker; VFP2: vmla.f64
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; NEON-LABEL: t2:
29*9880d681SAndroid Build Coastguard Worker; NEON: vmla.f64
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t2:
32*9880d681SAndroid Build Coastguard Worker; A8: vmul.f64
33*9880d681SAndroid Build Coastguard Worker; A8: vadd.f64
34*9880d681SAndroid Build Coastguard Worker	%0 = fmul double %a, %b
35*9880d681SAndroid Build Coastguard Worker        %1 = fadd double %acc, %0
36*9880d681SAndroid Build Coastguard Worker	ret double %1
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine float @t3(float %acc, float %a, float %b) {
40*9880d681SAndroid Build Coastguard Workerentry:
41*9880d681SAndroid Build Coastguard Worker; VFP2-LABEL: t3:
42*9880d681SAndroid Build Coastguard Worker; VFP2: vmla.f32
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; NEON-LABEL: t3:
45*9880d681SAndroid Build Coastguard Worker; NEON: vmla.f32
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t3:
48*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32
49*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32
50*9880d681SAndroid Build Coastguard Worker	%0 = fmul float %a, %b
51*9880d681SAndroid Build Coastguard Worker        %1 = fadd float %0, %acc
52*9880d681SAndroid Build Coastguard Worker	ret float %1
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; It's possible to make use of fp vmla / vmls on Cortex-A9.
56*9880d681SAndroid Build Coastguard Worker; rdar://8659675
57*9880d681SAndroid Build Coastguard Workerdefine void @t4(float %acc1, float %a, float %b, float %acc2, float %c, float* %P1, float* %P2) {
58*9880d681SAndroid Build Coastguard Workerentry:
59*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t4:
60*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32
61*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32
62*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32
63*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker; Two vmla with now RAW hazard
66*9880d681SAndroid Build Coastguard Worker; A9-LABEL: t4:
67*9880d681SAndroid Build Coastguard Worker; A9: vmla.f32
68*9880d681SAndroid Build Coastguard Worker; A9: vmla.f32
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker; HARD-LABEL: t4:
71*9880d681SAndroid Build Coastguard Worker; HARD: vmla.f32 s0, s1, s2
72*9880d681SAndroid Build Coastguard Worker; HARD: vmla.f32 s3, s1, s4
73*9880d681SAndroid Build Coastguard Worker  %0 = fmul float %a, %b
74*9880d681SAndroid Build Coastguard Worker  %1 = fadd float %acc1, %0
75*9880d681SAndroid Build Coastguard Worker  %2 = fmul float %a, %c
76*9880d681SAndroid Build Coastguard Worker  %3 = fadd float %acc2, %2
77*9880d681SAndroid Build Coastguard Worker  store float %1, float* %P1
78*9880d681SAndroid Build Coastguard Worker  store float %3, float* %P2
79*9880d681SAndroid Build Coastguard Worker  ret void
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine float @t5(float %a, float %b, float %c, float %d, float %e) {
83*9880d681SAndroid Build Coastguard Workerentry:
84*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t5:
85*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32
86*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32
87*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32
88*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; A9-LABEL: t5:
91*9880d681SAndroid Build Coastguard Worker; A9: vmla.f32
92*9880d681SAndroid Build Coastguard Worker; A9: vmul.f32
93*9880d681SAndroid Build Coastguard Worker; A9: vadd.f32
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; HARD-LABEL: t5:
96*9880d681SAndroid Build Coastguard Worker; HARD: vmla.f32 s4, s0, s1
97*9880d681SAndroid Build Coastguard Worker; HARD: vmul.f32 s0, s2, s3
98*9880d681SAndroid Build Coastguard Worker; HARD: vadd.f32 s0, s4, s0
99*9880d681SAndroid Build Coastguard Worker  %0 = fmul float %a, %b
100*9880d681SAndroid Build Coastguard Worker  %1 = fadd float %e, %0
101*9880d681SAndroid Build Coastguard Worker  %2 = fmul float %c, %d
102*9880d681SAndroid Build Coastguard Worker  %3 = fadd float %1, %2
103*9880d681SAndroid Build Coastguard Worker  ret float %3
104*9880d681SAndroid Build Coastguard Worker}
105