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
6 declare double @dummy1(double) #0
7 declare double @dummy2(double, double) #0
8 declare double @dummy3(double, double, double) #0
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]
14 ; CHECK-LABEL: test_FMADD1:
18 ; CHECK-VSX-LABEL: test_FMADD1:
19 ; CHECK-VSX: xsmaddmdp
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]
27 ; CHECK-LABEL: test_FMADD2:
31 ; CHECK-VSX-LABEL: test_FMADD2:
32 ; CHECK-VSX: xsmaddmdp
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]
40 ; CHECK-LABEL: test_FMSUB1:
44 ; CHECK-VSX-LABEL: test_FMSUB1:
45 ; CHECK-VSX: xsmsubmdp
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]
55 ; CHECK-LABEL: test_FMSUB2:
59 ; CHECK-VSX-LABEL: test_FMSUB2:
60 ; CHECK-VSX: xsmaddadp
61 ; CHECK-VSX-NEXT: xsmsubmdp
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]
69 ; CHECK-LABEL: test_FNMADD1:
73 ; CHECK-VSX-LABEL: test_FNMADD1:
74 ; CHECK-VSX: xsnmaddmdp
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]
83 ; CHECK-LABEL: test_FNMADD2:
87 ; CHECK-VSX-LABEL: test_FNMADD2:
88 ; CHECK-VSX: xsnmaddmdp
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]
96 ; CHECK-LABEL: test_FNMSUB1:
100 ; CHECK-VSX-LABEL: test_FNMSUB1:
101 ; CHECK-VSX: xsnmsubmdp
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]
109 ; CHECK-LABEL: test_FNMSUB2:
113 ; CHECK-VSX-LABEL: test_FNMSUB2:
114 ; CHECK-VSX: xsnmsubmdp
115 ; CHECK-VSX-NEXT: blr
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]
123 ; CHECK-LABEL: test_FNMSUBS:
127 ; CHECK-VSX-LABEL: test_FNMSUBS:
129 ; CHECK-VSX-NEXT: blr