2012-02-12 14 views
5

Estoy desarrollando para la plataforma AVR y tengo una pregunta. No quiero que la biblioteca de punto flotante se vincule con mi código, pero me gusta el concepto de tener valores analógicos del rango 0.0 ... 1.0 en lugar de 0 ... 255 y 0 ... 1023, dependiendo de incluso si estoy usando un puerto como entrada o como salida.GCC optimización en tiempo flotante en tiempo de compilación

Así que decidí multiplicar los argumentos de las funciones de entrada/salida por 1023.0 y 255.0, respectivamente. Ahora, mi pregunta es: si pongo en práctica la división de la siguiente manera:

#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0))) 

se GCC (con la bandera -O3 activada) optimizar el tiempo de compilación multiplicaciones en coma, conocido en tiempo de compilación y emitidos a una integral flotante tipo, en operaciones enteras? (Sé que al utilizar estas macros con argumentos no constantes, la optimización no es posible, solo quiero saber si se hará en el otro caso)

+1

No debería ser esto una multiplicación, no una división? ('analog_out (7, 0.5)' se convierte en una escritura de '0.5 * 255' al puerto 7, en lugar de una escritura de 0 picado desde 1/510) ... – Borealid

+0

sí, seguro :) Reparado. –

+3

¡Pruébalo y descúbrelo! 'gcc -S' producirá un volcado de montaje. Probablemente quieras '-O2 -ffast-math' para esto, no' -O3' ('-O3' activa optimizaciones que casi siempre son net * lose *, como la sobreinyección agresiva, está destinado a ser utilizado en el un archivo en el que su programa pasa el 90% de su tiempo). – zwol

Respuesta

3

GCC siempre debe doblar constantemente si proporciona un bit como un literal numérico. Si desea que el compilador de hacer cumplir la constness, podría salirse con algo como esto:

#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0)) 
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0))) 
2

En general, creo que gcc -O2 hará toda la aritmética en constantes en tiempo de compilación.
No lo convertirá a aritmética entera, solo a un entero constante.

Puede ser peligroso confiar, especialmente si otras personas mantienen el código. Una situación donde pasar un parámetro no constante a una macro da como resultado un error no es bueno.

+0

No genera ningún error, solo quiero que se optimice. –

Cuestiones relacionadas