dc1316e5e24f0b5f946f8f1baabc20145f3723dd
[oota-llvm.git] / test / CodeGen / PowerPC / fma-assoc.ll
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
4 define 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
23 define 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
42 define 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
61 define 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