Open Quuxplusone opened 5 years ago
Bugzilla Link | PR41029 |
Status | NEW |
Importance | P normal |
Reported by | Wei Xiao (wei3.xiao@intel.com) |
Reported on | 2019-03-11 02:47:50 -0700 |
Last modified on | 2021-01-09 11:42:35 -0800 |
Version | trunk |
Hardware | PC Linux |
CC | craig.topper@gmail.com, hjl.tools@gmail.com, jyknight@google.com, llvm-bugs@lists.llvm.org, llvm-dev@redking.me.uk, neeilans@live.com, richard-llvm@metafoo.co.uk, wei3.xiao@intel.com |
Fixed by commit(s) | |
Attachments | |
Blocks | |
Blocked by | PR42319 |
See also |
Looks like this was originally changed (broken) in https://github.com/llvm/llvm-project/commit/651c1839ee7b7d72d90982615201dcf6b2299a91 back in 2013.
https://reviews.llvm.org/D59744 is a recent attempt to fix this bug, but was reverted because it broke (at least) chromium on x86-32 -- in part due to to bug 42319.
I think that it's likely preferable to continue violating this ABI requirement
indefinitely, and not fix this. Clang has already been violating it for 7+
years, and there's not a whole lot of demand to change here.
And, unfortunately, there's a very significant downside to changing, here.
Adding any more usage of MMX is a giant foot-gun, due to the x87/mmx mode-
switching issues.
After PR42320 is implemented, there will be no use of MMX from clang, aside
from inline-assembly. Adding back the hassle of accidental MMX mode-switch when
passing or returning an __m64 would be extremely unfortunate -- it's just not
worth it.
I do think it's unfortunate that GCC's and clang's ABI when built with -mno-mmx
are not compatible.
E.g. given this function:
__m64 mmx() {
return (__m64)55LL;
}
gcc -O2 -mno-mmx -m32 treats it as if the return type was 'struct X { int a,
int b}':
mmx():
movl 4(%esp), %eax
movl $55, (%eax)
movl $0, 4(%eax)
ret $4
clang -O2 -mno-mmx -m32 treats it as if the return type were 'long long':
mmx(): # @mmx()
movl $55, %eax
xorl %edx, %edx
retl