Browse Source

* remove type cast of the parameter of int(...), if an instruction is available which can be used directly

git-svn-id: trunk@38335 -
florian 7 years ago
parent
commit
98bd768521
1 changed files with 32 additions and 3 deletions
  1. 32 3
      compiler/x86/nx86inl.pas

+ 32 - 3
compiler/x86/nx86inl.pas

@@ -51,6 +51,9 @@ interface
           function first_fma: tnode; override;
           function first_fma: tnode; override;
           function first_frac_real : tnode; override;
           function first_frac_real : tnode; override;
           function first_int_real : tnode; override;
           function first_int_real : tnode; override;
+
+          function simplify(forinline : boolean) : tnode; override;
+
           { second pass override to generate these nodes }
           { second pass override to generate these nodes }
           procedure second_IncludeExclude;override;
           procedure second_IncludeExclude;override;
           procedure second_pi; override;
           procedure second_pi; override;
@@ -83,8 +86,9 @@ implementation
       verbose,compinnr,
       verbose,compinnr,
       defutil,
       defutil,
       aasmbase,aasmdata,aasmcpu,
       aasmbase,aasmdata,aasmcpu,
-      symtype,symdef,symcpu,
-      cgbase,pass_2,
+      symconst,symtype,symdef,symcpu,
+      ncnv,
+      cgbase,pass_1,pass_2,
       cpuinfo,cpubase,nutils,
       cpuinfo,cpubase,nutils,
       ncal,ncgutil,
       ncal,ncgutil,
       tgobj,
       tgobj,
@@ -281,6 +285,7 @@ implementation
          if (current_settings.fputype>=fpu_sse41) and
          if (current_settings.fputype>=fpu_sse41) and
            ((is_double(resultdef)) or (is_single(resultdef))) then
            ((is_double(resultdef)) or (is_single(resultdef))) then
            begin
            begin
+             maybe_remove_round_trunc_typeconv;
              expectloc:=LOC_MMREGISTER;
              expectloc:=LOC_MMREGISTER;
              Result:=nil;
              Result:=nil;
            end
            end
@@ -294,14 +299,38 @@ implementation
          if (current_settings.fputype>=fpu_sse41) and
          if (current_settings.fputype>=fpu_sse41) and
            ((is_double(resultdef)) or (is_single(resultdef))) then
            ((is_double(resultdef)) or (is_single(resultdef))) then
            begin
            begin
-             expectloc:=LOC_MMREGISTER;
              Result:=nil;
              Result:=nil;
+             expectloc:=LOC_MMREGISTER;
            end
            end
          else
          else
            Result:=inherited first_int_real;
            Result:=inherited first_int_real;
        end;
        end;
 
 
 
 
+     function tx86inlinenode.simplify(forinline : boolean) : tnode;
+       var
+         temp : tnode;
+       begin
+         if (current_settings.fputype>=fpu_sse41) and
+           (inlinenumber=in_int_real) and (left.nodetype=typeconvn) and
+           not(nf_explicit in left.flags) and
+           (ttypeconvnode(left).left.resultdef.typ=floatdef) and
+           ((is_double(ttypeconvnode(left).left.resultdef)) or (is_single(ttypeconvnode(left).left.resultdef))) then
+           begin
+             { get rid of the type conversion }
+             temp:=ttypeconvnode(left).left;
+             ttypeconvnode(left).left:=nil;
+             left.free;
+             left:=temp;
+             result:=self.getcopy;
+             tinlinenode(result).resultdef:=temp.resultdef;
+             typecheckpass(result);
+           end
+         else
+           Result:=inherited simplify(forinline);
+       end;
+
+
      procedure tx86inlinenode.second_pi;
      procedure tx86inlinenode.second_pi;
        begin
        begin
          location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
          location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));