aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2013-10-19 14:58:20 +0200
committerUros Bizjak <uros@gcc.gnu.org>2013-10-19 14:58:20 +0200
commit6eb793dd0fd8a3494a48b4ca1d748f347f9b3105 (patch)
tree768ed4b211dde61d2ef02251b1e6a132db4eee22
parentc07757e53626133cd0f248f1f690e3fd9b059f6e (diff)
downloadgcc-6eb793dd0fd8a3494a48b4ca1d748f347f9b3105.zip
gcc-6eb793dd0fd8a3494a48b4ca1d748f347f9b3105.tar.gz
gcc-6eb793dd0fd8a3494a48b4ca1d748f347f9b3105.tar.bz2
re PR target/58792 (ICE at mode-switching.c:421 when compiling clang lib/AST/MicrosoftCXXABI.cpp)
PR target/58792 * config/i386/i386.c (ix86_function_value_regno): Add DX_REG, ST1_REG and XMM1_REG for 32bit and 64bit targets. Also add DI_REG and SI_REG for 64bit SYSV ABI targets. From-SVN: r203857
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c14
2 files changed, 18 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7deefce..78bc3bd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2013-10-19 Uros Bizjak <ubizjak@gmail.com>
+ PR target/58792
+ * config/i386/i386.c (ix86_function_value_regno): Add DX_REG,
+ ST1_REG and XMM1_REG for 32bit and 64bit targets. Also add DI_REG
+ and SI_REG for 64bit SYSV ABI targets.
+
+2013-10-19 Uros Bizjak <ubizjak@gmail.com>
+
* mode-switching.c (create_pre_exit): Rename maybe_builtin_apply
to multi_reg_return. Clarify that we are skipping USEs of multiple
return registers. Use bool type where appropriate.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 91e6510..54bd5f2 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -7393,9 +7393,15 @@ ix86_function_value_regno_p (const unsigned int regno)
switch (regno)
{
case AX_REG:
+ case DX_REG:
return true;
+ case DI_REG:
+ case SI_REG:
+ return TARGET_64BIT && ix86_abi != MS_ABI;
- case FIRST_FLOAT_REG:
+ /* Complex values are returned in %st(0)/%st(1) pair. */
+ case ST0_REG:
+ case ST1_REG:
/* TODO: The function should depend on current function ABI but
builtins.c would need updating then. Therefore we use the
default ABI. */
@@ -7403,10 +7409,12 @@ ix86_function_value_regno_p (const unsigned int regno)
return false;
return TARGET_FLOAT_RETURNS_IN_80387;
- case FIRST_SSE_REG:
+ /* Complex values are returned in %xmm0/%xmm1 pair. */
+ case XMM0_REG:
+ case XMM1_REG:
return TARGET_SSE;
- case FIRST_MMX_REG:
+ case MM0_REG:
if (TARGET_MACHO || TARGET_64BIT)
return false;
return TARGET_MMX;