![]() |
AW: 256 bit Integer Addition von ASM in PurePascal
Zitat:
Nja, ein kleiner zusätzlicher Befehl, um das zu leeren/sicherzustellen, sollte auch nicht so sehr stören. Für eine zukünftig unbestimmte Portierungen auf weitere Systeme/CPUs wäre jeweils eine (zusätzliche) PurePascal-Variante bestimmt kein Nachteil. |
AW: 256 bit Integer Addition von ASM in PurePascal
Zitat:
Zitat:
|
AW: 256 bit Integer Addition von ASM in PurePascal
Zitat:
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; |
AW: 256 bit Integer Addition von ASM in PurePascal
Nice, Andreas :)
Zitat:
Delphi-Quellcode:
Sollte imo also kein Problem sein.
procedure HashingOverflowError;
begin raise EDECHashException.CreateRes(@sHashingOverflowError); end; Zitat:
Zitat:
Nun gut, ich kenne FPC nicht weiter, möglicherweise ist dies bekannt und über Defines steuerbar. Ggf bleibt dort der Weg über PurePascal, was wegen der breiteren Unterstützung ja mit o.g. Delphi Code möglich ist. Übrig sind noch gut 9 Assembler Funktionen, bis zur Lauffähigkeit. Wenn keine Einwände bestehen, würde ich diese gerne ebenfalls in diesem Thread zur Diskussion stellen. @Andreas: Gerade schon ein Ping für Dein IDEAMul Post bekommen. Wow, Du bist schnell :) Gruß Assertor P.S: Das wird eine lange Namensliste im ChangeLog - Attribution to Himitsu, Jaenicke, jbg, NamenLozer (alphabetisch) :) |
AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
So, weiter geht es (*):
Delphi-Quellcode:
Bei RandomSystemTime wird es tricky: QueryPerformanceCounter in RandomSystemTime ist natürlich ein No-Go für Crossplatform, also bleibt nur PurePascal.
function DoRndBuffer(Seed: Cardinal; var Buffer; Size: Integer): Cardinal; assembler;
// comparable to Borlands Random() function asm AND EDX,EDX JZ @@2 AND ECX,ECX JLE @@2 PUSH EBX @@1: IMUL EAX,EAX,08088405H // 134775813 INC EAX MOV EBX,EAX SHR EBX,24 MOV [EDX],BL INC EDX DEC ECX JNZ @@1 POP EBX @@2: end; function RandomSystemTime: Cardinal; assembler; // create Seed from Systemtime and PerformanceCounter var SysTime: record Year: Word; Month: Word; DayOfWeek: Word; Day: Word; Hour: Word; Minute: Word; Second: Word; MilliSeconds: Word; Reserved: array [0..7] of Byte; end; Counter: record Lo, Hi: Integer; end; asm LEA EAX,SysTime PUSH EAX CALL GetSystemTime MOVZX EAX,Word Ptr SysTime.Hour IMUL EAX,60 ADD AX,SysTime.Minute IMUL EAX,60 MOVZX ECX,Word Ptr SysTime.Second ADD EAX,ECX IMUL EAX,1000 MOV CX,SysTime.MilliSeconds ADD EAX,ECX PUSH EAX LEA EAX,Counter PUSH EAX CALL QueryPerformanceCounter POP EAX ADD EAX,Counter.Hi ADC EAX,Counter.Lo end; Kennt da jemand was, was auch FPC versteht? Wie gesagt, ich arbeite nicht mit FPC, das hier ist nur für die Vielen, die danach fragen... Ich muß erstmal die RTL von XE2 durchsuchen, ob es eine Win/OSX Kapselung gibt. Falls sich jemand fragt, wie viel noch kommt: die CRC Funktionen (5 an der Zahl). @Himitsu: Hattest Du nicht schonmal LHSZ für FPC bzw. x64 portiert? Ich meine mich da an irgendwas zu erinnern... Ihr seid klasse :) Während hier Code gepostet wird, kann ich schon an anderer Stelle weitermachen - so könnte die DEC 6.0 wirklich was werden! Gruß Assertor (*) Kein Edit, für die Benachrichtigung - Andreas hat ja gerade einen Lauf :) |
AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
Also für beide Funktionen ist überhaupt kein Assembler notwendig. Vor allem nicht für DoRndBuffer. Delphi generiert da fast haargenau den selben Assemblercode.
Was aber bei allen PurePascal Funktionen wichtig ist, ist dass {$RANGECHECKS OFF} genutzt wird, da sonst die gewünschten Arithmetiküberläufe zu Exceptions führen.
Delphi-Quellcode:
function RandomSystemTime: Cardinal;
// create Seed from Systemtime and PerformanceCounter type TInt64Rec = packed record Lo, Hi: LongWord; end; var {$IFDEF MSWINDOWS} SysTime: TSystemTime; {$ELSE} Hour, Minute, Second, Milliseconds: Word; {$ENDIF MSWINDOWS} Counter: TInt64Rec; Time: Cardinal; begin {$IFDEF MSWINDOWS} GetSystemTime(SysTime); Time := ((Cardinal(SysTime.wHour) * 60 + SysTime.wMinute) * 60 + SysTime.wSecond) * 1000 + SysTime.wMilliseconds; QueryPerformanceCounter(Int64(Counter)); {$ELSE} DecodeTime(Now, Hour, Minute, Second, Milliseconds); Time := ((Cardinal(Hour) * 60 + Minute) * 60 + Second) * 1000 + Milliseconds; Int64(Counter) := TStopwatch.GetTimeStamp; // uses System.Diagnostics {$ENDIF MSWINDOWS} Result := Time + Counter.Hi; Inc(Result, Ord(Result < Time)); // add "carry flag" Inc(Result, Counter.Lo); end; function DoRndBuffer(Seed: Cardinal; var Buffer; Size: Integer): Cardinal; // comparable to Borlands Random() function var P: PByte; begin Result := Seed; P := @Buffer; if P <> nil then begin while Size > 0 do begin Result := Result * $08088405 + 1; P^ := Byte(Result shr 24); Inc(P); Dec(Size); end; end; end; |
AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
Zitat:
Selber arbeite ich nicht mit FPC (das Mistding Compilerchen mochte mich nicht ... vonwegen installieren und fertig). Ich könnte höchsten mal sehn, ob ich noch was (wieder)finde. Ach ja, mit kleinem h :zwinker: Ich kenn zwar noch eine Himitsu, aber die hat es nicht so, mit dem Programmieren. :stupid: |
AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
Liste der Anhänge anzeigen (Anzahl: 1)
Danke, Andreas!
Damit komme ich viel weiter, TStopWatch muß ich nur unter FPC ersetzen - aber da findet sich was. Ich hänge die letzte Datei einfach mal an, dort sind 5 Funktionen zur CRC16/CRC32 Berechnung. Hagen hatte den Code seinerzeit sicherlich auf Performance optimiert. In PurePascal wird das schon etwas schwieriger... Zitat:
Falls Du die Anpassungen noch hast, gerne her damit. Es steht inzwischen fest, dass ich lediglich die CPU.pas, ASN1.pas und TypInfoEx.pas *nicht* mehr weiterpflege. Diese fliegen raus aus der DEC und werden in ein Tools Archiv verschoben - für den Crypto Einsatz sind diese auch nicht notwendig. Ja, ich weiß. ASN1... Trotzem, nicht für den üblichen DEC Anwender. Tricky wird dann noch, überall die Kompatibilität herzustellen und zu prüfen (DEC 5.1 <> DEC 6.0), also bitte nicht in den nächsten Wochen mit einem Release rechnen. Ich poste dann, wenn ich Beta Tester suche (x32/x64, C++ Builder, Delphi, FPC, Win, Mac und Linux... puh!). Viele Grüße Assertor |
AW: 256 bit Integer Addition von ASM in PurePascal
Zitat:
|
AW: 256 bit Integer Addition von ASM in PurePascal
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz