¿Por qué AVR-GCC al parecer desperdicia 6 ciclos aquí?

3

Esta línea ...

            if (thisWindowsSinceLastFlash <=1 ) {           

... cumple con este código ...

11e8:   81 e0           ldi r24, 0x01   ; 1
11ea:   8d 15           cp  r24, r13
11ec:   38 f4           brcc    .+14        ; 0x11fc 

¿Por qué el compilador no utilizó el cpi de esta manera ...

1204:   01 30           cpi r16, 0x01   ; 1
1206:   39 f4           brcc    .+14        

y guarde los ciclos y el espacio y el registro utilizado por el cp ?

Tanto cp como cpi se unen para actualizar las mismas marcas y dejar todo en el mismo estado ...

¿Qué me estoy perdiendo?

Tenga en cuenta que cp terminó siendo mucho más costoso que solo el ciclo adicional porque forzó una secuencia push / pop en r24 , que cuesta 4 ciclos adicionales (6 ciclos en total).

Estoy usando el AVR8/GNU C Compiler : 5.4.0 que se incluye con Atmel Studio 7.0

    
pregunta bigjosh

1 respuesta

3

La instrucción cpi solo se puede comparar con el registro r16 o mayor ...

..so porque el valor a comparar estaba en r13 (< r16), no se pudo usar cpi .

Todavía deja la pregunta de por qué el compilador no asignó a r24 en lugar de r13 en primer lugar y guarda los ciclos y la secuencia push / pop en r24 , pero tal vez haya son otros lugares donde se usa r13 que estar en el banco inferior ayudó.

    
respondido por el bigjosh

Lea otras preguntas en las etiquetas