PATCH:[darwin] fix load of a misaligned double word

Alan Modra amodra@bigpond.net.au
Fri Feb 27 05:31:00 GMT 2004


On Fri, Feb 27, 2004 at 12:34:12PM +1030, Alan Modra wrote:
> Attached is a testcase that I developed while looking at current gcc

Forgot it..

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre
-------------- next part --------------
union dl {
  double d;
  long l;
};

void f1 (void *p)
{
  union dl *x = (union dl *) ((char *) p + 3);

  x->l = 1234;
}

void f2 (void *p)
{
  union dl *x = (union dl *) ((char *) p + 3);

  x->d = 3.14;
}

void f3 (void *p)
{
  register void *r0 __asm__ ("%r0");
  union dl *x;

  asm volatile ("mr %0,%1" : "=r" (r0) : "r" (p));
  x = (union dl *) ((char *) r0 + 3);
  x->l = 1234;
}

void f4 (void *p)
{
  register void *r0 __asm__ ("%r0");
  union dl *x;

  asm volatile ("mr %0,%1" : "=r" (r0) : "r" (p));
  x = (union dl *) ((char *) r0 + 3);
  x->d = 3.14;
}

void f5 (void *p)
{
  union dl *x = (union dl *) ((char *) p + 3);
  register double d __asm__ ("%r4");

  d = x->d;
  __asm__ __volatile__ ("" : : "r" (d));
}

void f6 (void *p)
{
  union dl *x = (union dl *) ((char *) p + 3);
  register long l __asm__ ("%fr1");

  l = x->l;
  __asm__ __volatile__ ("" : : "f" (l));
}

void f7 (void *p)
{
  union dl *x = (union dl *) ((char *) p + 3);
  register double d __asm__ ("%r4");

  __asm__ __volatile__ ("" : "=r" (d));
  x->d = d;
}

void f8 (void *p)
{
  union dl *x = (union dl *) ((char *) p + 3);
  register long l __asm__ ("%fr0");

  __asm__ __volatile__ ("" : "=f" (l));
  x->l = l;
}

extern void bar (long, double);

void f9 (void *p)
{
  union dl *x = (union dl *) ((char *) p + 3);

  bar (x->l, x->d);
}



More information about the Gcc-patches mailing list