Browse Source

* optimize converting of 8/16/32 bit constants to 64bit ones

Jonas Maebe 25 years ago
parent
commit
6b00727480
1 changed files with 28 additions and 15 deletions
  1. 28 15
      compiler/i386/n386cnv.pas

+ 28 - 15
compiler/i386/n386cnv.pas

@@ -174,20 +174,30 @@ implementation
 
             { do we need a sign extension for int64? }
             if is_64bitint(resulttype) then
-              begin
-                 emit_reg_reg(A_XOR,S_L,
-                   hregister2,hregister2);
-                 if (porddef(resulttype)^.typ=s64bit) and
-                   is_signed(left.resulttype) then
-                   begin
-                      getlabel(l);
-                      emit_const_reg(A_TEST,S_L,$80000000,makereg32(hregister));
-                      emitjmp(C_Z,l);
-                      emit_reg(A_NOT,S_L,
-                        hregister2);
-                      emitlab(l);
-                   end;
-              end;
+              { special case for constants (JM) }
+              if is_constintnode(left) then
+                begin
+                  if tordconstnode(left).value >= 0 then
+                    emit_reg_reg(A_XOR,S_L,
+                      hregister2,hregister2)
+                  else
+                    emit_const_reg(A_MOV,S_L,$ffffffff,hregister2);
+                end
+              else
+                begin
+                  emit_reg_reg(A_XOR,S_L,
+                    hregister2,hregister2);
+                  if (porddef(resulttype)^.typ=s64bit) and
+                    is_signed(left.resulttype) then
+                    begin
+                       getlabel(l);
+                       emit_const_reg(A_TEST,S_L,$80000000,makereg32(hregister));
+                       emitjmp(C_Z,l);
+                       emit_reg(A_NOT,S_L,
+                         hregister2);
+                       emitlab(l);
+                    end;
+                end;
           end;
       end;
 
@@ -1436,7 +1446,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.3  2000-11-04 14:25:23  florian
+  Revision 1.4  2000-11-11 16:00:10  jonas
+    * optimize converting of 8/16/32 bit constants to 64bit ones
+
+  Revision 1.3  2000/11/04 14:25:23  florian
     + merged Attila's changes for interfaces, not tested yet
 
   Revision 1.2  2000/10/31 22:02:56  peter