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...
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel