From 5e062767b9dd4ab2ac51da35b684e574dcfd72b0 Mon Sep 17 00:00:00 2001 From: Danny Smith Date: Fri, 7 Feb 2003 22:10:56 +0000 Subject: [PATCH] i386.h (MS_AGGREGATE_RETURN): New define. * config/i386/i386.h (MS_AGGREGATE_RETURN): New define. * config/i386/cygwin.h (MS_AGGREGATE_RETURN): Override default definition. * config/i386/i386.h (ix86_return_in_memory): Return aggregate types of up to 8 bytes via registers if MS_AGGREGATE_RETURN. From-SVN: r62547 --- gcc/ChangeLog | 8 ++++++++ gcc/config/i386/cygwin.h | 5 +++++ gcc/config/i386/i386.c | 18 ++++++++++++------ gcc/config/i386/i386.h | 3 +++ 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7fbeef59dbd..7df730259bc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2003-03-07 Danny Smith + + * config/i386/i386.h (MS_AGGREGATE_RETURN): New define. + * config/i386/cygwin.h (MS_AGGREGATE_RETURN): Override default + definition. + * config/i386/i386.h (ix86_return_in_memory): Return aggregate + types of up to 8 bytes via registers if MS_AGGREGATE_RETURN. + Fri Feb 7 22:22:40 CET 2003 Jan Hubicka * i386.md (movdi_rex64_1): Fix mmx<->int move opcode. diff --git a/gcc/config/i386/cygwin.h b/gcc/config/i386/cygwin.h index 76978980c28..085c3e78fe0 100644 --- a/gcc/config/i386/cygwin.h +++ b/gcc/config/i386/cygwin.h @@ -410,6 +410,11 @@ extern int i386_pe_dllimport_name_p PARAMS ((const char *)); #undef DEFAULT_PCC_STRUCT_RETURN #define DEFAULT_PCC_STRUCT_RETURN 0 +/* MSVC returns aggregate types of up to 8 bytes via registers. + See i386.c:ix86_return_in_memory. */ +#undef MS_AGGREGATE_RETURN +#define MS_AGGREGATE_RETURN 1 + /* No data type wants to be aligned rounder than this. */ #undef BIGGEST_ALIGNMENT #define BIGGEST_ALIGNMENT 128 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 23f2494f417..def53d052d0 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2608,12 +2608,18 @@ ix86_return_in_memory (type) } else { - if (TYPE_MODE (type) == BLKmode - || (VECTOR_MODE_P (TYPE_MODE (type)) - && int_size_in_bytes (type) == 8) - || (int_size_in_bytes (type) > 12 && TYPE_MODE (type) != TImode - && TYPE_MODE (type) != TFmode - && !VECTOR_MODE_P (TYPE_MODE (type)))) + if (TYPE_MODE (type) == BLKmode) + return 1; + else if (MS_AGGREGATE_RETURN + && AGGREGATE_TYPE_P (type) + && int_size_in_bytes(type) <= 8) + return 0; + else if ((VECTOR_MODE_P (TYPE_MODE (type)) + && int_size_in_bytes (type) == 8) + || (int_size_in_bytes (type) > 12 + && TYPE_MODE (type) != TImode + && TYPE_MODE (type) != TFmode + && !VECTOR_MODE_P (TYPE_MODE (type)))) return 1; return 0; } diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 8d1b5e428f4..8373e3250a6 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -1208,6 +1208,9 @@ do { \ #define RETURN_IN_MEMORY(TYPE) \ ix86_return_in_memory (TYPE) +/* This is overriden by . */ +#define MS_AGGREGATE_RETURN 0 + /* Define the classes of registers for register constraints in the machine description. Also define ranges of constants. -- 2.30.2