I wonder at the logic here, if the 64 bit ABI says the MM registers are not specified, then you treat them as unspecified registers in much the same way as the volatile registers in either win32 or 64. Leaving data in an unspecified register when there is the potential for them to be used in intervening code is just bad programming practice. I used to see these donkeys testing code under win32 and if they could get away with avoiding the specs of the ABI OR lack of them on one Windows version, they thought they could do it on all versions. There were many confused programmers when their code went BANG on another OS version.
The simple rule is ANY volatile register is unsafe when it can be used by other code.
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm64\include\masm64rt.inc
.code
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
entry_point proc
.stack
LOCAL.mm0 :QWORD
LOCAL.mm1 :QWORD
LOCAL.mm2 :QWORD
LOCAL.mm3 :QWORD
LOCAL.mm4 :QWORD
LOCAL.mm5 :QWORD
LOCAL.mm6 :QWORD
LOCAL.mm7 :QWORD
movq .mm0, mm0
movq .mm1, mm1
movq .mm2, mm2
movq .mm3, mm3
movq .mm4, mm4
movq .mm5, mm5
movq .mm6, mm6
movq .mm7, mm7
; -------------------------------------
; use and abuse your MMX registers here
; -------------------------------------
movq mm0, .mm0
movq mm1, .mm1
movq mm2, .mm2
movq mm3, .mm3
movq mm4, .mm4
movq mm5, .mm5
movq mm6, .mm6
movq mm7, .mm7
void(ExitProcess,0)
ret
entry_point endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end