mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 13:29:14 +02:00
* always insert type conversion for pasbool to int on llvm, as pasbool is
represented by i1 while equally sized integers are i8 git-svn-id: trunk@30709 -
This commit is contained in:
parent
61ddaab091
commit
f7b5ee64ae
@ -45,7 +45,7 @@ interface
|
|||||||
{ procedure second_real_to_real;override; }
|
{ procedure second_real_to_real;override; }
|
||||||
{ procedure second_cord_to_pointer;override; }
|
{ procedure second_cord_to_pointer;override; }
|
||||||
{ procedure second_proc_to_procvar;override; }
|
{ procedure second_proc_to_procvar;override; }
|
||||||
{ procedure second_bool_to_int;override; }
|
procedure second_bool_to_int;override;
|
||||||
procedure second_int_to_bool;override;
|
procedure second_int_to_bool;override;
|
||||||
{ procedure second_load_smallset;override; }
|
{ procedure second_load_smallset;override; }
|
||||||
{ procedure second_ansistring_to_pchar;override; }
|
{ procedure second_ansistring_to_pchar;override; }
|
||||||
@ -62,7 +62,7 @@ uses
|
|||||||
aasmbase,aasmdata,
|
aasmbase,aasmdata,
|
||||||
llvmbase,aasmllvm,
|
llvmbase,aasmllvm,
|
||||||
procinfo,
|
procinfo,
|
||||||
symconst,symdef,defutil,
|
symconst,symtype,symdef,defutil,
|
||||||
cgbase,cgutils,hlcgobj,pass_2;
|
cgbase,cgutils,hlcgobj,pass_2;
|
||||||
|
|
||||||
{ tllvmtypeconvnode }
|
{ tllvmtypeconvnode }
|
||||||
@ -134,6 +134,38 @@ procedure tllvmtypeconvnode.second_int_to_real;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure tllvmtypeconvnode.second_bool_to_int;
|
||||||
|
var
|
||||||
|
pdef: tdef;
|
||||||
|
hreg: tregister;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
{ all boolean/integer of the same size are represented using the same type
|
||||||
|
by FPC in LLVM, except for Pascal booleans, which are i1 -> convert
|
||||||
|
the type if necessary. This never has to be done for registers on the
|
||||||
|
assignment side, because we make everything that's explicitly typecasted
|
||||||
|
on the assignment side non regable for llvm }
|
||||||
|
if is_pasbool(left.resultdef) and
|
||||||
|
(nf_explicit in flags) and
|
||||||
|
(resultdef.size=1) then
|
||||||
|
case location.loc of
|
||||||
|
LOC_REFERENCE,LOC_CREFERENCE:
|
||||||
|
begin
|
||||||
|
pdef:=getpointerdef(resultdef);
|
||||||
|
hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,pdef);
|
||||||
|
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.resultdef,pdef,location.reference,hreg);
|
||||||
|
hlcg.reference_reset_base(location.reference,pdef,hreg,0,location.reference.alignment);
|
||||||
|
end;
|
||||||
|
LOC_REGISTER,LOC_CREGISTER:
|
||||||
|
begin
|
||||||
|
hreg:=hlcg.getintregister(current_asmdata.CurrAsmList,resultdef);
|
||||||
|
hlcg.a_load_reg_reg(current_asmdata.CurrAsmList,left.resultdef,resultdef,location.register,hreg);
|
||||||
|
location.register:=hreg;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tllvmtypeconvnode.second_int_to_bool;
|
procedure tllvmtypeconvnode.second_int_to_bool;
|
||||||
var
|
var
|
||||||
newsize : tcgsize;
|
newsize : tcgsize;
|
||||||
|
Loading…
Reference in New Issue
Block a user