aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZack Weinberg <zack@wolery.cumb.org>2000-08-05 18:24:19 +0000
committerZack Weinberg <zack@gcc.gnu.org>2000-08-05 18:24:19 +0000
commit26f2c02a97d337b9d4f00067957ad86db350cc2c (patch)
treec0c1b04a63c7ba64a04c706fb2299f9d6ddaa1ff /gcc
parent0681921da12cb172489157f10e460f31f5ee320f (diff)
downloadgcc-26f2c02a97d337b9d4f00067957ad86db350cc2c.zip
gcc-26f2c02a97d337b9d4f00067957ad86db350cc2c.tar.gz
gcc-26f2c02a97d337b9d4f00067957ad86db350cc2c.tar.bz2
i386.h (FUNCTION_OK_FOR_SIBCALL): Not OK if DECL's return type is a float mode...
* i386.h (FUNCTION_OK_FOR_SIBCALL): Not OK if DECL's return type is a float mode, cfun->decl's return type is not, and TARGET_FLOAT_RETURNS_IN_80387. * gcc.c-torture/execute/20000731-1.x: Delete. From-SVN: r35506
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.h14
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20000731-1.x3
4 files changed, 20 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2f75308..78006cf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2000-08-05 Zack Weinberg <zack@wolery.cumb.org>
+
+ * i386.h (FUNCTION_OK_FOR_SIBCALL): Not OK if DECL's return
+ type is a float mode, cfun->decl's return type is not, and
+ TARGET_FLOAT_RETURNS_IN_80387.
+
2000-08-04 Andreas Schwab <schwab@suse.de>
* cppmain.c (cb_def_pragma): Skip the first two tokens from the
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index fe4a31e..62f5fb0 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -1319,10 +1319,16 @@ typedef struct ix86_args {
#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0
-/* If PIC, we cannot optimize sibling calls to global functions
- because the PLT requires %ebx live. */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) \
- (DECL && (! flag_pic || ! TREE_PUBLIC (DECL)))
+/* If PIC, we cannot make sibling calls to global functions
+ because the PLT requires %ebx live.
+ If we are returning floats on the register stack, we cannot make
+ sibling calls to functions that return floats. (The stack adjust
+ instruction will wind up after the sibcall jump, and not be executed.) */
+#define FUNCTION_OK_FOR_SIBCALL(DECL) (DECL \
+ && (! flag_pic || ! TREE_PUBLIC (DECL)) \
+ && (! TARGET_FLOAT_RETURNS_IN_80387 \
+ || ! FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (TREE_TYPE (DECL)))) \
+ || FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (TREE_TYPE (cfun->decl))))))
/* This macro is invoked just before the start of a function.
It is used here to output code for -fpic that will load the
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 463c14c..aca5368 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2000-08-05 Zack Weinberg <zack@wolery.cumb.org>
+
+ * gcc.c-torture/execute/20000731-1.x: Delete.
+
2000-08-04 Zack Weinberg <zack@wolery.cumb.org>
* lib/gcc-dg.exp: Set up TORTURE_OPTIONS, torture_with_loops,
diff --git a/gcc/testsuite/gcc.c-torture/execute/20000731-1.x b/gcc/testsuite/gcc.c-torture/execute/20000731-1.x
deleted file mode 100644
index 8d4b6e2..0000000
--- a/gcc/testsuite/gcc.c-torture/execute/20000731-1.x
+++ /dev/null
@@ -1,3 +0,0 @@
-# Doesn't work. Hasn't worked ever, I think.
-set torture_execute_xfail "i?86-*-*"
-return 0