OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc1/] [gcc/] [testsuite/] [gcc.target/] [powerpc/] [ppc64-abi-1.c] - Diff between revs 322 and 338

Only display areas with differences | Details | Blame | View Log

Rev 322 Rev 338
/* { dg-do run { target { powerpc*-*-* && lp64 } } } */
/* { dg-do run { target { powerpc*-*-* && lp64 } } } */
/* { dg-options "-O2" } */
/* { dg-options "-O2" } */
#include <stdarg.h>
#include <stdarg.h>
#include <signal.h>
#include <signal.h>
#include <stdio.h>
#include <stdio.h>
 
 
/* Testcase to check for ABI compliance of parameter passing
/* Testcase to check for ABI compliance of parameter passing
   for the PowerPC64 ABI.
   for the PowerPC64 ABI.
   Parameter passing of integral and floating point is tested.  */
   Parameter passing of integral and floating point is tested.  */
 
 
extern void abort (void);
extern void abort (void);
 
 
typedef struct
typedef struct
{
{
  unsigned long gprs[8];
  unsigned long gprs[8];
  double fprs[13];
  double fprs[13];
} reg_parms_t;
} reg_parms_t;
 
 
reg_parms_t gparms;
reg_parms_t gparms;
 
 
 
 
/* Testcase could break on future gcc's, if parameter regs
/* Testcase could break on future gcc's, if parameter regs
   are changed before this asm.  */
   are changed before this asm.  */
 
 
#ifndef __MACH__
#ifndef __MACH__
#define save_parms(lparms)                              \
#define save_parms(lparms)                              \
    asm volatile ("ld 11,gparms@got(2)\n\t"                \
    asm volatile ("ld 11,gparms@got(2)\n\t"                \
                  "std 3,0(11)\n\t"                     \
                  "std 3,0(11)\n\t"                     \
                  "std 4,8(11)\n\t"                     \
                  "std 4,8(11)\n\t"                     \
                  "std 5,16(11)\n\t"                    \
                  "std 5,16(11)\n\t"                    \
                  "std 6,24(11)\n\t"                    \
                  "std 6,24(11)\n\t"                    \
                  "std 7,32(11)\n\t"                    \
                  "std 7,32(11)\n\t"                    \
                  "std 8,40(11)\n\t"                    \
                  "std 8,40(11)\n\t"                    \
                  "std 9,48(11)\n\t"                    \
                  "std 9,48(11)\n\t"                    \
                  "std 10,56(11)\n\t"                 \
                  "std 10,56(11)\n\t"                 \
                  "stfd 1,64(11)\n\t"                   \
                  "stfd 1,64(11)\n\t"                   \
                  "stfd 2,72(11)\n\t"                   \
                  "stfd 2,72(11)\n\t"                   \
                  "stfd 3,80(11)\n\t"                   \
                  "stfd 3,80(11)\n\t"                   \
                  "stfd 4,88(11)\n\t"                   \
                  "stfd 4,88(11)\n\t"                   \
                  "stfd 5,96(11)\n\t"                   \
                  "stfd 5,96(11)\n\t"                   \
                  "stfd 6,104(11)\n\t"                  \
                  "stfd 6,104(11)\n\t"                  \
                  "stfd 7,112(11)\n\t"                  \
                  "stfd 7,112(11)\n\t"                  \
                  "stfd 8,120(11)\n\t"                  \
                  "stfd 8,120(11)\n\t"                  \
                  "stfd 9,128(11)\n\t"                  \
                  "stfd 9,128(11)\n\t"                  \
                  "stfd 10,136(11)\n\t"                 \
                  "stfd 10,136(11)\n\t"                 \
                  "stfd 11,144(11)\n\t"                 \
                  "stfd 11,144(11)\n\t"                 \
                  "stfd 12,152(11)\n\t"                 \
                  "stfd 12,152(11)\n\t"                 \
                  "stfd 13,160(11)\n\t":::"11", "memory");  \
                  "stfd 13,160(11)\n\t":::"11", "memory");  \
                  lparms = gparms;
                  lparms = gparms;
