/*
 * Try to get GCC to generate
 * ldr rN, ...
 * cfldrd mvd*, [rN]
 */

struct s {
double d1;
double d2;
double d3;
} s;

double foo(double);
double bar(double darg);

main()
{
	foo(42.0);
	bar(43.0);
}

double f42 = 42.0;
double f21 = 21.0;

double
foo(double darg)
{
	register struct s *sp asm("r4") = &s;
	register double d asm("mvd4");

	d = f42;
	sp->d1 = d;
/* -O produces:
        ldr     r3, .L3+8
        cfldrd  mvd0, [r3, #0]
        ldr     r3, .L3+12
        cfstrd  mvd0, [r3, #0]
 */
	return(d * 3.14);
}

double
bar(double darg)
{
	register struct s *sp asm("r4") = &s;
	register double d asm("mvd4");
	register double e asm("mvd4");

	d = f42;
	sp->d2 = d;
	e = f21;
	sp->d1 = e;
/* -O produces:
        ldr     r3, .L7
        cfldrd  mvd1, [r3, #0]
        ldr     r2, .L7+4
        cfstrd  mvd1, [r2, #8]
        ldr     r3, .L7+8
        cfldrd  mvd0, [r3, #0]
	cfstrd  mvd0, [r2, #0]
*/

	return(d * e);
}
