aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRainer Orth <ro@TechFak.Uni-Bielefeld.DE>2001-06-07 16:56:31 +0000
committerRainer Orth <ro@gcc.gnu.org>2001-06-07 16:56:31 +0000
commit09e983244e5589b9777ed719e615c5704f163282 (patch)
treeea5708585eb1a7457f73e893147208460c25c71e /gcc
parent561c1ae11356ee8b60b85113c948dafea9a76eb4 (diff)
downloadgcc-09e983244e5589b9777ed719e615c5704f163282.zip
gcc-09e983244e5589b9777ed719e615c5704f163282.tar.gz
gcc-09e983244e5589b9777ed719e615c5704f163282.tar.bz2
alpha.c (alpha_va_arg): Handle TFmode, TCmode args, passed by reference.
* config/alpha/alpha.c (alpha_va_arg): Handle TFmode, TCmode args, passed by reference. From-SVN: r42969
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/alpha/alpha.c17
2 files changed, 20 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d625972..7b78f12 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2001-06-07 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * config/alpha/alpha.c (alpha_va_arg): Handle TFmode, TCmode args,
+ passed by reference.
+
2001-06-07 Joseph S. Myers <jsm28@cam.ac.uk>
* doc/tm.texi (TARGET_SWITCHES, TARGET_OPTIONS): Adjust markup.
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index c6aa2ee..0bf04cd 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -1,6 +1,6 @@
/* Subroutines used for code generation on the DEC Alpha.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000 Free Software Foundation, Inc.
+ 2000, 2001 Free Software Foundation, Inc.
Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
This file is part of GNU CC.
@@ -4316,6 +4316,7 @@ alpha_va_arg (valist, type)
tree t;
tree offset_field, base_field, addr_tree, addend;
tree wide_type, wide_ofs;
+ int indirect = 0;
if (TARGET_OPEN_VMS)
return std_expand_builtin_va_arg (valist, type);
@@ -4334,7 +4335,13 @@ alpha_va_arg (valist, type)
wide_ofs = save_expr (build1 (CONVERT_EXPR, wide_type, offset_field));
addend = wide_ofs;
- if (FLOAT_TYPE_P (type))
+
+ if (TYPE_MODE (type) == TFmode || TYPE_MODE (type) == TCmode)
+ {
+ indirect = 1;
+ tsize = UNITS_PER_WORD;
+ }
+ else if (FLOAT_TYPE_P (type))
{
tree fpaddend, cond;
@@ -4360,6 +4367,12 @@ alpha_va_arg (valist, type)
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ if (indirect)
+ {
+ addr = force_reg (Pmode, addr);
+ addr = gen_rtx_MEM (Pmode, addr);
+ }
+
return addr;
}