efriedma added a comment.

> Are you saying that using MMX in LLVM requires source-level workarounds in 
> some way, and so we can't lower portable code to use MMX because that code 
> will (reasonably) lack those workarounds?

Yes.

The x86 architecture requires that a program executes an "emms" instruction 
between any MMX instructions, and any x87 instructions.  Otherwise, the x87 
instructions will produce nonsense results.  LLVM, and other compilers, never 
insert emms automatically; this is partially historical, but also because emms 
can be expensive on Intel chips. Instead, the user is expected to call 
_mm_empty() in appropriate places.

To allow users to generate arbitrary vector IR without tripping over this, LLVM 
does not lower vector IR to MMX instructions; instead, it only generates MMX 
instructions for operations using the special type x86_mmx. If any instruction 
or argument has a result or operand of type x86_mmx in LLVM IR, the user must 
explicitly execute emms (@llvm.x86.mmx.emms() in IR, _mm_empty() in C) between 
that instruction, and any code that might use x87 registers.   "Between" isn't 
really sound because emms intrinsic doesn't reliably prevent code motion of 
floating-point operations, but it works well enough in practice.  (See also 
https://bugs.llvm.org/show_bug.cgi?id=35982 .)

On the clang side, without this patch, we only generate code using the x86_mmx 
type in a couple places: _mm_* calls, and inline asm with an MMX operand.  If 
the user does not use either of those, there will never be any values of type 
x86_mmx, so there will never be any MMX instructions, and we avoid the whole 
mess.  64-bit vector operations get lowered to SSE2 instructions instead (or 
scalarized).

This patch introduces a new place where clang will generate the type x86_mmx: 
for call arguments and return values.  This means more places where the user is 
required to write _mm_empty() to get correct behavior.


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59744/new/

https://reviews.llvm.org/D59744



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to