* translate_disp_call: improved building the parameter block by using ttemprefnode.create_offset instead of taking address/pointer additions/dereference. Results in simpler node tree and lesser CPU instructions generated.

git-svn-id: trunk@21018 -
This commit is contained in:
sergei 2012-04-24 12:51:36 +00:00
parent 6d0dd50be3
commit 04ca8a9126

View File

@ -408,7 +408,7 @@ implementation
end;
{ create a temp to store parameter values }
params:=ctempcreatenode.create(voidtype,0,tt_persistent,true);
params:=ctempcreatenode.create(cformaltype,0,tt_persistent,false);
addstatement(statements,params);
calldescnode:=cdataconstnode.create;
@ -462,20 +462,14 @@ implementation
depending on byref bit }
if assignmenttype=voidpointertype then
begin
addstatement(statements,cassignmentnode.create(
ctypeconvnode.create_internal(cderefnode.create(caddnode.create(addn,
caddrnode.create(ctemprefnode.create(params)),
cordconstnode.create(qword(paramssize),ptruinttype,false)
)),voidpointertype),
ctypeconvnode.create_internal(caddrnode.create_internal(para.left),voidpointertype)));
end
addstatement(statements,cassignmentnode.create(
ctypeconvnode.create_internal(ctemprefnode.create_offset(params,paramssize),
voidpointertype),
ctypeconvnode.create_internal(caddrnode.create_internal(para.left),voidpointertype)))
else
addstatement(statements,cassignmentnode.create(
ctypeconvnode.create_internal(cderefnode.create(caddnode.create(addn,
caddrnode.create(ctemprefnode.create(params)),
cordconstnode.create(paramssize,ptruinttype,false)
)),assignmenttype),
ctypeconvnode.create_internal(ctemprefnode.create_offset(params,paramssize),
assignmenttype),
ctypeconvnode.create_internal(para.left,assignmenttype)));
inc(paramssize,max(voidpointertype.size,assignmenttype.size));