mmx/sse ladeops.



  • hallo,

    ich überlege gerade ob es eine möglichkeit gibt ein mmx/sse register mit einem wert aus dem speicher zu füllen (der nicht so gross ist wie der gesamte register). also quasi: im speicher liegt der wert a mit der grösse 32 bit. mein register ist 64/128 breit. wenn ich jetzt mit movq/movups aus dem speicher lade habe ich (a,zufall,zufall,zufall) im register ich hätte aber gerne a,a,a,a.

    meine idee wäre a,a im speicher anzulegen. damit löst sich das problem bei movq von selbst. und bei sse müsste ich: movlps und movhps benutzen (sei a jetzt einfach mal ein float...)..

    wenn es aber eine möglichkeit gebe a in einen erweiterten register zu laden (meinetwegen eax) und von dort aus mm0/xmm0 aufzufüllen wäre das doch im prinzip geschickter... oder sehe ich das falsch?.

    gruss

    eviluser

    ps: ich finde es echt interessant wie unterschiedlich die schwerpunkte bei den erweiterten befehlen gewählt wurden (im direkten vergleich von mmx/3dnow/sse/sse2).


  • Mod

    in zwei schritten geht es immer:

    movss xmm0, a
    shufps xmm0, xmm0, 0
    

    analog mit mmx und pshufw

    movlps/movhps ist allerdings schneller, falls a sowieso bereits verdoppelt vorliegt.



  • die idee mit movlps/movhps ist mir auch erst gekommen als ich das geschrieben habe. ich war mir nur über die geschwindigkeit nicht sicher.. das a vierfach im speicher abzulegen kam mir etwas sinnlos vor.. doppelt ist ja geradenoch vertretbar.


Anmelden zum Antworten