https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91841

Uroš Bizjak <ubizjak at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hjl.tools at gmail dot com

--- Comment #5 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Matthias Kretz from comment #4)
> (In reply to Uroš Bizjak from comment #3)
> > [f]emms should be emitted by an intrinsic (_mm_empty), inserted by the
> > programmer. The programmer can mix FP and MMX instructions in the same
> > function, so there is no way for compiler to automatically emit emms.
> 
> But that was my original point. In #0 the programmer did not mix FP and MMX
> instructions, only float and ushort [[gnu::vector_size(8)]] (which isn't
> even the same type as __m64) operations. The compiler did it. ;-) In that
> case, I understand 2.2.1 p3 as a requirement on the compiler. I sure agree
> that the use of MMX intrinsics puts the responsibility with the developer,
> but use of vector_size(8)?

Hm, ICC is of no help here, as it ignores attribute:

f(unsigned short):
        push      rbp                                           #6.28
        mov       rbp, rsp                                      #6.28
        sub       rsp, 16                                       #6.28
        mov       WORD PTR [-16+rbp], di                        #6.28
        movzx     eax, WORD PTR [-16+rbp]                       #6.37
        leave                                                   #6.37
        ret                                                     #6.37

Let's ask ABI expert about this.

> > Obviously, when the function returns value in %mm0 register (or in %fp),
> > emms should not be inserted at function exit.
> 
> Right. Does that mean you agree the ABI document is contradicting itself?

Yes, unfortunately.

Reply via email to