* implemented second_int_to_int() for llvm

o the generic implementation ignores the need for bitcasts from pointers to
     ordinals and vice versa, and also hacks around with offsets

git-svn-id: branches/hlcgllvm@28206 -
This commit is contained in:
Jonas Maebe 2014-07-12 22:14:37 +00:00
parent 1c9932d921
commit 4746e17be5

View File

@ -31,7 +31,7 @@ interface
type
tllvmtypeconvnode = class(tcgtypeconvnode)
protected
{ procedure second_int_to_int;override; }
procedure second_int_to_int;override;
{ procedure second_string_to_string;override; }
{ procedure second_cstring_to_pchar;override; }
{ procedure second_string_to_chararray;override; }
@ -56,13 +56,39 @@ interface
implementation
uses
verbose,
globtype,verbose,
aasmdata,
symdef,
llvmbase,aasmllvm,
symdef,defutil,
cgbase,cgutils,hlcgobj;
{ tllvmtypeconvnode }
procedure tllvmtypeconvnode.second_int_to_int;
var
fromsize, tosize: tcgint;
hreg: tregister;
begin
if not(nf_explicit in flags) then
hlcg.g_rangecheck(current_asmdata.CurrAsmList,left.location,left.resultdef,resultdef);
fromsize:=left.resultdef.size;
tosize:=resultdef.size;
location_copy(location,left.location);
if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) or
(fromsize<>tosize) then
begin
hlcg.location_force_reg(current_asmdata.CurrAsmList,location,left.resultdef,resultdef,left.location.loc=LOC_CREGISTER);
end
else if left.resultdef<>resultdef then
begin
{ just typecast the pointer type }
hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(resultdef));
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.resultdef,getpointerdef(resultdef),left.location.reference,hreg);
hlcg.reference_reset_base(location.reference,getpointerdef(resultdef),hreg,0,location.reference.alignment);
end;
end;
procedure tllvmtypeconvnode.second_pointer_to_array;
var
hreg: tregister;