#else
#else
#define save_parms(lparms)                              \
#define save_parms(lparms)                              \
    asm volatile ("ld r11,gparms@got(r2)\n\t"           \
    asm volatile ("ld r11,gparms@got(r2)\n\t"           \
                  "std r3,0(r11)\n\t"                   \
                  "std r3,0(r11)\n\t"                   \
                  "std r4,8(r11)\n\t"                   \
                  "std r4,8(r11)\n\t"                   \
                  "std r5,16(r11)\n\t"                  \
                  "std r5,16(r11)\n\t"                  \
                  "std r6,24(r11)\n\t"                  \
                  "std r6,24(r11)\n\t"                  \
                  "std r7,32(r11)\n\t"                  \
                  "std r7,32(r11)\n\t"                  \
                  "std r8,40(r11)\n\t"                  \
                  "std r8,40(r11)\n\t"                  \
                  "std r9,48(r11)\n\t"                  \
                  "std r9,48(r11)\n\t"                  \
                  "std r10,56(r11)\n\t"                 \
                  "std r10,56(r11)\n\t"                 \
                  "stfd f1,64(r11)\n\t"                 \
                  "stfd f1,64(r11)\n\t"                 \
                  "stfd f2,72(r11)\n\t"                 \
                  "stfd f2,72(r11)\n\t"                 \
                  "stfd f3,80(r11)\n\t"                 \
                  "stfd f3,80(r11)\n\t"                 \
                  "stfd f4,88(r11)\n\t"                 \
                  "stfd f4,88(r11)\n\t"                 \
                  "stfd f5,96(r11)\n\t"                 \
                  "stfd f5,96(r11)\n\t"                 \
                  "stfd f6,104(r11)\n\t"                \
                  "stfd f6,104(r11)\n\t"                \
                  "stfd f7,112(r11)\n\t"                \
                  "stfd f7,112(r11)\n\t"                \
                  "stfd f8,120(r11)\n\t"                \
                  "stfd f8,120(r11)\n\t"                \
                  "stfd f9,128(r11)\n\t"                \
                  "stfd f9,128(r11)\n\t"                \
                  "stfd f10,136(r11)\n\t"               \
                  "stfd f10,136(r11)\n\t"               \
                  "stfd f11,144(r11)\n\t"               \
                  "stfd f11,144(r11)\n\t"               \
                  "stfd f12,152(r11)\n\t"               \
                  "stfd f12,152(r11)\n\t"               \
                  "stfd f13,160(r11)\n\t":::"r11", "memory");  \
                  "stfd f13,160(r11)\n\t":::"r11", "memory");  \
                  lparms = gparms;
                  lparms = gparms;
