Ich hab zwar keine Ahnung, was eine FPC/XE2 kompatible x64 ABI ist, aber ich habe einfach mal selbst eine PurePascal-Variante für 32-Bit geschrieben:
Delphi-Quellcode:
type
TData = packed array[0..7] of LongWord;
procedure Increment8Pure(var Value; Add: LongWord);
var
HiBits: LongWord;
Add8: LongWord;
Data: TData absolute Value;
Carry: Boolean;
procedure AddC(var Value: LongWord; const Add: LongWord; var Carry: Boolean); inline;
begin
if Carry then
begin
Value := Value + 1;
Carry := (Value = 0); // we might cause another overflow by adding the carry bit
end
else
Carry := False;
Value := Value + Add;
Carry := Carry or (Value < Add); // set Carry Flag on overflow
end;
begin
HiBits := Add shr 29; // Save most significant 3 bits in case an overflow occurs
Add8 := Add * 8;
Carry := False;
AddC(Data[0], Add8, Carry);
AddC(Data[1], HiBits, Carry);
AddC(Data[2], 0, Carry);
AddC(Data[3], 0, Carry);
AddC(Data[4], 0, Carry);
AddC(Data[5], 0, Carry);
AddC(Data[6], 0, Carry);
AddC(Data[7], 0, Carry);
if Carry then
HashingOverflowError;
end;
Im Anhang befindet sich zur Sicherheit ein Testprogramm, das einige Werte addiert und dabei die Ergebnisse meiner Funktion mit dem Original vergleicht. Es werden ein paar Werte übersprungen („boost“), weil es natürlich im wahrsten Sinne des Wortes ewig dauern würde, alle 2^XXX Werte durchzuiterieren, aber die relevanten Konstellationen sind denke ich abgedeckt. Natürlich besteht meine Funktion den Test, sonst würde ich sie ja nicht hier posten
Wie gesagt ist die Funktion für 32-Bit-Systeme ausgelegt, da ich 1. nur ein 32-Bit-Windows und 2. nur ein 32-Bit-Delphi besitze. Sollte aber kein Problem sein, sie ggf. auf 64 Bit anzupassen.