assemblyx86simdsse

Push XMM register to the stack


Is there a way of pushing a packed doubleword integer from XMM register to the stack? and then later on pop it back when needed?

Ideally I am looking for something like PUSH or POP for general purpose registers, I have checked Intel manuals but I either missed the command or there isn't one...

Or will I have to unpack values to general registers and then push them?


Solution

  • No, there is no such a asm instruction under x86, but you can do something like:

    //Push xmm0
    sub     esp, 16
    movdqu  dqword [esp], xmm0
    
    //Pop xmm0
    movdqu  xmm0, dqword [esp]
    add     esp, 16
    

    EDIT:

    Upper code sample is direct push/pop emulation.

    In case that you are using on stack also other local variables, than the ebp register must be at first properly set, like:

    push ebp
    mov  ebp, esp
    sub  esp, LocaStackVariablesSize
    //... your code
    mov  esp, ebp
    pop  ebp  
    ret
    

    In that case you can also use Daniels solution!