Estoy trabajando con un dsPIC33EP64GS506
, y aquí puede encontrar su hoja de datos: link .
En la hoja de datos dsPIC (página 294) dice que admite 4 instrucciones de división:
DIV.S Wm,Wn Signed 16/16-bit integer divide
DIV.SD Wm,Wn Signed 32/16-bit integer divide
DIV.U Wm,Wn Unsigned 16/16-bit integer divide
DIV.UD Wm,Wn Unsigned 32/16-bit integer divide
Ahora, cuando trato de dividir dos variables en C, una variable de 32 bits por una variable de 16 bits, el compilador por alguna razón decide no usar estas instrucciones, pero la función ___divsi3
en su lugar, que es una implementación de software del algoritmo de división. Yo uso la versión gratuita del compilador xc16 de Microchip. Tome este código C simple, por ejemplo:
volatile int32_t num = 65537;
volatile int16_t den = 16384;
volatile int16_t res = num/den;
compila al siguiente código de ensamblaje:
MOV [W15-22], W0
MOV [W15-20], W1
MOV [W15-18], W2
ASR W2, #15, W3
RCALL ___divsi3
MOV W0, [W15-16]
¿Cómo puedo convencer a un compilador para que use la instrucción DIV.SD
para dividir estas dos variables?