Registriert seit: 12. Jun 2002
3.483 Beiträge
Delphi 10.1 Berlin Professional
|
AW: 256 bit Integer Addition von ASM in PurePascal
8. Jan 2012, 13:08
Ich stelle hier schonmal die nächste ASM Funktion zur Diskussion und Hijacke damit meinen eigenen Thread:
Delphi-Quellcode:
{ TODO : Consider implementing IDEAMul() as PurePascal if porting to FPC }
function IDEAMul(X, Y: LongWord): LongWord; assembler;
asm
AND EAX,0FFFFh
JZ @@1
AND EDX,0FFFFh
JZ @@1
MUL EDX
MOV EDX,EAX
MOV ECX,EAX
SHR EDX,16
SUB EAX,EDX
SUB CX,AX
ADC EAX,0
RET
@@1: LEA EAX,[EAX + EDX - 1]
NEG EAX
end;
Hier die Win64 kompatible Version. Ein "MOV EAX,ECX" das den ersten Parameter in EAX kopiert, reicht aus und alles läuft wie gewohnt weiter.
Delphi-Quellcode:
function IDEAMul(X, Y: LongWord): LongWord; assembler;
asm
{$IFDEF CPUX64}
MOV EAX,ECX
{$ENDIF CPUX64}
AND EAX,0FFFFh
JZ @@1
AND EDX,0FFFFh
JZ @@1
MUL EDX
MOV EDX,EAX
MOV ECX,EAX
SHR EDX,16
SUB EAX,EDX
SUB CX,AX
ADC EAX,0
RET
@@1: LEA EAX,[EAX + EDX - 1]
NEG EAX
end;
UPDATE:
Und hier die PurePascal Version:
Delphi-Quellcode:
function IDEAMul(X, Y: LongWord): LongWord;
begin
X := X and $FFFF;
if X <> 0 then
begin
Y := Y and $FFFF;
if Y <> 0 then
begin
X := X * Y;
Result := X - (X shr 16);
if Word(X) < Word(Result) then // carry flag check for "sub cx,ax"
Inc(Result);
Exit;
end;
end;
Result := -(X + Y - 1);
end;
Geändert von jbg ( 8. Jan 2012 um 13:24 Uhr)
|
|
Zitat
|