Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2023-12

Internal "Signed wrap" function

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

J. Gareth Moreton

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

Reply by email