Wrong order of arguments in operator overloading?
Original Reporter info from Mantis: CandyMan
-
Reporter name: Radek
Original Reporter info from Mantis: CandyMan
- Reporter name: Radek
Description:
{$MODE OBJFPC}
type
Int128 = packed record // signed
case Byte of
0:(Low:QWORD; High:Int64);
1:(LowU:QWORD; HighU:QWORD)
end;
// wrong order of arguments in operator overloading
operator - (A:Int128):Int128; nostackframe; register;
// In FPC 2.2.4: A in eax, @Result in edx
// In FPC 2.4.0: A in edx, @Result in eax - is this intended?
assembler;asm
{$IFNDEF REGCALL}
MOV EAX,A
MOV EDX,@Result
{$ENDIF}
// edx:eax:ecx:ebx = negated 128 bit number
MOV ECX,[EAX+12] // edx
NOT ECX
MOV [EDX+12],ECX
MOV ECX,[EAX+08] // eax
NOT ECX
MOV [EDX+08],ECX
MOV ECX,[EAX+04] // ecx
NOT ECX
MOV [EDX+04],ECX
MOV ECX,[EAX+00] // ebx
OR EAX,-1
NEG ECX
MOV [EDX+00],ECX
SBB [EDX+04],EAX // ecx
SBB [EDX+08],EAX // eax
SBB [EDX+12],EAX // edx
end;
const
I:Int128 = (Low:1; High:0);
var
J:Int128;
begin
J:=-I;
WriteLn( (J.High = $FFFFFFFF) and (J.Low = $FFFFFFFF) );
end.
Mantis conversion info:
- Mantis ID: 15686
- Version: 2.4.0
Edited by Sven/Sarah Barth