AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
Thema durchsuchen
Ansicht
Themen-Optionen

Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

Ein Thema von Assertor · begonnen am 7. Jan 2012 · letzter Beitrag vom 17. Sep 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.573 Beiträge
 
Delphi 12 Athens
 
#1

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 8. Jan 2012, 21:46
Hat das One einen besonderen Grund?
Das sollte doch im Prinzip eigentlich eine Konstante sein, dann noch Value(Cardinal) und One(Byte) zu verrechnen ist bestimmt auch nicht sonderlich optimal.
One als Cardinal wäre da besser, oder eben direkt als Konstante.

Ach ja, BOOL (LongBool bei 32 Bit) wäre bestimmt auch Optimaler, als Boolean.
Ich kenn leider keinen direkten booleanischen Delphi/Pascal-Typen, welcher sich anpaßt, aber die Windows-Adaption vom BOOL geht ja och.

In die Falle mit dem nicht mitwachsenden Integer sollten wir auch nicht gleich zu Anfang reinfallen, also NativeInt/NativeUInt.

Wie ist das Eigentlich mit der Geschwindigkeit von Sprüngen? (JUMPs)
Bei meinem Code gibt es 1 bis 2 Variablen weniger, aber dafür einen weiteren JUMP, wegen dem ELSE. (wenn nötig, ginge dann vermutlichdie zusätzliche LOOP)

Delphi-Quellcode:
{$IF not Defined(NativeInt)}
  const
    NativeInt = Integer;
    NativeUInt = Cardinal;
{$IFEND}

function CRCSetup(var CRCDef: TCRCDef; Polynomial, Bits, InitVector,
  FinalVector: NativeUInt; Inverse: BOOL): Boolean;
// initialize CRCDef according to the parameters, calculate the lookup table
const
  HighBit = $1 shl (SizeOf(NativeUInt) * 8 - 1);
var
  Index, Value, XorValue, OldValue: NativeUInt;
  B: BOOL;
begin
  if Bits >= 8 then
  begin
    CRCDef.Polynomial := Polynomial;
    CRCDef.Bits := Bits;
    CRCDef.CRC := InitVector;
    CRCDef.InitVector := InitVector;
    CRCDef.FinalVector := FinalVector;
    CRCDef.Inverse := Inverse;
    CRCDef.Shift := Bits - 8;
    CRCDef.Mask := -1 shr Byte(Bits);
    if Inverse then
    begin
      Bits := CRCDef.Bits;
      XorValue := 0;
      repeat
        Inc(XorValue, XorValue + Polynomial and $1);
        Polynomial := Polynomial shr 1;
        Dec(Bits);
      until Bits = 0;
      for Index := 255 downto 0 do
      begin
        Value := Index;
        if BOOL(Value and $1) then Value := (Value shr 1) xor XorValue else Value := Value shr 1;
        if BOOL(Value and $1) then Value := (Value shr 1) xor XorValue else Value := Value shr 1;
        if BOOL(Value and $1) then Value := (Value shr 1) xor XorValue else Value := Value shr 1;
        if BOOL(Value and $1) then Value := (Value shr 1) xor XorValue else Value := Value shr 1;
        if BOOL(Value and $1) then Value := (Value shr 1) xor XorValue else Value := Value shr 1;
        if BOOL(Value and $1) then Value := (Value shr 1) xor XorValue else Value := Value shr 1;
        if BOOL(Value and $1) then Value := (Value shr 1) xor XorValue else Value := Value shr 1;
        if BOOL(Value and $1) then Value := (Value shr 1) xor XorValue else Value := Value shr 1;
        CRCDef.Table[Index] := Value;
      end;
    end
    else
    begin
      Bits := -(Bits - 32);
      XorValue := Polynomial and CRCDef.Mask;
      XorValue := (XorValue shl Byte(Bits)) or (XorValue shr (32 - Byte(Bits)));
      for Index := 255 downto 0 do
      begin
        if BOOL(Index and $80) then Value := (Index shl 25) xor XorValue else Value := Index shl 25;
        if BOOL(Value and HighBit) then Value := (Value shl 1) xor XorValue else Value := Value shl 1;
        if BOOL(Value and HighBit) then Value := (Value shl 1) xor XorValue else Value := Value shl 1;
        if BOOL(Value and HighBit) then Value := (Value shl 1) xor XorValue else Value := Value shl 1;
        if BOOL(Value and HighBit) then Value := (Value shl 1) xor XorValue else Value := Value shl 1;
        if BOOL(Value and HighBit) then Value := (Value shl 1) xor XorValue else Value := Value shl 1;
        if BOOL(Value and HighBit) then Value := (Value shl 1) xor XorValue else Value := Value shl 1;
        if BOOL(Value and HighBit) then Value := (Value shl 1) xor XorValue else Value := Value shl 1;

        // oder
        // if NativeInt(Value) < 0 then Value := (Value shl 1) xor XorValue else Value := Value shl 1;
        // statt dem
        // if BOOL(Value and HighBit) then Value := (Value shl 1) xor XorValue else Value := Value shl 1;

        Value := (Value shr Byte(Bits)) or (Value shl (32 - Byte(Bits)));
        CRCDef.Table[Index] := Value;
      end;
    end;
    Result := True;
  end
  else
    Result := False;
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Jan 2012 um 21:52 Uhr)
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 8. Jan 2012, 21:56
Ich habe den Code schon "CPU-View" getuned. NativeInt ist falsch. Int32 wäre die bessere Wahl, aber DEC unterstützt ja auch noch ältere Delphi Versionen wo es noch kein Int32 gab. Das "One" habe ich eingeführt, da der Compiler immer ein "mov ecx, $000000001" eingefügt hat. Da ist der OpCode um einiges größer als wenn er "mov ecx,edi" schreibt (mit edi=$00000001). Wie schon geschrieben. Ich habe den Code "Delphi Compiler Output getuned".

