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