Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi MMX: DWord -> QWord (https://www.delphipraxis.net/55702-mmx-dword-qword.html)

dizzy 25. Okt 2005 17:13


MMX: DWord -> QWord
 
Hiho, mal eine Frage an unsere MMX-Spezis.

Ich möchte gerne mehrere Farbwerte zueinander addieren, dabei aber pro Farbe auch Werte von über 255 zulassen. In meinem Fall würde ein Word reichen. Somit kam ich drauf, das mit MMX zu tun, da in die Register ja genau 4 Words hinein passen.
Damit ich überhaupt einen QuadWord-Datentyp habe, an den ich das Ergebnis übergeben kann, habe ich mir folgenden Typ deklariert:
Delphi-Quellcode:
type
  TColor64 = packed record
    a, r, g, b: Word;
  end;
Mit folgender Routine addiere ich nun ein paar Farbwerte in einer Schleife zusammen:
Delphi-Quellcode:
var
  c: DWord;
  acc: TColor64;
.
.
  asm
    MOVD       MM1, c
    PUNPCKLBW  MM1, MM0
    MOVQ       MM2, acc
    PADDUSW    MM1, MM2
    MOVQ       acc, MM1
    EMMS
  end;
Das scheint nur leider nicht so zu klappen - die Werte die hinten herauskommen sind schlicht nicht plausibel. Allein schon das reine Entpacken von "c" in "acc" mit folgendem Code führt zu nicht nachvollziehbaren Ergebnissen:
Delphi-Quellcode:
asm
  MOVD       MM1, c
  PUNPCKLBW  MM1, MM0
  MOVQ       acc, MM1
  EMMS
end;
In "acc" stehen nachher wilde Werte. Bytes vertauschen hat subjektiv jetzt auch nicht grad geholfen, und das "acc" in "[acc]" zu ändern auch nicht wirklich... :stupid:

Ziel wäre also, dass wenn in "c" z.B. $FF0000C0 steht, nachher acc.a=255(FF), acc.r=0, acc.g=0, acc.b=192(C0) wird. Wo liegt mein Hirnknoten? :)

Besten Dank schonmal!
Fabian

dizzy 25. Okt 2005 22:36

Re: MMX: DWord -> QWord
 
Okay, Problem gelöst :)
Ein MOVQ kann wohl nicht in eine Speicheradresse schreiben, sondern nur auf MMX-Register. Schade dass das die IDE nicht bemerkt, und auch zur Laufzeit kein Fehler ausgespuckt wird. Die Lösung ist: Erst niederwertiges DWord wegschreiben, dann 32 Bits shiften, dann wieder das neue low-DWord speichern. Nachher noch zu Words zerfrickeln, und die Sache ist gegessen. Nicht ganz so schön wie ich mir das gewünscht hätte, aber immernoch schneller als ohne MMX :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz