From b693336bf3a985d6ee779cd18c44bfa02fc78310 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Sun, 21 Nov 2004 20:21:10 -0500 Subject: [PATCH] re PR target/17836 (ABI breakage for 16-byte vectors (non-Altivec ABI & ISA)) PR target/17836 * config/rs6000/rs6000.c (rs6000_return_in_memory): Return synthetic vectors in memory. (function_arg_boundary): Align large synthetic vectors. (rs6000_pass_by_reference): Pass synthetic vectors in memory. From-SVN: r90995 --- gcc/ChangeLog | 8 ++++++++ gcc/config/rs6000/rs6000.c | 42 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c8f32e703b..e50939b69b6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-11-21 David Edelsohn + + PR target/17836 + * config/rs6000/rs6000.c (rs6000_return_in_memory): Return + synthetic vectors in memory. + (function_arg_boundary): Align large synthetic vectors. + (rs6000_pass_by_reference): Pass synthetic vectors in memory. + 2004-11-21 Jeff Law * cfg.c (update_bb_profile_for_threading): Do not rescale the diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 7bf65545d8b..2d4e6186c5c 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -4640,6 +4640,21 @@ rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED) && (TARGET_AIX_STRUCT_RET || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8)) return true; + + /* Return synthetic vectors in memory. */ + if (TREE_CODE (type) == VECTOR_TYPE + && int_size_in_bytes (type) > (TARGET_ALTIVEC ? 16 : 8)) + { + static bool warned_for_return_big_vectors = false; + if (!warned_for_return_big_vectors) + { + warning ("synthetic vectors returned by reference: " + "non-standard ABI extension with no compatibility guarantee"); + warned_for_return_big_vectors = true; + } + return true; + } + if (DEFAULT_ABI == ABI_V4 && TYPE_MODE (type) == TFmode) return true; return false; @@ -4783,10 +4798,13 @@ function_arg_padding (enum machine_mode mode, tree type) of an argument with the specified mode and type. If it is not defined, PARM_BOUNDARY is used for all arguments. - V.4 wants long longs to be double word aligned. */ + V.4 wants long longs to be double word aligned. + Doubleword align SPE vectors. + Quadword align Altivec vectors. + Quadword align large synthetic vector types. */ int -function_arg_boundary (enum machine_mode mode, tree type ATTRIBUTE_UNUSED) +function_arg_boundary (enum machine_mode mode, tree type) { if (DEFAULT_ABI == ABI_V4 && GET_MODE_SIZE (mode) == 8) return 64; @@ -4794,6 +4812,9 @@ function_arg_boundary (enum machine_mode mode, tree type ATTRIBUTE_UNUSED) return 64; else if (ALTIVEC_VECTOR_MODE (mode)) return 128; + else if (type && TREE_CODE (type) == VECTOR_TYPE + && int_size_in_bytes (type) > 16) + return 128; else return PARM_BOUNDARY; } @@ -5617,6 +5638,23 @@ rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED, return 1; } + + /* Pass synthetic vectors in memory. */ + if (type && TREE_CODE (type) == VECTOR_TYPE + && int_size_in_bytes (type) > (TARGET_ALTIVEC ? 16 : 8)) + { + static bool warned_for_pass_big_vectors = false; + if (TARGET_DEBUG_ARG) + fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n"); + if (!warned_for_pass_big_vectors) + { + warning ("synthetic vector passed by reference: " + "non-standard ABI extension with no compatibility guarantee"); + warned_for_pass_big_vectors = true; + } + return 1; + } + return 0; } -- 2.30.2