Thank you!  I knew it must have been something simple like that!

I just did a quick test with x86 assembly language - this is the code that used to run for dividing min_int by -1:

MOV EAX, $80000000
NEG EAX

EAX contains $80000000 as a result.  When using IDIV:

MOV EAX, $80000000
MOV EDX, $FFFFFFFF // Sign extension
MOV ECX, -1
IDIV ECX

Exception SIGFPE raised.

I understand now.  Thanks for pointing out min_int div -1.  I'll experiment a bit more though to see if generating the setup is necessary in all circumstances (e.g. if an unsigned operand is being expanded into a larger signed value, it isn't necessary). At the very least, I'll add a new test for this and also put a comment in the code so it's clear why -1 needs special treatment (the fact I got no regressions means this very specific set-up is not tested properly).

Kit

On 15/05/2023 17:43, Kirinn via fpc-devel wrote:
I didn't see a mention of it in this discussion thread, but dividing the
largest negative integer by -1 does cause an overflow error of some sort,
because of two's complement.

Just to make sure, do (min_int div -1) and (min_int mod -1) behave the same
way before and after this proposed change? And, what min_int is of course
depends on whether targeting a 32-bit or 64-bit system, so best check both
cases.

~Kirinn

On Mon, 15 May 2023 17:21:30 +0100
"J. Gareth Moreton via fpc-devel" <fpc-devel@lists.freepascal.org> wrote:

I made a merge request that removes the comparison against -1.
x86_64-win64 and i386-win32 pass without any regressions, so the reason
behind the change still eludes me.  Maybe my fix for #39646 removes the
need for it?

https://gitlab.com/freepascal.org/fpc/source/-/merge_requests/418

Kit

On 11/05/2023 23:04, J. Gareth Moreton via fpc-devel wrote:
Fair enough, but I would like an explanation as to why it's necessary,
because the reason for testing -1 in particular is very unclear, and I
wonder if there's a known misbehaviour with a particular division
function with -1.

Kit
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to