#endif
#endif
 
 
/* Stackframe structure relevant for parameter passing.  */
/* Stackframe structure relevant for parameter passing.  */
typedef union
typedef union
{
{
  double d;
  double d;
  unsigned long l;
  unsigned long l;
  unsigned int i[2];
  unsigned int i[2];
} parm_t;
} parm_t;
 
 
typedef struct sf
typedef struct sf
{
{
  struct sf *backchain;
  struct sf *backchain;
  long a1;
  long a1;
  long a2;
  long a2;
  long a3;
  long a3;
  long a4;
  long a4;
  long a5;
  long a5;
  parm_t slot[100];
  parm_t slot[100];
} stack_frame_t;
} stack_frame_t;
 
 
 
 
/* Paramter passing.
/* Paramter passing.
   s : gpr 3
   s : gpr 3
   l : gpr 4
   l : gpr 4
   d : fpr 1
   d : fpr 1
*/
*/
void __attribute__ ((noinline)) fcld (char *s, long l, double d)
void __attribute__ ((noinline)) fcld (char *s, long l, double d)
{
{
  reg_parms_t lparms;
  reg_parms_t lparms;
  save_parms (lparms);
  save_parms (lparms);
 
 
  if (s != (char *) lparms.gprs[0])
  if (s != (char *) lparms.gprs[0])
    abort ();
    abort ();
 
 
  if (l != lparms.gprs[1])
  if (l != lparms.gprs[1])
    abort ();
    abort ();
 
 
  if (d != lparms.fprs[0])
  if (d != lparms.fprs[0])
    abort ();
    abort ();
}
}
 
 
/* Paramter passing.
/* Paramter passing.
   s : gpr 3
   s : gpr 3
   l : gpr 4
   l : gpr 4
   d : fpr 2
   d : fpr 2
   i : gpr 5
   i : gpr 5
*/
*/
void __attribute__ ((noinline))
void __attribute__ ((noinline))
fcldi (char *s, long l, double d, signed int i)
fcldi (char *s, long l, double d, signed int i)
{
{
  reg_parms_t lparms;
  reg_parms_t lparms;
  save_parms (lparms);
  save_parms (lparms);
 
 
  if (s != (char *) lparms.gprs[0])
  if (s != (char *) lparms.gprs[0])
    abort ();
    abort ();
 
 
  if (l != lparms.gprs[1])
  if (l != lparms.gprs[1])
    abort ();
    abort ();
 
 
  if (d != lparms.fprs[0])
  if (d != lparms.fprs[0])
    abort ();
    abort ();
 
 
  if ((signed long) i != lparms.gprs[3])
  if ((signed long) i != lparms.gprs[3])
    abort ();
    abort ();
}
}
 
 
/* Paramter passing.
/* Paramter passing.
   s : gpr 3
   s : gpr 3
   l : gpr 4
   l : gpr 4
   d : fpr 2
   d : fpr 2
   i : gpr 5
   i : gpr 5
*/
*/
void __attribute__ ((noinline))
void __attribute__ ((noinline))
fcldu (char *s, long l, float d, unsigned int i)
fcldu (char *s, long l, float d, unsigned int i)
{
{
  reg_parms_t lparms;
  reg_parms_t lparms;
  save_parms (lparms);
  save_parms (lparms);
 
 
  if (s != (char *) lparms.gprs[0])
  if (s != (char *) lparms.gprs[0])
    abort ();
    abort ();
 
 
  if (l != lparms.gprs[1])
  if (l != lparms.gprs[1])
    abort ();
    abort ();
 
 
  if ((double) d != lparms.fprs[0])
  if ((double) d != lparms.fprs[0])
    abort ();
    abort ();
 
 
  if ((unsigned long) i != lparms.gprs[3])
  if ((unsigned long) i != lparms.gprs[3])
    abort ();
    abort ();
}
}
 
 
/* Paramter passing.
/* Paramter passing.
   s : gpr 3
   s : gpr 3
   l : slot 1
   l : slot 1
   d : slot 2
   d : slot 2
*/
*/
 
 
void __attribute__ ((noinline)) fceld (char *s, ...)
void __attribute__ ((noinline)) fceld (char *s, ...)
{
{
  stack_frame_t *sp;
  stack_frame_t *sp;
  reg_parms_t lparms;
  reg_parms_t lparms;
  va_list arg;
  va_list arg;
  double d;
  double d;
  long l;
  long l;
  save_parms (lparms);
  save_parms (lparms);
 
 
  va_start (arg, s);
  va_start (arg, s);
 
 
  if (s != (char *) lparms.gprs[0])
  if (s != (char *) lparms.gprs[0])
    abort ();
    abort ();
 
 
  l = va_arg (arg, long);
  l = va_arg (arg, long);
  d = va_arg (arg, double);
  d = va_arg (arg, double);
 
 
  /* Go back one frame.  */
  /* Go back one frame.  */
  sp = __builtin_frame_address (0);
  sp = __builtin_frame_address (0);
  sp = sp->backchain;
  sp = sp->backchain;
 
 
  if (sp->slot[1].l != l)
  if (sp->slot[1].l != l)
    abort ();
    abort ();
 
 
  if (sp->slot[2].d != d)
  if (sp->slot[2].d != d)
    abort ();
    abort ();
}
}
 
 
/* Paramter passing.
/* Paramter passing.
   s : gpr 3
   s : gpr 3
   i : gpr 4
   i : gpr 4
   j : gpr 5
   j : gpr 5
   d : slot 3
   d : slot 3
   l : slot 4
   l : slot 4
*/
*/
void __attribute__ ((noinline)) fciiedl (char *s, int i, int j, ...)
void __attribute__ ((noinline)) fciiedl (char *s, int i, int j, ...)
{
{
  stack_frame_t *sp;
  stack_frame_t *sp;
  reg_parms_t lparms;
  reg_parms_t lparms;
  va_list arg;
  va_list arg;
  double d;
  double d;
  long l;
  long l;
  save_parms (lparms);
  save_parms (lparms);
 
 
  va_start (arg, j);
  va_start (arg, j);
 
 
  if (s != (char *) lparms.gprs[0])
  if (s != (char *) lparms.gprs[0])
    abort ();
    abort ();
 
 
  if ((long) i != lparms.gprs[1])
  if ((long) i != lparms.gprs[1])
    abort ();
    abort ();
 
 
  if ((long) j != lparms.gprs[2])
  if ((long) j != lparms.gprs[2])
    abort ();
    abort ();
 
 
  d = va_arg (arg, double);
  d = va_arg (arg, double);
  l = va_arg (arg, long);
  l = va_arg (arg, long);
 
 
  sp = __builtin_frame_address (0);
  sp = __builtin_frame_address (0);
  sp = sp->backchain;
  sp = sp->backchain;
 
 
  if (sp->slot[3].d != d)
  if (sp->slot[3].d != d)
    abort ();
    abort ();
 
 
  if (sp->slot[4].l != l)
  if (sp->slot[4].l != l)
    abort ();
    abort ();
}
}
 
 
/*
/*
Parameter     Register     Offset in parameter save area
Parameter     Register     Offset in parameter save area
c             r3           0-7    (not stored in parameter save area)
c             r3           0-7    (not stored in parameter save area)
ff            f1           8-15   (not stored)
ff            f1           8-15   (not stored)
d             r5           16-23  (not stored)
d             r5           16-23  (not stored)
ld            f2           24-31  (not stored)
ld            f2           24-31  (not stored)
f             r7           32-39  (not stored)
f             r7           32-39  (not stored)
s             r8,r9        40-55  (not stored)
s             r8,r9        40-55  (not stored)
gg            f3           56-63  (not stored)
gg            f3           56-63  (not stored)
t             (none)       64-79  (stored in parameter save area)
t             (none)       64-79  (stored in parameter save area)
e             (none)       80-87  (stored)
e             (none)       80-87  (stored)
hh            f4           88-95  (stored)
hh            f4           88-95  (stored)
 
 
*/
*/
 
 
typedef struct
typedef struct
{
{
  int a;
  int a;
  double dd;
  double dd;
} sparm;
} sparm;
 
 
typedef union
typedef union
{
{
  int i[2];
  int i[2];
  long l;
  long l;
  double d;
  double d;
} double_t;
} double_t;
 
 
/* Example from ABI documentation with slight changes.
/* Example from ABI documentation with slight changes.
   Paramter passing.
   Paramter passing.
   c  : gpr 3
   c  : gpr 3
   ff : fpr 1
   ff : fpr 1
   d  : gpr 5
   d  : gpr 5
   ld : fpr 2
   ld : fpr 2
   f  : gpr 7
   f  : gpr 7
   s  : gpr 8 - 9
   s  : gpr 8 - 9
   gg : fpr 3
   gg : fpr 3
   t  : save area offset 64 - 79
   t  : save area offset 64 - 79
   e  : save area offset 80 - 88
   e  : save area offset 80 - 88
   hh : fpr 4
   hh : fpr 4
*/
*/
 
 
void __attribute__ ((noinline))
void __attribute__ ((noinline))
fididisdsid (int c, double ff, int d, double ld, int f,
fididisdsid (int c, double ff, int d, double ld, int f,
             sparm s, double gg, sparm t, int e, double hh)
             sparm s, double gg, sparm t, int e, double hh)
{
{
  stack_frame_t *sp;
  stack_frame_t *sp;
  reg_parms_t lparms;
  reg_parms_t lparms;
  double_t dx, dy;
  double_t dx, dy;
 
 
  save_parms (lparms);
  save_parms (lparms);
 
 
  /* Parm 0: int.  */
  /* Parm 0: int.  */
  if ((long) c != lparms.gprs[0])
  if ((long) c != lparms.gprs[0])
    abort ();
    abort ();
 
 
  /* Parm 1: double.  */
  /* Parm 1: double.  */
  if (ff != lparms.fprs[0])
  if (ff != lparms.fprs[0])
    abort ();
    abort ();
 
 
  /* Parm 2: int.  */
  /* Parm 2: int.  */
  if ((long) d != lparms.gprs[2])
  if ((long) d != lparms.gprs[2])
    abort ();
    abort ();
 
 
  /* Parm 3: double.  */
  /* Parm 3: double.  */
  if (ld != lparms.fprs[1])
  if (ld != lparms.fprs[1])
    abort ();
    abort ();
 
 
  /* Parm 4: int.  */
  /* Parm 4: int.  */
  if ((long) f != lparms.gprs[4])
  if ((long) f != lparms.gprs[4])
    abort ();
    abort ();
 
 
  /* Parm 5: struct sparm.  */
  /* Parm 5: struct sparm.  */
  dx.l = lparms.gprs[5];
  dx.l = lparms.gprs[5];
  dy.l = lparms.gprs[6];
  dy.l = lparms.gprs[6];
 
 
  if (s.a != dx.i[0])
  if (s.a != dx.i[0])
    abort ();
    abort ();
  if (s.dd != dy.d)
  if (s.dd != dy.d)
    abort ();
    abort ();
 
 
  /* Parm 6: double.  */
  /* Parm 6: double.  */
  if (gg != lparms.fprs[2])
  if (gg != lparms.fprs[2])
    abort ();
    abort ();
 
 
  sp = __builtin_frame_address (0);
  sp = __builtin_frame_address (0);
  sp = sp->backchain;
  sp = sp->backchain;
 
 
  /* Parm 7: struct sparm.  */
  /* Parm 7: struct sparm.  */
  dx.l = sp->slot[8].l;
  dx.l = sp->slot[8].l;
  dy.l = sp->slot[9].l;
  dy.l = sp->slot[9].l;
  if (t.a != dx.i[0])
  if (t.a != dx.i[0])
    abort ();
    abort ();
  if (t.dd != dy.d)
  if (t.dd != dy.d)
    abort ();
    abort ();
 
 
  /* Parm 8: int.  */
  /* Parm 8: int.  */
  if (e != sp->slot[10].l)
  if (e != sp->slot[10].l)
    abort ();
    abort ();
 
 
  /* Parm 9: double.  */
  /* Parm 9: double.  */
 
 
  if (hh != lparms.fprs[3])
  if (hh != lparms.fprs[3])
    abort ();
    abort ();
}
}
 
 
int
int
main ()
main ()
{
{
  char *s = "ii";
  char *s = "ii";
 
 
  fcld (s, 1, 1.0);
  fcld (s, 1, 1.0);
  fcldi (s, 1, 1.0, -2);
  fcldi (s, 1, 1.0, -2);
  fcldu (s, 1, 1.0, 2);
  fcldu (s, 1, 1.0, 2);
  fceld (s, 1, 1.0);
  fceld (s, 1, 1.0);
  fciiedl (s, 1, 2, 1.0, 3);
  fciiedl (s, 1, 2, 1.0, 3);
  fididisdsid (1, 1.0, 2, 2.0, -1, (sparm)
  fididisdsid (1, 1.0, 2, 2.0, -1, (sparm)
               {
               {
               3, 3.0}, 4.0, (sparm)
               3, 3.0}, 4.0, (sparm)
               {
               {
               5, 5.0}, 6, 7.0);
               5, 5.0}, 6, 7.0);
  return 0;
  return 0;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.