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 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 | FileCheck -check-prefix=CHECK-P8 %s 4 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 | FileCheck -check-prefix=CHECK-P8 %s 5 6 declare double @dummy1(double) #0 7 declare double @dummy2(double, double) #0 8 declare double @dummy3(double, double, double) #0 9 declare float @dummy4(float, float) #0 10 11 define double @test_FMADD1(double %A, double %B, double %C) { 12 %D = fmul double %A, %B ; <double> [#uses=1] 13 %E = fadd double %C, %D ; <double> [#uses=1] 14 ret double %E 15 ; CHECK-LABEL: test_FMADD1: 16 ; CHECK: fmadd 17 ; CHECK-NEXT: blr 18 19 ; CHECK-VSX-LABEL: test_FMADD1: 20 ; CHECK-VSX: xsmaddmdp 21 ; CHECK-VSX-NEXT: blr 22 } 23 24 define double @test_FMADD2(double %A, double %B, double %C) { 25 %D = fmul double %A, %B ; <double> [#uses=1] 26 %E = fadd double %D, %C ; <double> [#uses=1] 27 ret double %E 28 ; CHECK-LABEL: test_FMADD2: 29 ; CHECK: fmadd 30 ; CHECK-NEXT: blr 31 32 ; CHECK-VSX-LABEL: test_FMADD2: 33 ; CHECK-VSX: xsmaddmdp 34 ; CHECK-VSX-NEXT: blr 35 } 36 37 define double @test_FMSUB1(double %A, double %B, double %C) { 38 %D = fmul double %A, %B ; <double> [#uses=1] 39 %E = fsub double %D, %C ; <double> [#uses=1] 40 ret double %E 41 ; CHECK-LABEL: test_FMSUB1: 42 ; CHECK: fmsub 43 ; CHECK-NEXT: blr 44 45 ; CHECK-VSX-LABEL: test_FMSUB1: 46 ; CHECK-VSX: xsmsubmdp 47 ; CHECK-VSX-NEXT: blr 48 } 49 50 define double @test_FMSUB2(double %A, double %B, double %C, double %D) { 51 %E = fmul double %A, %B ; <double> [#uses=2] 52 %F = fadd double %E, %C ; <double> [#uses=1] 53 %G = fsub double %E, %D ; <double> [#uses=1] 54 %H = call double @dummy2(double %F, double %G) ; <double> [#uses=1] 55 ret double %H 56 ; CHECK-LABEL: test_FMSUB2: 57 ; CHECK: fmadd 58 ; CHECK-NEXT: fmsub 59 60 ; CHECK-VSX-LABEL: test_FMSUB2: 61 ; CHECK-VSX: xsmaddadp 62 ; CHECK-VSX-NEXT: xsmsubmdp 63 } 64 65 define double @test_FNMADD1(double %A, double %B, double %C) { 66 %D = fmul double %A, %B ; <double> [#uses=1] 67 %E = fadd double %D, %C ; <double> [#uses=1] 68 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1] 69 ret double %F 70 ; CHECK-LABEL: test_FNMADD1: 71 ; CHECK: fnmadd 72 ; CHECK-NEXT: blr 73 74 ; CHECK-VSX-LABEL: test_FNMADD1: 75 ; CHECK-VSX: xsnmaddmdp 76 ; CHECK-VSX-NEXT: blr 77 } 78 79 define double @test_FNMADD2(double %A, double %B, double %C) { 80 %D = fmul double %A, %B ; <double> [#uses=1] 81 %E = fadd double %C, %D ; <double> [#uses=1] 82 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1] 83 ret double %F 84 ; CHECK-LABEL: test_FNMADD2: 85 ; CHECK: fnmadd 86 ; CHECK-NEXT: blr 87 88 ; CHECK-VSX-LABEL: test_FNMADD2: 89 ; CHECK-VSX: xsnmaddmdp 90 ; CHECK-VSX-NEXT: blr 91 } 92 93 define double @test_FNMSUB1(double %A, double %B, double %C) { 94 %D = fmul double %A, %B ; <double> [#uses=1] 95 %E = fsub double %C, %D ; <double> [#uses=1] 96 ret double %E 97 ; CHECK-LABEL: test_FNMSUB1: 98 ; CHECK: fnmsub 99 ; CHECK-NEXT: blr 100 101 ; CHECK-VSX-LABEL: test_FNMSUB1: 102 ; CHECK-VSX: xsnmsubmdp 103 } 104 105 define double @test_FNMSUB2(double %A, double %B, double %C) { 106 %D = fmul double %A, %B ; <double> [#uses=1] 107 %E = fsub double %D, %C ; <double> [#uses=1] 108 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1] 109 ret double %F 110 ; CHECK-LABEL: test_FNMSUB2: 111 ; CHECK: fnmsub 112 ; CHECK-NEXT: blr 113 114 ; CHECK-VSX-LABEL: test_FNMSUB2: 115 ; CHECK-VSX: xsnmsubmdp 116 ; CHECK-VSX-NEXT: blr 117 } 118 119 define float @test_FNMSUBS(float %A, float %B, float %C) { 120 %D = fmul float %A, %B ; <float> [#uses=1] 121 %E = fsub float %D, %C ; <float> [#uses=1] 122 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 123 ret float %F 124 ; CHECK-LABEL: test_FNMSUBS: 125 ; CHECK: fnmsubs 126 ; CHECK-NEXT: blr 127 128 ; CHECK-VSX-LABEL: test_FNMSUBS: 129 ; CHECK-VSX: fnmsubs 130 ; CHECK-VSX-NEXT: blr 131 } 132 133 define float @test_XSMADDMSP(float %A, float %B, float %C) { 134 %D = fmul float %A, %B ; <float> [#uses=1] 135 %E = fadd float %C, %D ; <float> [#uses=1] 136 ret float %E 137 ; CHECK-P8-LABEL: test_XSMADDMSP: 138 ; CHECK-P8: xsmaddmsp 139 ; CHECK-P8-NEXT: blr 140 } 141 142 define float @test_XSMSUBMSP(float %A, float %B, float %C) { 143 %D = fmul float %A, %B ; <float> [#uses=1] 144 %E = fsub float %D, %C ; <float> [#uses=1] 145 ret float %E 146 ; CHECK-P8-LABEL: test_XSMSUBMSP: 147 ; CHECK-P8: xsmsubmsp 148 ; CHECK-P8-NEXT: blr 149 } 150 151 define float @test_XSMADDASP(float %A, float %B, float %C, float %D) { 152 %E = fmul float %A, %B ; <float> [#uses=2] 153 %F = fadd float %E, %C ; <float> [#uses=1] 154 %G = fsub float %E, %D ; <float> [#uses=1] 155 %H = call float @dummy4(float %F, float %G) ; <float> [#uses=1] 156 ret float %H 157 ; CHECK-P8-LABEL: test_XSMADDASP: 158 ; CHECK-P8: xsmaddasp 159 ; CHECK-P8-NEXT: xsmsubmsp 160 } 161 162 define float @test_XSMSUBASP(float %A, float %B, float %C, float %D) { 163 %E = fmul float %A, %B ; <float> [#uses=2] 164 %F = fsub float %E, %C ; <float> [#uses=1] 165 %G = fsub float %E, %D ; <float> [#uses=1] 166 %H = call float @dummy4(float %F, float %G) ; <float> [#uses=1] 167 ret float %H 168 ; CHECK-P8-LABEL: test_XSMSUBASP: 169 ; CHECK-P8: xsmsubasp 170 ; CHECK-P8-NEXT: xsmsubmsp 171 } 172 173 define float @test_XSNMADDMSP(float %A, float %B, float %C) { 174 %D = fmul float %A, %B ; <float> [#uses=1] 175 %E = fadd float %D, %C ; <float> [#uses=1] 176 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 177 ret float %F 178 ; CHECK-P8-LABEL: test_XSNMADDMSP: 179 ; CHECK-P8: xsnmaddmsp 180 ; CHECK-P8-NEXT: blr 181 } 182 183 define float @test_XSNMSUBMSP(float %A, float %B, float %C) { 184 %D = fmul float %A, %B ; <float> [#uses=1] 185 %E = fsub float %D, %C ; <float> [#uses=1] 186 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 187 ret float %F 188 ; CHECK-P8-LABEL: test_XSNMSUBMSP: 189 ; CHECK-P8: xsnmsubmsp 190 ; CHECK-P8-NEXT: blr 191 } 192 193 define float @test_XSNMADDASP(float %A, float %B, float %C) { 194 %D = fmul float %A, %B ; <float> [#uses=1] 195 %E = fadd float %D, %C ; <float> [#uses=1] 196 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 197 %H = call float @dummy4(float %E, float %F) ; <float> [#uses=1] 198 ret float %F 199 ; CHECK-P8-LABEL: test_XSNMADDASP: 200 ; CHECK-P8: xsnmaddasp 201 } 202 203 define float @test_XSNMSUBASP(float %A, float %B, float %C) { 204 %D = fmul float %A, %B ; <float> [#uses=1] 205 %E = fsub float %D, %C ; <float> [#uses=1] 206 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1] 207 %H = call float @dummy4(float %E, float %F) ; <float> [#uses=1] 208 ret float %F 209 ; CHECK-P8-LABEL: test_XSNMSUBASP: 210 ; CHECK-P8: xsnmsubasp 211 } 212