Краткий ответ: add x1, x1, #4
Ваш код далек от оптимального:
- Существует множество опасностей для трубопровода. разверните глубже
- вы должны всегда отсчитывать счетчик l oop
- вам следует избегать ненужного доступа к памяти (результат)
- вам следует избегать ненужных операций mov
Если iter
кратно 16, предлагается код ниже:
.func
// extern float sumDiffSquare(float *pA, float *pB, uint32_t length);
// assert(length >= 16);
// assert(length & 15 == 0);
pA .req x0
pB .req x1
length .req x2
sumDiffSqare:
movi v0.16b, #0
.balign 64
1:
ldp q16, q17, [pA], #32
ldp q20, q21, [pB], #32
ldp q18, q19, [pA], #32
ldp q22, q23, [pB], #32
subs length, length, #16
fsub v16.4s, v20.4s, v16.4s
fsub v17.4s, v21.4s, v17.4s
fsub v18.4s, v22.4s, v18.4s
fsub v19.4s, v23.4s, v19.4s
fmla v0.4s, v16.4s, v16.4s
fmla v0.4s, v17.4s, v17.4s
fmla v0.4s, v18.4s, v18.4s
fmla v0.4s, v19.4s, v19.4s
b.gt 1b
faddp v0.4s, v0.4s, v0.4s
faddp v0.2s, v0.2s, v0.2s
ret
.endfunc