Hello,

I am using FPC 2.0.0, Win32.

When subtracting a longword from a longword, FPC codes the
operation as if it were a 64-bit operation. This is not really
a bug since the code is correct but this uselessly increases
the running times and the sizes of the executables.

(I found no bug report about that)

For instance, with u, v and w Longwords, the following subtraction

  u := v - w;

is coded as

  movl  U_P$TEST2_V,%eax
  movl  $0,%ebx
  movl  U_P$TEST2_W,%ecx
  movl  $0,%edx
  subl  %ecx,%eax
  sbbl  %edx,%ebx
  movl  %eax,U_P$TEST2_U

Here, not only 2 movl's and 1 sbbl are useless but FPC also wastes
time to save/use/restore extra register(s).

At the moment, the only work around I found to make a subtraction
with Longwords is to write the operation this way:

  u := Longword(Longint(v) - Longint(w));

coded as

  movl  U_P$TEST2_V,%eax
  subl  U_P$TEST2_W,%eax
  movl  %eax,U_P$TEST2_U

notice that

  u := v;
  Dec(u,w);

  movl  U_P$TEST2_V,%eax
  movl  %eax,U_P$TEST2_U
  movl  U_P$TEST2_W,%eax
  subl  %eax,U_P$TEST2_U

shows there is no problem with Dec (the same with Pred(), if u is
a Longword, writing "u-1" is not ok but writing "Pred(u)" is ok).

mm

_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to