Hi everyone,
I'm just fixing a bugged optimisation, and I came across a situation
where I need to essentially do a "signed wrap" of a constant. At one
point I'm optimising "subl $-12,%eax", "addl $1,%eax" into a single
instruction, but to make sure (untrapped) overflows are handled
correctly, the calculated constant has to be wrapped modulo 32 (since
%eax is a 32-bit constant). Normally this is as simple as performing a
bitwise AND against $FFFFFFFF, but it produces the number 4294967285
rather than the more compact -11 (this is because the operands are
stored as 64-bit integers within the compiler). Storing the smaller
negative number will most likely result in a smaller number of bytes in
the final machine code as well as avoid any potential assembler errors.
Currently I'm just using a local function to perform the sign extension
of arbitrary length (since I have to extend either an 8-bit, 16-bit or
32-bit value depending on the operand size). Does the compiler contain
such a function already in a utility unit, and if not, would one be
welcomed?
Kit
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel