Browse Source

* 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 -
sergei 13 years ago
parent
commit
04ca8a9126
1 changed files with 7 additions and 13 deletions
  1. 7 13
      compiler/ncal.pas

+ 7 - 13
compiler/ncal.pas

@@ -408,7 +408,7 @@ implementation
           end;
           end;
 
 
         { create a temp to store parameter values }
         { 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);
         addstatement(statements,params);
 
 
         calldescnode:=cdataconstnode.create;
         calldescnode:=cdataconstnode.create;
@@ -462,20 +462,14 @@ implementation
               depending on byref bit }
               depending on byref bit }
 
 
             if assignmenttype=voidpointertype then
             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
             else
               addstatement(statements,cassignmentnode.create(
               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)));
                 ctypeconvnode.create_internal(para.left,assignmenttype)));
 
 
             inc(paramssize,max(voidpointertype.size,assignmenttype.size));
             inc(paramssize,max(voidpointertype.size,assignmenttype.size));