233 lines · plain
1; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -fp-contract=fast -mattr=-vsx -disable-ppc-vsx-fma-mutation=false | FileCheck %s2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-VSX %s3; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-P8 %s4; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 -disable-ppc-vsx-fma-mutation=false | FileCheck -check-prefix=CHECK-P8 %s5 6declare double @dummy1(double) #07declare double @dummy2(double, double) #08declare double @dummy3(double, double, double) #09declare float @dummy4(float, float) #010 11define 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 %E15; CHECK-LABEL: test_FMADD1:16; CHECK: fmadd17; CHECK-NEXT: blr18 19; CHECK-VSX-LABEL: test_FMADD1:20; CHECK-VSX: xsmaddmdp21; CHECK-VSX-NEXT: blr22}23 24define 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 %E28; CHECK-LABEL: test_FMADD2:29; CHECK: fmadd30; CHECK-NEXT: blr31 32; CHECK-VSX-LABEL: test_FMADD2:33; CHECK-VSX: xsmaddmdp34; CHECK-VSX-NEXT: blr35}36 37define 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 %E41; CHECK-LABEL: test_FMSUB1:42; CHECK: fmsub43; CHECK-NEXT: blr44 45; CHECK-VSX-LABEL: test_FMSUB1:46; CHECK-VSX: xsmsubmdp47; CHECK-VSX-NEXT: blr48}49 50define 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 %H56; CHECK-LABEL: test_FMSUB2:57; CHECK: fmadd58; CHECK-NEXT: fmsub59 60; CHECK-VSX-LABEL: test_FMSUB2:61; CHECK-VSX: xsmaddadp62; CHECK-VSX-NEXT: xsmsubmdp63}64 65define 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 %F70; CHECK-LABEL: test_FNMADD1:71; CHECK: fnmadd72; CHECK-NEXT: blr73 74; CHECK-VSX-LABEL: test_FNMADD1:75; CHECK-VSX: xsnmaddmdp76; CHECK-VSX-NEXT: blr77}78 79define 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 %F84; CHECK-LABEL: test_FNMADD2:85; CHECK: fnmadd86; CHECK-NEXT: blr87 88; CHECK-VSX-LABEL: test_FNMADD2:89; CHECK-VSX: xsnmaddmdp90; CHECK-VSX-NEXT: blr91}92 93define 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 %E97; CHECK-LABEL: test_FNMSUB1:98; CHECK: fneg99; CHECK-NEXT: fmadd100; CHECK-NEXT: blr101 102; CHECK-VSX-LABEL: test_FNMSUB1:103; CHECK-VSX: xsnegdp104; CHECK-VSX-NEXT: xsmaddmdp105}106 107; need nsz flag to generate fnmsub since it may affect sign of zero108define double @test_FNMSUB1_NSZ(double %A, double %B, double %C) {109 %D = fmul nsz double %A, %B ; <double> [#uses=1]110 %E = fsub nsz double %C, %D ; <double> [#uses=1]111 ret double %E112; CHECK-LABEL: test_FNMSUB1_NSZ:113; CHECK: fnmsub114; CHECK-NEXT: blr115 116; CHECK-VSX-LABEL: test_FNMSUB1_NSZ:117; CHECK-VSX: xsnmsubmdp118}119 120define double @test_FNMSUB2(double %A, double %B, double %C) {121 %D = fmul double %A, %B ; <double> [#uses=1]122 %E = fsub double %D, %C ; <double> [#uses=1]123 %F = fsub double -0.000000e+00, %E ; <double> [#uses=1]124 ret double %F125; CHECK-LABEL: test_FNMSUB2:126; CHECK: fnmsub127; CHECK-NEXT: blr128 129; CHECK-VSX-LABEL: test_FNMSUB2:130; CHECK-VSX: xsnmsubmdp131; CHECK-VSX-NEXT: blr132}133 134define float @test_FNMSUBS(float %A, float %B, float %C) {135 %D = fmul float %A, %B ; <float> [#uses=1]136 %E = fsub float %D, %C ; <float> [#uses=1]137 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]138 ret float %F139; CHECK-LABEL: test_FNMSUBS:140; CHECK: fnmsubs141; CHECK-NEXT: blr142 143; CHECK-VSX-LABEL: test_FNMSUBS:144; CHECK-VSX: fnmsubs145; CHECK-VSX-NEXT: blr146}147 148define float @test_XSMADDMSP(float %A, float %B, float %C) {149 %D = fmul float %A, %B ; <float> [#uses=1]150 %E = fadd float %C, %D ; <float> [#uses=1]151 ret float %E152; CHECK-P8-LABEL: test_XSMADDMSP:153; CHECK-P8: xsmaddmsp154; CHECK-P8-NEXT: blr155}156 157define float @test_XSMSUBMSP(float %A, float %B, float %C) {158 %D = fmul float %A, %B ; <float> [#uses=1]159 %E = fsub float %D, %C ; <float> [#uses=1]160 ret float %E161; CHECK-P8-LABEL: test_XSMSUBMSP:162; CHECK-P8: xsmsubmsp163; CHECK-P8-NEXT: blr164}165 166define float @test_XSMADDASP(float %A, float %B, float %C, float %D) {167 %E = fmul float %A, %B ; <float> [#uses=2]168 %F = fadd float %E, %C ; <float> [#uses=1]169 %G = fsub float %E, %D ; <float> [#uses=1]170 %H = call float @dummy4(float %F, float %G) ; <float> [#uses=1]171 ret float %H172; CHECK-P8-LABEL: test_XSMADDASP:173; CHECK-P8: xsmaddasp174; CHECK-P8-NEXT: xsmsubmsp175}176 177define float @test_XSMSUBASP(float %A, float %B, float %C, float %D) {178 %E = fmul float %A, %B ; <float> [#uses=2]179 %F = fsub float %E, %C ; <float> [#uses=1]180 %G = fsub float %E, %D ; <float> [#uses=1]181 %H = call float @dummy4(float %F, float %G) ; <float> [#uses=1]182 ret float %H183; CHECK-P8-LABEL: test_XSMSUBASP:184; CHECK-P8: xsmsubasp185; CHECK-P8-NEXT: xsmsubmsp186}187 188define float @test_XSNMADDMSP(float %A, float %B, float %C) {189 %D = fmul float %A, %B ; <float> [#uses=1]190 %E = fadd float %D, %C ; <float> [#uses=1]191 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]192 ret float %F193; CHECK-P8-LABEL: test_XSNMADDMSP:194; CHECK-P8: xsnmaddmsp195; CHECK-P8-NEXT: blr196}197 198define float @test_XSNMSUBMSP(float %A, float %B, float %C) {199 %D = fmul float %A, %B ; <float> [#uses=1]200 %E = fsub float %D, %C ; <float> [#uses=1]201 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]202 ret float %F203; CHECK-P8-LABEL: test_XSNMSUBMSP:204; CHECK-P8: xsnmsubmsp205; CHECK-P8-NEXT: blr206}207 208define float @test_XSNMADDASP(float %A, float %B, float %C) {209 %D = fmul float %A, %B ; <float> [#uses=1]210 %E = fadd float %D, %C ; <float> [#uses=1]211 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]212 %H = call float @dummy4(float %E, float %F) ; <float> [#uses=1]213 ret float %F214; CHECK-P8-LABEL: test_XSNMADDASP:215; CHECK-P8: xsnmaddasp216 217; CHECK-VSX-LABEL: test_XSNMADDASP:218; CHECK-VSX: fnmadds219}220 221define float @test_XSNMSUBASP(float %A, float %B, float %C) {222 %D = fmul float %A, %B ; <float> [#uses=1]223 %E = fsub float %D, %C ; <float> [#uses=1]224 %F = fsub float -0.000000e+00, %E ; <float> [#uses=1]225 %H = call float @dummy4(float %E, float %F) ; <float> [#uses=1]226 ret float %F227; CHECK-P8-LABEL: test_XSNMSUBASP:228; CHECK-P8: xsnmsubasp229 230; CHECK-VSX-LABEL: test_XSNMSUBASP:231; CHECK-VSX: fnmsubs232}233