alpha.c (alpha_va_arg): Handle TFmode, TCmode args, passed by reference.
authorRainer Orth <ro@TechFak.Uni-Bielefeld.DE>
Thu, 7 Jun 2001 16:56:31 +0000 (16:56 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Thu, 7 Jun 2001 16:56:31 +0000 (16:56 +0000)
* config/alpha/alpha.c (alpha_va_arg): Handle TFmode, TCmode args,
passed by reference.

From-SVN: r42969

gcc/ChangeLog
gcc/config/alpha/alpha.c

index d625972de59b59071a4ed0c0e1ebc7211f1056f9..7b78f12486213bc8f4c5b969645126ea6ff9896b 100644 (file)
@@ -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.
index c6aa2eec7faca045ceab07396da5a38675385355..0bf04cd10521b1308722b5114010e9d5f414d311 100644 (file)
@@ -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;
 }
 \f