prueba super rápida basada en mis comentarios a la respuesta seleccionada. El compilador hizo lo que queríamos / deseamos:
void fdummy ( float );
void dummy ( unsigned int );
union
{
unsigned int ui;
float f;
} myun;
void fun ( unsigned int a, float b )
{
myun.f = b;
fdummy(myun.f);
myun.ui = a;
dummy(myun.ui);
fdummy(myun.f);
}
00000000 <fun>:
0: e92d4070 push {r4, r5, r6, lr}
4: e1a05000 mov r5, r0
8: e59f401c ldr r4, [pc, #28] ; 2c <fun+0x2c>
c: ed840a00 vstr s0, [r4]
10: ebfffffe bl 0 <fdummy>
14: e1a00005 mov r0, r5
18: e5845000 str r5, [r4]
1c: ebfffffe bl 0 <dummy>
20: ed940a00 vldr s0, [r4]
24: e8bd4070 pop {r4, r5, r6, lr}
28: eafffffe b 0 <fdummy>
2c: 00000000 andeq r0, r0, r0
Bueno, esto lo consiguió para optimizar los registros y todavía funcionó como se desea. Copia el unsigned a
void fdummy ( float );
void dummy ( unsigned int );
void fun ( unsigned int a, float b )
{
union
{
unsigned int ui;
float f;
} myun;
myun.f = b;
fdummy(myun.f);
myun.ui = a;
dummy(myun.ui);
fdummy(myun.f);
}
00000000 <fun>:
0: e92d4010 push {r4, lr}
4: e1a04000 mov r4, r0
8: ebfffffe bl 0 <fdummy>
c: e1a00004 mov r0, r4
10: ebfffffe bl 0 <dummy>
14: ee004a10 vmov s0, r4
18: e8bd4010 pop {r4, lr}
1c: eafffffe b 0 <fdummy>
Uno o dos ejemplos no hacen una prueba, pero los escritores del compilador querían que esto funcionara, incluso si no se utiliza el ram y el gointa y el goout de la unión no coinciden.