¿Se puede optimizar más este código de ensamblaje?

0

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!

    
pregunta eelhonk

0 respuestas

Lea otras preguntas en las etiquetas