* the llvm.experimental.constrained.fpext intrinsic doesn't have a rounding

mode parameter

git-svn-id: trunk@43828 -
This commit is contained in:
Jonas Maebe 2019-12-31 18:05:50 +00:00
parent 04a1236ec6
commit 9b53ed53e3
2 changed files with 26 additions and 15 deletions

View File

@ -97,7 +97,7 @@ uses
procedure a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tdef; reg: tregister; const ref: treference); override; procedure a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tdef; reg: tregister; const ref: treference); override;
procedure a_loadfpu_reg_reg(list: TAsmList; fromsize, tosize: tdef; reg1, reg2: tregister); override; procedure a_loadfpu_reg_reg(list: TAsmList; fromsize, tosize: tdef; reg1, reg2: tregister); override;
protected protected
procedure gen_fpconstrained_intrinsic(list: TAsmList; const intrinsic: TIDString; fromsize, tosize: tdef; fromreg, toreg: tregister); procedure gen_fpconstrained_intrinsic(list: TAsmList; const intrinsic: TIDString; fromsize, tosize: tdef; fromreg, toreg: tregister; roundingmode: boolean);
public public
procedure gen_proc_symbol(list: TAsmList); override; procedure gen_proc_symbol(list: TAsmList); override;
@ -1339,38 +1339,49 @@ implementation
intrinsic:='llvm_experimental_constrained_fpext'; intrinsic:='llvm_experimental_constrained_fpext';
gen_fpconstrained_intrinsic(list, gen_fpconstrained_intrinsic(list,
intrinsic+llvmfloatintrinsicsuffix(tfloatdef(tosize))+llvmfloatintrinsicsuffix(tfloatdef(fromsize)), intrinsic+llvmfloatintrinsicsuffix(tfloatdef(tosize))+llvmfloatintrinsicsuffix(tfloatdef(fromsize)),
fromsize,tosize,reg1,reg2); fromsize,tosize,reg1,reg2,op=la_fptrunc);
end; end;
end; end;
procedure thlcgllvm.gen_fpconstrained_intrinsic(list: TAsmList; const intrinsic: TIDString; fromsize, tosize: tdef; fromreg, toreg: tregister); procedure thlcgllvm.gen_fpconstrained_intrinsic(list: TAsmList; const intrinsic: TIDString; fromsize, tosize: tdef; fromreg, toreg: tregister; roundingmode: boolean);
var var
frompara, roundpara, exceptpara, respara: tcgpara; frompara, roundpara, exceptpara, respara: tcgpara;
tmploc: tlocation; tmploc: tlocation;
pd: tprocdef; pd: tprocdef;
begin begin
frompara.init; frompara.init;
roundpara.init; if roundingmode then
roundpara.init;
exceptpara.init; exceptpara.init;
pd:=search_system_proc(intrinsic); pd:=search_system_proc(intrinsic);
paramanager.getcgtempparaloc(list,pd,1,frompara); paramanager.getcgtempparaloc(list,pd,1,frompara);
paramanager.getcgtempparaloc(list,pd,2,roundpara); if roundingmode then
paramanager.getcgtempparaloc(list,pd,3,exceptpara); begin
paramanager.getcgtempparaloc(list,pd,2,roundpara);
paramanager.getcgtempparaloc(list,pd,3,exceptpara);
end
else
paramanager.getcgtempparaloc(list,pd,2,exceptpara);
location_reset(tmploc,frompara.location^.loc,def_cgsize(fromsize)); location_reset(tmploc,frompara.location^.loc,def_cgsize(fromsize));
tmploc.register:=fromreg; tmploc.register:=fromreg;
gen_load_loc_cgpara(list,fromsize,tmploc,frompara); gen_load_loc_cgpara(list,fromsize,tmploc,frompara);
a_load_reg_cgpara(list,llvm_metadatatype,tllvmmetadata.getstringreg('round.dynamic'),roundpara); if roundingmode then
a_load_reg_cgpara(list,llvm_metadatatype,tllvmmetadata.getstringreg('round.dynamic'),roundpara);
a_load_reg_cgpara(list,llvm_metadatatype,tllvmmetadata.getstringreg('fpexcept.strict'),exceptpara); a_load_reg_cgpara(list,llvm_metadatatype,tllvmmetadata.getstringreg('fpexcept.strict'),exceptpara);
respara:=g_call_system_proc(list,pd,[@frompara,@roundpara,@exceptpara],nil); if roundingmode then
respara:=g_call_system_proc(list,pd,[@frompara,@roundpara,@exceptpara],nil)
else
respara:=g_call_system_proc(list,pd,[@frompara,@exceptpara],nil);
location_reset(tmploc,respara.location^.loc,def_cgsize(tosize)); location_reset(tmploc,respara.location^.loc,def_cgsize(tosize));
tmploc.register:=toreg; tmploc.register:=toreg;
gen_load_cgpara_loc(list,tosize,respara,tmploc,false); gen_load_cgpara_loc(list,tosize,respara,tmploc,false);
frompara.done; frompara.done;
roundpara.done; if roundingmode then
roundpara.done;
exceptpara.done; exceptpara.done;
respara.resetiftemp; respara.resetiftemp;
end; end;

