Bucle extraño producido por el compilador PIC de MicroChip

7

Estamos usando la versión Lite del compilador MicroChip PIC, por lo que quizás esa sea la razón, pero este simple cambio de un bit está generando un bucle donde no es necesario. Dado que el recuento de turnos es 1 (una constante), esperaría que el compilador no cree ningún bucle, una optimización elemental.

¿Hay un interruptor de optimización del compilador que alivie el bucle? Aquí está el código para el turno:

    long foo;   // a 32-bit value

// Shift foo one bit. 
// A one-iteration loop is created!

    foo >>= 1;

Y aquí está el código generado por el compilador. Como puede ver, el cambio está envuelto con un bucle de una iteración.

  07F6    3001     MOVLW 0x1
  07F7    00F2     MOVWF 0x72
  07F8    37F6     ASRF 0x76, F
  07F9    0CF5     RRF 0x75, F
  07FA    0CF4     RRF 0x74, F
  07FB    0CF3     RRF 0x73, F
  07FC    0BF2     DECFSZ 0x72, F

EDIT

Versión del compilador: HI-TECH C Compilador para MCU PIC10 / 12/16 (Modo Lite) V9.81

    
pregunta I. J. Kennedy

3 respuestas

2

Tal vez esto se deba a la falta de optimización de la versión lite.
Podrías intentarlo,

foo /= 2;

y ver si ayuda.

    
respondido por el Bruno Ferreira
1

Probé varias opciones de optimización, pero nada hizo que el compilador produjera un código sano. He tenido experiencias similares con el compilador C18 también. Parte del código lo genera sorprendentemente tonto, y terminé usando varios tipos de macros y trucos. Al final, pude lograr que generara un código casi tan bueno como un ensamblador optimizado a mano sin dejar de ser bastante legible.

Esta macro no muy agradable genera el ensamblador correcto para desplazar a la derecha un largo.

long foo;

#define R_SHIFT_LONG(x)     asm("asrf    _" #x "+3, f"); \
                            asm("rrf     _" #x "+2, f"); \
                            asm("rrf     _" #x "+1, f"); \
                            asm("rrf     _" #x "+0, f");

void main(void)
{
    foo=1234;

    R_SHIFT_LONG(foo);
}
    
respondido por el Rocketmagnet
-1

Ahora que he tenido la oportunidad de ver tu código, realmente no es tan irrazonable. Dependiendo del modelo PIC en particular, podría haberse realizado en 4 o 5 instrucciones, pero solo en el caso especial de desplazar un bit . Parece bastante razonable que lo primero que hace el compilador es escribir código para el caso general donde el desplazamiento es para N bits. Me sorprendería si no reconociera un cambio en un bit como un caso especial con las optimizaciones activadas, pero ¿cómo es que esto no es exactamente el tipo de cosa que espera que haga sin optimización?

De nuevo, sin embargo, si te importa este nivel de detalle, debes escribir en el ensamblador. Al utilizar un compilador, ha eliminado la generación de instrucciones detalladas. Además, es sumamente injusto evaluar cualquier compilador con las optimizaciones desactivadas.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas