diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2014-07-16 15:34:07 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2014-07-16 15:34:07 +0000 |
commit | 68dcb4ffa37d7821a840e8cbaa10552c1b1e3945 (patch) | |
tree | e41080652acb80278e602cf0506c3a258abb4262 /clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp | |
parent | a3c494f0dbcdacdd9969bcbb39a17fa63e56eea9 (diff) | |
download | llvm-68dcb4ffa37d7821a840e8cbaa10552c1b1e3945.zip llvm-68dcb4ffa37d7821a840e8cbaa10552c1b1e3945.tar.gz llvm-68dcb4ffa37d7821a840e8cbaa10552c1b1e3945.tar.bz2 |
[mips][fp64a] Temporarily disable odd-numbered double-precision registers when using the FP64A ABI.
Summary:
A few instructions (mostly cvt.d.w and similar) are causing problems with
-mfp64 and -mno-odd-spreg and it looks like fixing it properly may
take several weeks. In the meantime, let's disable the odd-numbered
double-precision registers so that the generated code is at least valid.
The problem is that instructions like cvt.d.w read from the 32-bit low
subregister of a double-precision FPU register. This often leads to the compiler
to inserting moves to transfer a GPR32 to a FGR32 using mtc1. Such moves
violate the rules against 32-bit writes to odd-numbered FPU registers imposed
by -mno-odd-spreg. By disabling the odd-numbered double-precision registers, it
becomes impossible for the 32-bit low subregister to be odd-numbered.
This fixes numerous test-suite failures when compiling for the FP64A ABI
('-mfp64 -mno-odd-spreg'). There is no LLVM test case because it's difficult to
test that odd-numbered FPU registers are not allocatable. Instead, we depend on
the assembler (GAS and -fintegrated-as) raising errors when the rules are
violated.
Differential Revision: http://reviews.llvm.org/D4532
llvm-svn: 213160
Diffstat (limited to 'clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions