intel to at&t



  • ich versuche gerade einfache funktionen die inline asm (sse) benutzen vom intel syntax zum at&t syntax um zu schreiben. gcc meckert immer

    /tmp/ccY8EQi0.s:3845: Error: suffix or operands invalid for `sqrtss'
    /tmp/ccY8EQi0.s:3846: Error: suffix or operands invalid for `movss'
    

    was mache ich falsch, bräuchte ein paar hilfestellungen

    // intel
    __asm
    {
    	sqrtss xmm0, value 
    	movss  fValue, xmm0
    }
    
    // at&t
    asm volatile(
    	"sqrtss %0\n"
    	"movss %0\n"
    	: "=rm"(fValue)
    	: "r"(fValue));
    

    ps: ich möchte compilerswitches für den intel syntax wenn möglich vermeiden


  • Mod

    wenn ein befehl mit intel syntax 2 operanden braucht, ist das auch mit at&t syntax so 😉 (bis auf ausnahmen)
    abgesehen davon vermeidest du am besten explizite load-befehle soweit wie möglich. die kann der compiler auch allein einfügen, wenn nötig:

    asm volatile(
        "sqrtss %1,%0\n"
        : "=r"(fValue)
        : "rm"(value));
    

    völlig ungetested, hab grad keinen compiler zur hand.

    PS.: ich glaub "r" ist auch nicht der korrekte bezeichner für xmm register - schau am besten nochmal ins handbuch.



  • Warum nimmst du dafür Inline-Assembler? Der GCC stellt dir dafür auch Builtin Funktionen zur Verfügung. Sollte einfacher zu benutzen sein, da man Fehler schneller findet und der Compiler auch versteht was du willst:
    http://gcc.gnu.org/onlinedocs/gcc-4.0.1/gcc/X86-Built_002din-Functions.html#X86-Built_002din-Functions



  • hat ich fast den thread vergessen 😃

    @camper ok ich werde mich mal durch die developer site von intel quälen, ausser du weisst wo ich ne gute docu finde.

    @kingruedi
    ich wollte während der laufzeit die cpu auslesen und dann entsprechend funktionspointer setzen. ich denk nicht das ich meinen pointer auf diese funktionen setzen kann ohne irgendwelche zusatzlibs. kennst du vielleicht noch eine andere(bessere) möglichkeit?


Anmelden zum Antworten