А, ну да, ещё просуммировать надо... Это ещё немного быстрее
uint32_t a[1024], b[1024];
uint64_t sum;
void f(void)
{
for (int i = 0; i < 1024; i++)
{
sum += (uint64_t)a[i] * b[i];
}
}
08000568 <f>:
8000568: b4f0 push {r4, r5, r6, r7}
800056a: 4f09 ldr r7, [pc, #36] ; (8000590 <f+0x28>)
800056c: 4e09 ldr r6, [pc, #36] ; (8000594 <f+0x2c>)
800056e: 4d0a ldr r5, [pc, #40] ; (8000598 <f+0x30>)
8000570: 2100 movs r1, #0
8000572: e9d7 2300 ldrd r2, r3, [r7]
8000576: 5870 ldr r0, [r6, r1]
8000578: 586c ldr r4, [r5, r1]
800057a: 3104 adds r1, #4
800057c: f5b1 5f80 cmp.w r1, #4096 ; 0x1000
8000580: fbe0 2304 umlal r2, r3, r0, r4
8000584: d1f7 bne.n 8000576 <f+0xe>
8000586: e9c7 2300 strd r2, r3, [r7]
800058a: bcf0 pop {r4, r5, r6, r7}
800058c: 4770 bx lr
800058e: bf00 nop
8000590: 200018b8 .word 0x200018b8
8000594: 200018c0 .word 0x200018c0
8000598: 200008b8 .word 0x200008b8