1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-21 03:53:04 +02:00
llvm-mirror/test/CodeGen/PowerPC/fma.ll
Nemanja Ivanovic d9fdd9c5e6 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.

llvm-svn: 238578
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
}