Zum BOOL: Ich möchte hier so wenig wie möglich Compiler Magic haben.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.573 Beiträge
 
Delphi 12 Athens
 
#3

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 8. Jan 2012, 22:17
OK, dann isr das bei dem ONE eine blöde Angelegenheit.


Aber Int32 für 64 Bit?
Hier meinen doch viele man solle NativeInt verwenden, anstatt Integer, also vorallem bei Pointer-konvertierungen oder wenn man ganze Register nutzen will.




Das {$IF not Definied()} geht mindestens seit Delphi 7.
Wie es im FPC aussieht weiß ich nicht.

Zumindestens in Delphi finde ich Typ.Abhängigkeiten ab besser, als Compilerabhängigkeiten. (man weiß ja nie, was die Zukunft bringt)
Auch {$IF CompilerVersion < 21.0} empfinde ich besser als ein {$IFNDEF VER210} , denn hier ist es nicht so einfach einen "Versionsbereich" zu bestimmen, vorallem wenn man die (neueren) Versionen noch garnicht alle kennt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 8. Jan 2012, 22:49
Hab meinen Code noch mal überarbeitet (s.o.). Sieht auf den ersten Blick länger aus als er eigentlich ist wegen der Inline-Funktionen oben. Ob man es mit Inline-Funktionen oder ohne schöner findet, ist wohl Geschmackssache. Man könnte sie aber auch einfach einmal global definieren, da sie bei solchen Portierungen noch öfter von Nutzen sein könnten. In dem Fall wäre mein Funktionsrumpf dann besonders kompakt

Leider ist der Assembler-Code, den der Compiler aus meinem Code erzeugt dafür nicht so kompakt wie bei jbg...

Geändert von Namenloser ( 8. Jan 2012 um 22:51 Uhr)
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#5

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 9. Jan 2012, 08:52
Guten Morgen!

Bezüglich der Compiler-Defines: Kein Problem, das wird in der neuen DEC sowieso zentral geregelt, jeweils passend für alle Versionen.

Inlined im PurePascal ist so eine Sache, ich hatte schon bei Increment8 mit AddC so meine Probleme mit Delphi 2010, obwohl es unter anderen Versionen läuft: Das steigt der Compiler gerne mal mit einer AV aus. IIRC im QC gemeldet, aber nie so ganz gefixt.

Auf jeden fall nochmals Danke an alle Beteiligten, das ganze war ja jetzt ein kleines DEC FastCode Projekt

Ich werde dann hier Feedback geben, jetzt erstmal Arbeiten

Viele Grüße
Assertor
Frederik
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 9. Jan 2012, 11:33
Aber Int32 für 64 Bit?
Hier wird mit Daten hantiert, die 32Bit breit sind (Elemente von CRCDef.Table). Warum sollte man da NativeInt verwenden? Um dem 64bit Compiler etwa dazu zu zwingen, Code zu generieren, der ständig 32bit Werte auf 64bit erweitert, um sie im nächsten Schritt wieder auf 32bit zu schrumpfen?

Zitat:
Hier meinen doch viele man solle NativeInt verwenden, anstatt Integer, also vorallem bei Pointer-konvertierungen oder wenn man ganze Register nutzen will.
Hier wird weder eine Pointer-Konvertierung gemacht, noch braucht ein 32bit Wert ein 64bit Register

Die Variable "Index" könnte man als NativeInt deklarieren, aber das führt auch nur dazu, dass 255 als 8 Byte Wert im OpCode auftaucht und dass sämtliche OpCodes, die Index benutzen, mindestens 1 Byte größer sind ("REX Prefix").
  Mit Zitat antworten Zitat
JasonClark

Registriert seit: 16. Jan 2006
Ort: Luzern
7 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 9. Sep 2012, 17:51
Hallo Assertor und alle anderen

Ich wollte mal ganz kurz anfragen wie es denn nun so aussieht mit den Fortschritten def DEC 6.0 (64bit)?
Glaube ich bin nicht der einzigste der sich tierisch freuen würde endlich auf 64bit damit arbeiten zu können...

Danke für ein kurzes schnelles Statusfeedback im Voraus!
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#8

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 5. Mai 2017, 22:43
Ja, der Thread ist alt!

Ich habe nur eine Frage. Ich versuche gerade DEC 5.2 x64 zu kompilieren was natürlich schief geht. Ich habe bisher alles angepasst, was man hier in diesem Thread finden konnte.
Aber leider ist die Unit DECUtil noch voll von nicht funktionierendem ASM-Code.

Gibt es dafür eine Lösung bzw. gibt es eine schnelle DEC-Alternative? System.Hash ist mir zu lahm und Spring4D weiß ich leider nicht anzuwenden
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.240 Beiträge
 
Delphi 12 Athens
 
#9

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 6. Mai 2017, 06:34
Habs lange nicht benutzt, aber LockBox war eigentlich super für solche Dinge, zumindest für mich ...
Warum benutzt du nicht das ?

Rollo
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#10

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread

  Alt 6. Mai 2017, 15:36
Wie installiert man LockBox denn nicht einmal das schaffe ich.
Sieht super umständlich aus finde ich.

Geändert von a.def ( 6. Mai 2017 um 15:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:50 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