Bonjour,
Je dois optimiser un code pour un microcontrôleur embarqué (atmega128, mcu 8 bits) et j’ai remarqué une différence d’optimisation entre deux fonctions et je ne comprend pas cette différence. Voici le code C:
unsigned int MulLInt(unsigned int a, unsigned int b) {
unsigned char a1 = (unsigned char)(a&0xFF);
unsigned char b1 = (unsigned char)(b&0xFF);
return a1*b1 ;
}
unsigned int MulEInt(unsigned int a, unsigned int b) {
unsigned char a1 = (unsigned char)((a>>8)&0xFF);
unsigned char b1 = (unsigned char)((b>>8)&0xFF);
return a1*b1 ;
}
En le compilant avec avr-gcc
et les options -mmcu=atmega128 -Ofast
, j’obtiens le code assembleur suivant :
MulLInt:
mul r22,r24
movw r24,r0
clr __zero_reg__
ret
MulEInt:
mov r18,r25
ldi r19,0
mov r24,r23
ldi r25,0
movw r20,r24
mul r18,r20
movw r24,r0
mul r18,r21
add r25,r0
mul r19,r20
add r25,r0
clr r1
ret
Je ne vous ai pas tout mis parce que le reste n’a, je pense, pas d’intérêt dans ce problème. La fonction MulLInt
n’a qu’une seule multiplication (on fait une multiplication de deux octets donc c’est attendu) alors que la fonction MulEInt
, pour la même multiplication, effectue 3 mul
. Pourquoi cette différence ?
Merci pour vos réponses.
+0
-0