diff --git a/compiler/nadd.pas b/compiler/nadd.pas index 27929ca597..3d2d62e739 100644 --- a/compiler/nadd.pas +++ b/compiler/nadd.pas @@ -3290,7 +3290,7 @@ implementation var p: tnode; newstatement : tstatementnode; - tempnode (*,tempnode2*) : ttempcreatenode; + tempnode : ttempcreatenode; cmpfuncname: string; para: tcallparanode; begin @@ -3399,8 +3399,6 @@ implementation { generate better code for comparison with empty string, we only need to compare the length with 0 } 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 ((right.nodetype=stringconstn) and (tstringconstnode(right).len=0))) then begin @@ -3419,40 +3417,18 @@ implementation result := caddnode.create(nodetype, cinlinenode.create(in_length_x,false,left), cordconstnode.create(0,s8inttype,false)) - else + else { nodetype in [equaln,unequaln] } 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 { 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 else - *) begin { compare the pointer with nil (for ansistrings etc), } { faster than getting the length (JM) }