AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

MMX: DWord -> QWord

Ein Thema von dizzy · begonnen am 25. Okt 2005 · letzter Beitrag vom 25. Okt 2005
Antwort Antwort
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#1

MMX: DWord -> QWord

  Alt 25. Okt 2005, 17:13
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
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: MMX: DWord -> QWord

  Alt 25. Okt 2005, 22:36
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:44 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