incorrect range check error / compiling 32 bit with -CpCOREAVX2
FPC 3.3.1 (maybe others / others not tested)
Using a 32bit fpc on Windows (Win 10)
Compile with fpc.exe -MObjFPC -Scaghi -Cirot -O2 -gw3 -gl -l -vewnhibq -CpCOREAVX2 project1.lpr
The range check error only happens with -CpCOREAVX2
program Project1;
{$Mode objfpc}
function MathRound(AValue: ValReal): Int64; inline;
begin
if AValue >= 0 then
Result := Trunc(AValue + 0.5)
else
Result := Trunc(AValue - 0.5);
end;
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer;
begin
if nDenominator = 0 then
Result := -1
else
if nNumerator = nDenominator then
Result := nNumber
else
Result := MathRound(int64(nNumber) * int64(nNumerator) / nDenominator);
end;
begin
writeln(
MulDiv(-13, 72, 96)
);
end.
0000000000401636 66660F1F840000000000 nop word ptr [eax+eax+$00000000]
0000000000401640 D97C241C fnstcw word ptr [esp+$1C]
0000000000401644 D97C2418 fnstcw word ptr [esp+$18]
0000000000401648 66814C241C000F or [esp+$1C],$0F00
000000000040164F DB6C2408 fld tbyte ptr [esp+$08]
0000000000401653 DB2D10F04000 fld tbyte ptr [$0040F010]
0000000000401659 DEE9 fsubp st(1),st(0)
000000000040165B D96C241C fldcw word ptr [esp+$1C]
000000000040165F DF7C2420 fistp qword ptr [esp+$20]
0000000000401663 D96C2418 fldcw word ptr [esp+$18]
0000000000401667 9B fwait
0000000000401668 8B742420 mov esi,[esp+$20]
000000000040166C 8B442424 mov eax,[esp+$24]
0000000000401670 85C0 test eax,eax
0000000000401672 740A jz +$0A # $000000000040167E MulDiv+206 project1.lpr:20
0000000000401674 83F8FF cmp eax,$FF
0000000000401677 7414 jz +$14 # $000000000040168D MulDiv+221 project1.lpr:20
0000000000401679 E8123C0000 call +$00003C12 # $0000000000405290 fpc_rangeerror
000000000040167E 81FEFFFFFF7F cmp esi,$7FFFFFFF
0000000000401684 7610 jbe +$10 # $0000000000401696 MulDiv+230 project1.lpr:20
0000000000401686 E8053C0000 call +$00003C05 # $0000000000405290 fpc_rangeerror
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
000000000040168B EB09 jmp +$09 # $0000000000401696 MulDiv+230 project1.lpr:20
000000000040168D 85F6 test esi,esi
000000000040168F 7C05 jl +$05 # $0000000000401696 MulDiv+230 project1.lpr:20
0000000000401691 E8FA3B0000 call +$00003BFA # $0000000000405290 fpc_rangeerror
0000000000401696 89F3 mov ebx,esi
C:\Users\martin\AppData\Local\Temp\project1.lpr:21 end;
The error happens at 0040168B (2nd last line). esi is 0 / eax is 201