[PowerPC] Disable +vsx RUN line for fma.ll due to inconsistency on other builders
[oota-llvm.git] / test / CodeGen / PowerPC / fma.ll
1 ; RUN: llc < %s -march=ppc32 -fp-contract=fast -mattr=-vsx | FileCheck %s
2 ; Following line disabled for now because some builders are generating
3 ; A forms instead of M forms.
4 ; R-U-N: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx | FileCheck -check-prefix=CHECK-VSX %s
5
6 declare double @dummy1(double) #0
7 declare double @dummy2(double, double) #0
8 declare double @dummy3(double, double, double) #0
9
10 define double @test_FMADD1(double %A, double %B, double %C) {
11         %D = fmul double %A, %B         ; <double> [#uses=1]
12         %E = fadd double %C, %D         ; <double> [#uses=1]
13         ret double %E
14 ; CHECK-LABEL: test_FMADD1:
15 ; CHECK: fmadd
16 ; CHECK-NEXT: blr
17
18 ; CHECK-VSX-LABEL: test_FMADD1:
19 ; CHECK-VSX: xsmaddmdp
20 ; CHECK-VSX-NEXT: blr
21 }
22
23 define double @test_FMADD2(double %A, double %B, double %C) {
24         %D = fmul double %A, %B         ; <double> [#uses=1]
25         %E = fadd double %D, %C         ; <double> [#uses=1]
26         ret double %E
27 ; CHECK-LABEL: test_FMADD2:
28 ; CHECK: fmadd
29 ; CHECK-NEXT: blr
30
31 ; CHECK-VSX-LABEL: test_FMADD2:
32 ; CHECK-VSX: xsmaddmdp
33 ; CHECK-VSX-NEXT: blr
34 }
35
36 define double @test_FMSUB1(double %A, double %B, double %C) {
37         %D = fmul double %A, %B         ; <double> [#uses=1]
38         %E = fsub double %D, %C         ; <double> [#uses=1]
39         ret double %E
40 ; CHECK-LABEL: test_FMSUB1:
41 ; CHECK: fmsub
42 ; CHECK-NEXT: blr
43
44 ; CHECK-VSX-LABEL: test_FMSUB1:
45 ; CHECK-VSX: xsmsubmdp
46 ; CHECK-VSX-NEXT: blr
47 }
48
49 define double @test_FMSUB2(double %A, double %B, double %C, double %D) {
50         %E = fmul double %A, %B         ; <double> [#uses=2]
51         %F = fadd double %E, %C         ; <double> [#uses=1]
52         %G = fsub double %E, %D         ; <double> [#uses=1]
53         %H = call double @dummy2(double %F, double %G)      ; <double> [#uses=1]
54         ret double %H
55 ; CHECK-LABEL: test_FMSUB2:
56 ; CHECK: fmadd
57 ; CHECK-NEXT: fmsub
58
59 ; CHECK-VSX-LABEL: test_FMSUB2:
60 ; CHECK-VSX: xsmaddadp
61 ; CHECK-VSX-NEXT: xsmsubmdp
62 }
63
64 define double @test_FNMADD1(double %A, double %B, double %C) {
65         %D = fmul double %A, %B         ; <double> [#uses=1]
66         %E = fadd double %D, %C         ; <double> [#uses=1]
67         %F = fsub double -0.000000e+00, %E              ; <double> [#uses=1]
68         ret double %F
69 ; CHECK-LABEL: test_FNMADD1:
70 ; CHECK: fnmadd
71 ; CHECK-NEXT: blr
72
73 ; CHECK-VSX-LABEL: test_FNMADD1:
74 ; CHECK-VSX: xsnmaddmdp
75 ; CHECK-VSX-NEXT: blr
76 }
77
78 define double @test_FNMADD2(double %A, double %B, double %C) {
79         %D = fmul double %A, %B         ; <double> [#uses=1]
80         %E = fadd double %C, %D         ; <double> [#uses=1]
81         %F = fsub double -0.000000e+00, %E              ; <double> [#uses=1]
82         ret double %F
83 ; CHECK-LABEL: test_FNMADD2:
84 ; CHECK: fnmadd
85 ; CHECK-NEXT: blr
86
87 ; CHECK-VSX-LABEL: test_FNMADD2:
88 ; CHECK-VSX: xsnmaddmdp
89 ; CHECK-VSX-NEXT: blr
90 }
91
92 define double @test_FNMSUB1(double %A, double %B, double %C) {
93         %D = fmul double %A, %B         ; <double> [#uses=1]
94         %E = fsub double %C, %D         ; <double> [#uses=1]
95         ret double %E
96 ; CHECK-LABEL: test_FNMSUB1:
97 ; CHECK: fnmsub
98 ; CHECK-NEXT: blr
99
100 ; CHECK-VSX-LABEL: test_FNMSUB1:
101 ; CHECK-VSX: xsnmsubmdp
102 }
103
104 define double @test_FNMSUB2(double %A, double %B, double %C) {
105         %D = fmul double %A, %B         ; <double> [#uses=1]
106         %E = fsub double %D, %C         ; <double> [#uses=1]
107         %F = fsub double -0.000000e+00, %E              ; <double> [#uses=1]
108         ret double %F
109 ; CHECK-LABEL: test_FNMSUB2:
110 ; CHECK: fnmsub
111 ; CHECK-NEXT: blr
112
113 ; CHECK-VSX-LABEL: test_FNMSUB2:
114 ; CHECK-VSX: xsnmsubmdp
115 ; CHECK-VSX-NEXT: blr
116 }
117
118 define float @test_FNMSUBS(float %A, float %B, float %C) {
119         %D = fmul float %A, %B          ; <float> [#uses=1]
120         %E = fsub float %D, %C          ; <float> [#uses=1]
121         %F = fsub float -0.000000e+00, %E               ; <float> [#uses=1]
122         ret float %F
123 ; CHECK-LABEL: test_FNMSUBS:
124 ; CHECK: fnmsubs
125 ; CHECK-NEXT: blr
126
127 ; CHECK-VSX-LABEL: test_FNMSUBS:
128 ; CHECK-VSX: fnmsubs
129 ; CHECK-VSX-NEXT: blr
130 }