瀏覽代碼

Optimized the comparison of a widestring variable with ''

Sergey Larin 3 年之前
父節點
當前提交
60c967f255
共有 1 個文件被更改,包括 8 次插入32 次删除
  1. 8 32
      compiler/nadd.pas

+ 8 - 32
compiler/nadd.pas

@@ -3290,7 +3290,7 @@ implementation
       var
       var
         p: tnode;
         p: tnode;
         newstatement : tstatementnode;
         newstatement : tstatementnode;
-        tempnode (*,tempnode2*) : ttempcreatenode;
+        tempnode : ttempcreatenode;
         cmpfuncname: string;
         cmpfuncname: string;
         para: tcallparanode;
         para: tcallparanode;
       begin
       begin
@@ -3399,8 +3399,6 @@ implementation
               { generate better code for comparison with empty string, we
               { generate better code for comparison with empty string, we
                 only need to compare the length with 0 }
                 only need to compare the length with 0 }
               if (nodetype in [equaln,unequaln,gtn,gten,ltn,lten]) and
               if (nodetype in [equaln,unequaln,gtn,gten,ltn,lten]) and
-                { windows widestrings are too complicated to be handled optimized }
-                not(is_widestring(left.resultdef) and (target_info.system in systems_windows)) and
                  (((left.nodetype=stringconstn) and (tstringconstnode(left).len=0)) or
                  (((left.nodetype=stringconstn) and (tstringconstnode(left).len=0)) or
                   ((right.nodetype=stringconstn) and (tstringconstnode(right).len=0))) then
                   ((right.nodetype=stringconstn) and (tstringconstnode(right).len=0))) then
                 begin
                 begin
@@ -3419,40 +3417,18 @@ implementation
                     result := caddnode.create(nodetype,
                     result := caddnode.create(nodetype,
                       cinlinenode.create(in_length_x,false,left),
                       cinlinenode.create(in_length_x,false,left),
                       cordconstnode.create(0,s8inttype,false))
                       cordconstnode.create(0,s8inttype,false))
-                  else
+                  else { nodetype in [equaln,unequaln] }
                     begin
                     begin
-                      (*
-                      if is_widestring(left.resultdef) and
-                        (target_info.system in system_windows) then
+                      if is_widestring(left.resultdef) and (tf_winlikewidestring in target_info.flags) then
                         begin
                         begin
                           { windows like widestrings requires that we also check the length }
                           { windows like widestrings requires that we also check the length }
-                          result:=internalstatements(newstatement);
-                          tempnode:=ctempcreatenode.create(voidpointertype,voidpointertype.size,tt_persistent,true);
-                          tempnode2:=ctempcreatenode.create(resultdef,resultdef.size,tt_persistent,true);
-                          addstatement(newstatement,tempnode);
-                          addstatement(newstatement,tempnode2);
-                          { poor man's cse }
-                          addstatement(newstatement,cassignmentnode.create(ctemprefnode.create(tempnode),
-                            ctypeconvnode.create_internal(left,voidpointertype))
-                          );
-                          addstatement(newstatement,cassignmentnode.create(ctemprefnode.create(tempnode2),
-                            caddnode.create(orn,
-                              caddnode.create(nodetype,
-                                ctemprefnode.create(tempnode),
-                                cpointerconstnode.create(0,voidpointertype)
-                              ),
-                              caddnode.create(nodetype,
-                                ctypeconvnode.create_internal(cderefnode.create(ctemprefnode.create(tempnode)),s32inttype),
-                                cordconstnode.create(0,s32inttype,false)
-                              )
-                            )
-                          ));
-                          addstatement(newstatement,ctempdeletenode.create_normal_temp(tempnode));
-                          addstatement(newstatement,ctempdeletenode.create_normal_temp(tempnode2));
-                          addstatement(newstatement,ctemprefnode.create(tempnode2));
+                          result:=cinlinenode.create(in_length_x,false,left);
+                          { and compare its result with 0 }
+                          result:=caddnode.create(equaln,result,cordconstnode.create(0,s8inttype,false));
+                          if nodetype=unequaln then
+                            result:=cnotnode.create(result);
                         end
                         end
                       else
                       else
-                      *)
                         begin
                         begin
                           { compare the pointer with nil (for ansistrings etc), }
                           { compare the pointer with nil (for ansistrings etc), }
                           { faster than getting the length (JM)                 }
                           { faster than getting the length (JM)                 }