Actualmente estoy escribiendo algunos de mis primeros códigos de ensamblaje para un nuevo proyecto, estoy aplicando un pequeño algoritmo de filtro a algunos datos de onda de diente de sierra que se guardan en la memoria, para atenuar los bordes.
El algoritmo que se está utilizando es:
y [0] = x [-2] / 8 + x [-1] / 8 + x [0] / 4 + x [1] / 8 + x [2] / 8
He pasado mucho tiempo mirando mi código pero parece que no puedo optimizarlo más. El código de ensamblaje que he escrito está en un bucle para la longitud de los datos y he aplicado el algoritmo como tal:
LDMIA r0,{r5-r9} ; get the next 5 data values to be filtered
ADD r5,r5,r9 ; sum x[-2] with x[2]
ADD r6,r6,r8 ; sum x[-1] with x[1]
ADD r9,r5,r6 ; sum x[-2]+x[2] with x[-1]+x[1]
ADD r7,r7,r9,LSR #1 ; sum x[0] with (x[-2]+x[2]+x[-1]+x[1])/2
MOV r7,r7,LSR #2 ; form (x[0] + (x[-2]+x[-1]+x[1]+x[2])/2)/4
STR r7,[r3],#4 ; save calculated filtered value
ADD r0,r0,#4 ; move pointer address forward
SUBS r4,r4,#1 ; decrement loop counter
¿Puede alguien ver en cualquier lugar que podría haber optimizado esto mejor?
Gracias de antemano!