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
4define double @test_FMADD_ASSOC1(double %A, double %B, double %C,
5                                 double %D, double %E) {
6	%F = fmul double %A, %B         ; <double> [#uses=1]
7	%G = fmul double %C, %D         ; <double> [#uses=1]
8	%H = fadd double %F, %G         ; <double> [#uses=1]
9	%I = fadd double %H, %E         ; <double> [#uses=1]
10	ret double %I
11; CHECK-LABEL: test_FMADD_ASSOC1:
12; CHECK: fmadd
13; CHECK-NEXT: fmadd
14; CHECK-NEXT: blr
15
16; CHECK-VSX-LABEL: test_FMADD_ASSOC1:
17; CHECK-VSX: xsmaddmdp
18; CHECK-VSX-NEXT: xsmaddadp
19; CHECK-VSX-NEXT: fmr
20; CHECK-VSX-NEXT: blr
21}
22
23define double @test_FMADD_ASSOC2(double %A, double %B, double %C,
24                                 double %D, double %E) {
25	%F = fmul double %A, %B         ; <double> [#uses=1]
26	%G = fmul double %C, %D         ; <double> [#uses=1]
27	%H = fadd double %F, %G         ; <double> [#uses=1]
28	%I = fadd double %E, %H         ; <double> [#uses=1]
29	ret double %I
30; CHECK-LABEL: test_FMADD_ASSOC2:
31; CHECK: fmadd
32; CHECK-NEXT: fmadd
33; CHECK-NEXT: blr
34
35; CHECK-VSX-LABEL: test_FMADD_ASSOC2:
36; CHECK-VSX: xsmaddmdp
37; CHECK-VSX-NEXT: xsmaddadp
38; CHECK-VSX-NEXT: fmr
39; CHECK-VSX-NEXT: blr
40}
41
42define double @test_FMSUB_ASSOC1(double %A, double %B, double %C,
43                                 double %D, double %E) {
44	%F = fmul double %A, %B         ; <double> [#uses=1]
45	%G = fmul double %C, %D         ; <double> [#uses=1]
46	%H = fadd double %F, %G         ; <double> [#uses=1]
47	%I = fsub double %H, %E         ; <double> [#uses=1]
48	ret double %I
49; CHECK-LABEL: test_FMSUB_ASSOC1:
50; CHECK: fmsub
51; CHECK-NEXT: fmadd
52; CHECK-NEXT: blr
53
54; CHECK-VSX-LABEL: test_FMSUB_ASSOC1:
55; CHECK-VSX: xsmsubmdp
56; CHECK-VSX-NEXT: xsmaddadp
57; CHECK-VSX-NEXT: fmr
58; CHECK-VSX-NEXT: blr
59}
60
61define double @test_FMSUB_ASSOC2(double %A, double %B, double %C,
62                                 double %D, double %E) {
63	%F = fmul double %A, %B         ; <double> [#uses=1]
64	%G = fmul double %C, %D         ; <double> [#uses=1]
65	%H = fadd double %F, %G         ; <double> [#uses=1]
66	%I = fsub double %E, %H         ; <double> [#uses=1]
67	ret double %I
68; CHECK-LABEL: test_FMSUB_ASSOC2:
69; CHECK: fnmsub
70; CHECK-NEXT: fnmsub
71; CHECK-NEXT: blr
72
73; CHECK-VSX-LABEL: test_FMSUB_ASSOC2:
74; CHECK-VSX: xsnmsubmdp
75; CHECK-VSX-NEXT: xsnmsubadp
76; CHECK-VSX-NEXT: fmr
77; CHECK-VSX-NEXT: blr
78}
79
80