/* * 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); }