llvm-6502/test/CodeGen/PowerPC/fma.ll
Nemanja Ivanovic 8493722975 Add support for VSX FMA single-precision instructions to the PPC back end
This patch corresponds to review:
http://reviews.llvm.org/D9941

It adds the various FMA instructions introduced in the version 2.07 of
the ISA along with the testing for them. These are operations on single
precision scalar values in VSX registers.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238578 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-29 17:13:25 +00:00

212 lines
6.2 KiB
LLVM

; RUN: llc < %s -march=ppc32 -fp-contract=fast -mattr=-vsx | FileCheck %s
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 | FileCheck -check-prefix=CHECK-VSX %s
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 | FileCheck -check-prefix=CHECK-P8 %s
; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -fp-contract=fast -mcpu=pwr8 | FileCheck -check-prefix=CHECK-P8 %s
declare double @dummy1(double) #0
declare double @dummy2(double, double) #0
declare double @dummy3(double, double, double) #0
declare float @dummy4(float, float) #0
define double @test_FMADD1(double %A, double %B, double %C) {
%D = fmul double %A, %B ; <double> [#uses=1]
%E = fadd double %C, %D ; <double> [#uses=1]
ret double %E
; CHECK-LABEL: test_FMADD1:
; CHECK: fmadd
; CHECK-NEXT: blr
; CHECK-VSX-LABEL: test_FMADD1:
; CHECK-VSX: xsmaddmdp
; CHECK-VSX-NEXT: blr
}
define double @test_FMADD2(double %A, double %B, double %C) {
%D = fmul double %A, %B ; <double> [#uses=1]
%E = fadd double %D, %C ; <double> [#uses=1]
ret double %E
; CHECK-LABEL: test_FMADD2:
; CHECK: fmadd
; CHECK-NEXT: blr
; CHECK-VSX-LABEL: test_FMADD2:
; CHECK-VSX: xsmaddmdp
; CHECK-VSX-NEXT: blr
}
define double @test_FMSUB1(double %A, double %B, double %C) {
%D = fmul double %A, %B ; <double> [#uses=1]
%E = fsub double %D, %C ; <double> [#uses=1]
ret double %E
; CHECK-LABEL: test_FMSUB1:
; CHECK: fmsub
; CHECK-NEXT: blr
; CHECK-VSX-LABEL: test_FMSUB1:
; CHECK-VSX: xsmsubmdp
; CHECK-VSX-NEXT: blr
}
define double @test_FMSUB2(double %A, double %B, double %C, double %D) {
%E = fmul double %A, %B ; <double> [#uses=2]
%F = fadd double %E, %C ; <double> [#uses=1]
%G = fsub double %E, %D ; <double> [#uses=1]
%H = call double @dummy2(double %F, double %G) ; <double> [#uses=1]
ret double %H
; CHECK-LABEL: test_FMSUB2:
; CHECK: fmadd
; CHECK-NEXT: fmsub
; CHECK-VSX-LABEL: test_FMSUB2:
; CHECK-VSX: xsmaddadp
; CHECK-VSX-NEXT: xsmsubmdp
}
define double @test_FNMADD1(double %A, double %B, double %C) {
%D = fmul double %A, %B ; <double> [#uses=1]
%E = fadd double %D, %C ; <double> [#uses=1]
%F = fsub double -0.000000e+00, %E ; <double> [#uses=1]
ret double %F
; CHECK-LABEL: test_FNMADD1:
; CHECK: fnmadd
; CHECK-NEXT: blr
; CHECK-VSX-LABEL: test_FNMADD1:
; CHECK-VSX: xsnmaddmdp
; CHECK-VSX-NEXT: blr
}
define double @test_FNMADD2(double %A, double %B, double %C) {
%D = fmul double %A, %B ; <double> [#uses=1]
%E = fadd double %C, %D ; <double> [#uses=1]
%F = fsub double -0.000000e+00, %E ; <double> [#uses=1]
ret double %F
; CHECK-LABEL: test_FNMADD2:
; CHECK: fnmadd
; CHECK-NEXT: blr
; CHECK-VSX-LABEL: test_FNMADD2:
; CHECK-VSX: xsnmaddmdp
; CHECK-VSX-NEXT: blr
}
define double @test_FNMSUB1(double %A, double %B, double %C) {
%D = fmul double %A, %B ; <double> [#uses=1]
%E = fsub double %C, %D ; <double> [#uses=1]
ret double %E
; CHECK-LABEL: test_FNMSUB1:
; CHECK: fnmsub
; CHECK-NEXT: blr
; CHECK-VSX-LABEL: test_FNMSUB1:
; CHECK-VSX: xsnmsubmdp
}
define double @test_FNMSUB2(double %A, double %B, double %C) {
%D = fmul double %A, %B ; <double> [#uses=1]
%E = fsub double %D, %C ; <double> [#uses=1]
%F = fsub double -0.000000e+00, %E ; <double> [#uses=1]
ret double %F
; CHECK-LABEL: test_FNMSUB2:
; CHECK: fnmsub
; CHECK-NEXT: blr
; CHECK-VSX-LABEL: test_FNMSUB2:
; CHECK-VSX: xsnmsubmdp
; CHECK-VSX-NEXT: blr
}
define float @test_FNMSUBS(float %A, float %B, float %C) {
%D = fmul float %A, %B ; <float> [#uses=1]
%E = fsub float %D, %C ; <float> [#uses=1]
%F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
ret float %F
; CHECK-LABEL: test_FNMSUBS:
; CHECK: fnmsubs
; CHECK-NEXT: blr
; CHECK-VSX-LABEL: test_FNMSUBS:
; CHECK-VSX: fnmsubs
; CHECK-VSX-NEXT: blr
}
define float @test_XSMADDMSP(float %A, float %B, float %C) {
%D = fmul float %A, %B ; <float> [#uses=1]
%E = fadd float %C, %D ; <float> [#uses=1]
ret float %E
; CHECK-P8-LABEL: test_XSMADDMSP:
; CHECK-P8: xsmaddmsp
; CHECK-P8-NEXT: blr
}
define float @test_XSMSUBMSP(float %A, float %B, float %C) {
%D = fmul float %A, %B ; <float> [#uses=1]
%E = fsub float %D, %C ; <float> [#uses=1]
ret float %E
; CHECK-P8-LABEL: test_XSMSUBMSP:
; CHECK-P8: xsmsubmsp
; CHECK-P8-NEXT: blr
}
define float @test_XSMADDASP(float %A, float %B, float %C, float %D) {
%E = fmul float %A, %B ; <float> [#uses=2]
%F = fadd float %E, %C ; <float> [#uses=1]
%G = fsub float %E, %D ; <float> [#uses=1]
%H = call float @dummy4(float %F, float %G) ; <float> [#uses=1]
ret float %H
; CHECK-P8-LABEL: test_XSMADDASP:
; CHECK-P8: xsmaddasp
; CHECK-P8-NEXT: xsmsubmsp
}
define float @test_XSMSUBASP(float %A, float %B, float %C, float %D) {
%E = fmul float %A, %B ; <float> [#uses=2]
%F = fsub float %E, %C ; <float> [#uses=1]
%G = fsub float %E, %D ; <float> [#uses=1]
%H = call float @dummy4(float %F, float %G) ; <float> [#uses=1]
ret float %H
; CHECK-P8-LABEL: test_XSMSUBASP:
; CHECK-P8: xsmsubasp
; CHECK-P8-NEXT: xsmsubmsp
}
define float @test_XSNMADDMSP(float %A, float %B, float %C) {
%D = fmul float %A, %B ; <float> [#uses=1]
%E = fadd float %D, %C ; <float> [#uses=1]
%F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
ret float %F
; CHECK-P8-LABEL: test_XSNMADDMSP:
; CHECK-P8: xsnmaddmsp
; CHECK-P8-NEXT: blr
}
define float @test_XSNMSUBMSP(float %A, float %B, float %C) {
%D = fmul float %A, %B ; <float> [#uses=1]
%E = fsub float %D, %C ; <float> [#uses=1]
%F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
ret float %F
; CHECK-P8-LABEL: test_XSNMSUBMSP:
; CHECK-P8: xsnmsubmsp
; CHECK-P8-NEXT: blr
}
define float @test_XSNMADDASP(float %A, float %B, float %C) {
%D = fmul float %A, %B ; <float> [#uses=1]
%E = fadd float %D, %C ; <float> [#uses=1]
%F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
%H = call float @dummy4(float %E, float %F) ; <float> [#uses=1]
ret float %F
; CHECK-P8-LABEL: test_XSNMADDASP:
; CHECK-P8: xsnmaddasp
}
define float @test_XSNMSUBASP(float %A, float %B, float %C) {
%D = fmul float %A, %B ; <float> [#uses=1]
%E = fsub float %D, %C ; <float> [#uses=1]
%F = fsub float -0.000000e+00, %E ; <float> [#uses=1]
%H = call float @dummy4(float %E, float %F) ; <float> [#uses=1]
ret float %F
; CHECK-P8-LABEL: test_XSNMSUBASP:
; CHECK-P8: xsnmsubasp
}