View File

@ -88,20 +88,20 @@ function llvm_experimental_constrained_fdiv(a, b: float128; rounding, exceptions
{$endif} {$endif}
function llvm_experimental_constrained_fptrunc_f32_f64(a: double; rounding, exceptions: LLVMMetadata): single; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f32.f64'; function llvm_experimental_constrained_fptrunc_f32_f64(a: double; rounding, exceptions: LLVMMetadata): single; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f32.f64';
function llvm_experimental_constrained_fpext_f64_f32(a: single; rounding, exceptions: LLVMMetadata): double; compilerproc; external name 'llvm.experimental.constrained.fpext.f64.f32'; function llvm_experimental_constrained_fpext_f64_f32(a: single; exceptions: LLVMMetadata): double; compilerproc; external name 'llvm.experimental.constrained.fpext.f64.f32';
{$ifdef SUPPORT_EXTENDED} {$ifdef SUPPORT_EXTENDED}
function llvm_experimental_constrained_fptrunc_f32_f80(a: extended; rounding, exceptions: LLVMMetadata): single; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f32.x86_fp80'; function llvm_experimental_constrained_fptrunc_f32_f80(a: extended; rounding, exceptions: LLVMMetadata): single; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f32.x86_fp80';
function llvm_experimental_constrained_fptrunc_f64_f80(a: extended; rounding, exceptions: LLVMMetadata): double; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f64.x86_fp80'; function llvm_experimental_constrained_fptrunc_f64_f80(a: extended; rounding, exceptions: LLVMMetadata): double; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f64.x86_fp80';
function llvm_experimental_constrained_fpext_f80_f32(a: single; rounding, exceptions: LLVMMetadata): extended; compilerproc; external name 'llvm.experimental.constrained.fpext.x86_fp80.f32'; function llvm_experimental_constrained_fpext_f80_f32(a: single; exceptions: LLVMMetadata): extended; compilerproc; external name 'llvm.experimental.constrained.fpext.x86_fp80.f32';
function llvm_experimental_constrained_fpext_f80_f64(a: double; rounding, exceptions: LLVMMetadata): extended; compilerproc; external name 'llvm.experimental.constrained.fpext.x86_fp80.f64'; function llvm_experimental_constrained_fpext_f80_f64(a: double; exceptions: LLVMMetadata): extended; compilerproc; external name 'llvm.experimental.constrained.fpext.x86_fp80.f64';
{$ifdef SUPPORT_FLOAT128} {$ifdef SUPPORT_FLOAT128}
function llvm_experimental_constrained_fptrunc_f128_f80(a: extended; rounding, exceptions: LLVMMetadata): float128; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f128.x86_fp80'; function llvm_experimental_constrained_fptrunc_f128_f80(a: extended; rounding, exceptions: LLVMMetadata): float128; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f128.x86_fp80';
function llvm_experimental_constrained_fpext_f80_f32(a: float128; rounding, exceptions: LLVMMetadata): extended; compilerproc; external name 'llvm.experimental.constrained.fpext.x86_fp80.f128'; function llvm_experimental_constrained_fpext_f80_f32(a: float128; exceptions: LLVMMetadata): extended; compilerproc; external name 'llvm.experimental.constrained.fpext.x86_fp80.f128';
{$endif} {$endif}
{$endif} {$endif}
{$ifdef SUPPORT_FLOAT128} {$ifdef SUPPORT_FLOAT128}
function llvm_experimental_constrained_fptrunc_f32_f128(a: float128; rounding, exceptions: LLVMMetadata): single; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f32.f128'; function llvm_experimental_constrained_fptrunc_f32_f128(a: float128; rounding, exceptions: LLVMMetadata): single; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f32.f128';
function llvm_experimental_constrained_fptrunc_f64_f128(a: float128; rounding, exceptions: LLVMMetadata): double; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f64.f128'; function llvm_experimental_constrained_fptrunc_f64_f128(a: float128; rounding, exceptions: LLVMMetadata): double; compilerproc; external name 'llvm.experimental.constrained.fptrunc.f64.f128';
function llvm_experimental_constrained_fpext_f128_f32(a: single; rounding, exceptions: LLVMMetadata): float128; compilerproc; external name 'llvm.experimental.constrained.fpext.f128.f32'; function llvm_experimental_constrained_fpext_f128_f32(a: single; exceptions: LLVMMetadata): float128; compilerproc; external name 'llvm.experimental.constrained.fpext.f128.f32';
function llvm_experimental_constrained_fpext_f128_f64(a: double; rounding, exceptions: LLVMMetadata): float128; compilerproc; external name 'llvm.experimental.constrained.fpext.f128.f64'; function llvm_experimental_constrained_fpext_f128_f64(a: double; exceptions: LLVMMetadata): float128; compilerproc; external name 'llvm.experimental.constrained.fpext.f128.f64';
{$endif} {$endif}