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