Entwickler-Ecke

Free Pascal - Synopse JpegDecode mit FPC 3 64Bit übersetzen


Sinspin - Fr 22.06.18 11:57
Titel: Synopse JpegDecode mit FPC 3 64Bit übersetzen
Hallo ich versuche gerade den Synopse fast Jpeg Decoder unter FPC 3 Win64 zum laufen zu bekomen.
Das Projekt scheint bisher nur für ältere Versionen übersetzt worden zu sein, auch wenn sich hinweise auf FPC 3 finden.
Ich bekomme Fehlermeldungen aus dem Assemblerpart die auf einen fehlenden Compilerschalter hindeuten.

Was FPC angeht bin ich noch ein noob, erst recht wenn es um defines und compiler schalter geht.
Ich bekomme Meldungen wie :

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Projekt kompilieren, Ziel: lib\x86_64-win64\Project1.exe: Exit code 1, Fehler: 50, Warnungen: 772
        push        0
jpegdec.pas(214,21) Warning: No size specified and unable to determine the size of the operands, using DWORD as default
        push        eax
jpegdec.pas(213,9) Error: Asm: [push reg32] invalid combination of opcode and operands
        dd offset @TBL_8x8_04 // offsets will be recalculated in JpegDecode()
jpegdec.pas(277,12) Error: Assembler syntax error in constant
        mov     ecx, dword ptr [ebp + 000000C8H]
jpegdec.pas(631,48) Warning: Use of +offset(%ebp) for parameters invalid here
        movaps  xmm7, dqword ptr [ebp + 000000E0H]
jpegdec.pas(635,50) Warning: Check size of memory operand "movaps: memory-operand-size is 128 bits, but expected [128 bits + 224 byte offset]"

Wenn niemand eine plötzliche Eingebung hat, wende ich mich an die Entwikler und schau mal ob da was kommt.

Synopse Webseite [https://synopse.info/fossil/wiki/Synopse+OpenSource]
jpegdec Sourcecode [https://synopse.info/files/jpegdec.zip]

Danke für eure Hilfe.

€1: Links hinzugefügt.


Delete - Sa 23.06.18 05:47

- Nachträglich durch die Entwickler-Ecke gelöscht -


Anwender - Sa 23.06.18 22:59

ich bin mir nicht sicher, aber mit inline-ASsembler Code kann Freepascal glaub ich nicht so gut umgehen ...
da werden nicht alle Befehle unterstützt, hab ich mal irgendwo gelesen.
Kann aber mittlerweile auch gefixt sein - dann wird es was anderes sein.


Sinspin - So 24.06.18 08:52

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du den Source verlinkst, könnte ich dir vielleicht weiter helfen.
Habe ich gemacht. Im ersten Post.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Eins vorweg: Funktioniert das Projekt in Win32 Anwendungen, mit FPC ausgeführt?
Gute Frage, ich freu mich das alles nach der Installation auf Win10/64 ohne Probleme läuft.
Mein Programm sollte später dann auch 64Bit sein, das spart mir einiges an (Speicher)Problemen.

Wenn nur 32Bit geht muss ich das Programm doch aufteilen und via IPC die Daten schaufeln, aber genau das wollte ich vermeiden.

Ich schau Heute Abend mal nach wie man 32 bit übersetzt und probier es mal.

user profile iconAnwender hat folgendes geschrieben Zum zitierten Posting springen:
ich bin mir nicht sicher, aber mit inline-ASsembler Code kann Freepascal glaub ich nicht so gut umgehen ...
Laut Dokumentation im Quelltext war mal ein übersetzen möglich. Ich habe leider keine Info gefunden ob 32 oder 64 Bit.


Horst_H - So 24.06.18 09:46

Hallo,

für 32-Bit könnte es klappen.
Natürlich meckert der Compiler wenn Assembler 32-Bit Code nun auf 64 Bit compiliert wird.
Die Register sind ja jetzt 64 Bit breit und damit auch Pointer.

Quelltext
1:
2:
3:
4:
5:
6:
7:
   push        eax
jpegdec.pas(213,9) Error: Asm: [push reg32] invalid combination of opcode and operands
jetzt push RAX;
...
        mov     ecx, dword ptr [ebp + 000000C8H]
jpegdec.pas(631,48) Warning: Use of +offset(%ebp) for parameters invalid here
Zeiger sprich hier Basis Register 64 Bit also RBP


Da sind einige Fallstricke.

Gruß Horst


Sinspin - So 24.06.18 14:45

Soweit habe ich noch nichtmal gedacht. Aber Du wirst recht haben. Ich hatte die Vermutung das es am neuen FPC liegt und nen Compilerschalter falsch ist.
Wenn ich überlege was Compiler Heutzutage übersetzen können, hatte ich erwartet dass der Umstieg auf 64Bit für den Assembler Complier weniger aufwendig wäre, bzw. dass sich der Befehlssatz für 64Bit unterscheidet, und der Compiler einfach den für die Plattform passenden Code erzeugt.
Aber richtig, für 64Bit ist die Speicheradressierung ja anders und so ziemlich alle Befehle haben eine Variante mit Speicherzugriff bei der Zeiger nun 64Bit sein müssen.

Dann werde ich wohl vorerst nicht um ein 32Bit Modul rumkommen.


Sinspin - Fr 29.06.18 19:44

Ich habe mir den neusten Lazarus/FPC installiert und das cross complie addon für Win32.
Es klappt auch dann mit übersetzen (Richtung Win32) nicht.

Quelltext
1:
2:
        dd offset @TBL_8x8_04 // offsets will be recalculated in JpegDecode()
jpegdec.pas(277,12) Error: Assembler syntax error in constant

Es wird "offset" markiert.
Zudem kommen massig Warnungen, auch zu einigen in Lazarus deklarierten Konstanten die typlos deklariert wurden.

Ist schon witzig das ein Compiler der Pascal in Maschienencode übersetzen kann nicht mit Assembler klar kommt, bei dem es sich ja um lesbaren Maschienencode handelt.
Wobei auch Delphi einige Probleme haben soll. Deswegen sind hier ein paar Umwege implementiert worden um SSE/SSE2 verwenden zu können. Nun scheint es genau dort zu scheitern.

Wenn ich noch was rausfinde, landet es hier.