mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-03-07 03:47:20 +00:00
[PowerPC] Add builtins for xvtdiv(dp|sp) and xvtsqrt(dp|sp).
Summary: This patch implements the builtins for xvtdivdp, xvtdivsp, xvtsqrtdp, xvtsqrtsp. The instructions correspond to the following builtins: int vec_test_swdiv(vector double v1, vector double v2); int vec_test_swdivs(vector float v1, vector float v2); int vec_test_swsqrt(vector double v1); int vec_test_swsqrts(vector float v1); This patch depends on D88274, which fixes the bug in copying from CRRC to GPRC/G8RC. Reviewed By: steven.zhang, amyk Differential Revision: https://reviews.llvm.org/D88278
This commit is contained in:
parent
2e5d7a734d
commit
b654b312b6
@ -1249,6 +1249,16 @@ def int_ppc_vsx_xxinsertw :
|
||||
def int_ppc_vsx_xvtlsbb :
|
||||
PowerPC_VSX_Intrinsic<"xvtlsbb", [llvm_i32_ty],
|
||||
[llvm_v16i8_ty, llvm_i32_ty], [IntrNoMem]>;
|
||||
def int_ppc_vsx_xvtdivdp :
|
||||
PowerPC_VSX_Intrinsic<"xvtdivdp", [llvm_i32_ty],
|
||||
[llvm_v2f64_ty, llvm_v2f64_ty], [IntrNoMem]>;
|
||||
def int_ppc_vsx_xvtdivsp :
|
||||
PowerPC_VSX_Intrinsic<"xvtdivsp", [llvm_i32_ty],
|
||||
[llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>;
|
||||
def int_ppc_vsx_xvtsqrtdp :
|
||||
PowerPC_VSX_Intrinsic<"xvtsqrtdp", [llvm_i32_ty], [llvm_v2f64_ty], [IntrNoMem]>;
|
||||
def int_ppc_vsx_xvtsqrtsp :
|
||||
PowerPC_VSX_Intrinsic<"xvtsqrtsp", [llvm_i32_ty], [llvm_v4f32_ty], [IntrNoMem]>;
|
||||
def int_ppc_vsx_xxeval :
|
||||
PowerPC_VSX_Intrinsic<"xxeval", [llvm_v2i64_ty],
|
||||
[llvm_v2i64_ty, llvm_v2i64_ty,
|
||||
|
@ -2591,6 +2591,16 @@ def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
|
||||
def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
|
||||
(XVDIVDP $A, $B)>;
|
||||
|
||||
// Vector test for software divide and sqrt.
|
||||
def : Pat<(i32 (int_ppc_vsx_xvtdivdp v2f64:$A, v2f64:$B)),
|
||||
(COPY_TO_REGCLASS (XVTDIVDP $A, $B), GPRC)>;
|
||||
def : Pat<(i32 (int_ppc_vsx_xvtdivsp v4f32:$A, v4f32:$B)),
|
||||
(COPY_TO_REGCLASS (XVTDIVSP $A, $B), GPRC)>;
|
||||
def : Pat<(i32 (int_ppc_vsx_xvtsqrtdp v2f64:$A)),
|
||||
(COPY_TO_REGCLASS (XVTSQRTDP $A), GPRC)>;
|
||||
def : Pat<(i32 (int_ppc_vsx_xvtsqrtsp v4f32:$A)),
|
||||
(COPY_TO_REGCLASS (XVTSQRTSP $A), GPRC)>;
|
||||
|
||||
// Reciprocal estimate
|
||||
def : Pat<(int_ppc_vsx_xvresp v4f32:$A),
|
||||
(XVRESP $A)>;
|
||||
|
@ -54,3 +54,55 @@ define void @test4(<2 x double> %a, i8* %b) {
|
||||
}
|
||||
; Function Attrs: nounwind readnone
|
||||
declare void @llvm.ppc.vsx.stxvd2x.be(<2 x double>, i8*)
|
||||
|
||||
define i32 @test_vec_test_swdiv(<2 x double> %a, <2 x double> %b) {
|
||||
; CHECK-LABEL: test_vec_test_swdiv:
|
||||
; CHECK: # %bb.0: # %entry
|
||||
; CHECK-NEXT: xvtdivdp cr0, v2, v3
|
||||
; CHECK-NEXT: mfocrf r3, 128
|
||||
; CHECK-NEXT: srwi r3, r3, 28
|
||||
; CHECK-NEXT: blr
|
||||
entry:
|
||||
%0 = tail call i32 @llvm.ppc.vsx.xvtdivdp(<2 x double> %a, <2 x double> %b)
|
||||
ret i32 %0
|
||||
}
|
||||
declare i32 @llvm.ppc.vsx.xvtdivdp(<2 x double>, <2 x double>)
|
||||
|
||||
define i32 @test_vec_test_swdivs(<4 x float> %a, <4 x float> %b) {
|
||||
; CHECK-LABEL: test_vec_test_swdivs:
|
||||
; CHECK: # %bb.0: # %entry
|
||||
; CHECK-NEXT: xvtdivsp cr0, v2, v3
|
||||
; CHECK-NEXT: mfocrf r3, 128
|
||||
; CHECK-NEXT: srwi r3, r3, 28
|
||||
; CHECK-NEXT: blr
|
||||
entry:
|
||||
%0 = tail call i32 @llvm.ppc.vsx.xvtdivsp(<4 x float> %a, <4 x float> %b)
|
||||
ret i32 %0
|
||||
}
|
||||
declare i32 @llvm.ppc.vsx.xvtdivsp(<4 x float>, <4 x float>)
|
||||
|
||||
define i32 @test_vec_test_swsqrt(<2 x double> %a) {
|
||||
; CHECK-LABEL: test_vec_test_swsqrt:
|
||||
; CHECK: # %bb.0: # %entry
|
||||
; CHECK-NEXT: xvtsqrtdp cr0, v2
|
||||
; CHECK-NEXT: mfocrf r3, 128
|
||||
; CHECK-NEXT: srwi r3, r3, 28
|
||||
; CHECK-NEXT: blr
|
||||
entry:
|
||||
%0 = tail call i32 @llvm.ppc.vsx.xvtsqrtdp(<2 x double> %a)
|
||||
ret i32 %0
|
||||
}
|
||||
declare i32 @llvm.ppc.vsx.xvtsqrtdp(<2 x double>)
|
||||
|
||||
define i32 @test_vec_test_swsqrts(<4 x float> %a) {
|
||||
; CHECK-LABEL: test_vec_test_swsqrts:
|
||||
; CHECK: # %bb.0: # %entry
|
||||
; CHECK-NEXT: xvtsqrtsp cr0, v2
|
||||
; CHECK-NEXT: mfocrf r3, 128
|
||||
; CHECK-NEXT: srwi r3, r3, 28
|
||||
; CHECK-NEXT: blr
|
||||
entry:
|
||||
%0 = tail call i32 @llvm.ppc.vsx.xvtsqrtsp(<4 x float> %a)
|
||||
ret i32 %0
|
||||
}
|
||||
declare i32 @llvm.ppc.vsx.xvtsqrtsp(<4 x float>)
|
||||
|
Loading…
x
Reference in New Issue
Block a user