Это не считается?
Спойлер



Нет, это обычное конвеерное выполнение команд, при котором иногда можно сэкономить лишний такт. До M7 не было ни сдвоенного ALU, ни двухканального доступа к памяти, для этого как минимум нужна 64-х битная шина...И предыдущие ядра Cortex-M умели подобное, но не для MAC, а для инструкций LDR: если две LDR выполнять последовательно, то вторая может быть укорочена на один такт, при соблюдении каких-то дополнительных условий.
Код: Выделить всё
newin = invar*200000/101833;Код: Выделить всё
newin = invar*514851/262144;Код: Выделить всё
; W10=pA
; W11=pB
; W8=pW
; A=A+B
; B=(A-B)W
BtflCmplx:
mov #0x7FFF, W4 ; W4=0.99999
clr A, [W10]+=2, W6 ; W6=Ar, [W10]->Ai
clr B, [W8]+=2, W5, [W11]+=2, W7 ; W7=Br, [W11]->Bi, W5=Wr [W8]->Wi
;--- perform A
mac W4*W6, A, [W10]-=2, W6 ; ACCA+=(1*Ar), W6=Ai, [W10]->Ar
mac W4*W7, A, [W11]-=2, W7 ; ACCA+=(1*Br), W7=Bi, [W11]->Br
sac.r A, #-1, [W13++] ; Ar(new)=ACCA.rnd->buf
mac W4*W6, B, [W10]+=2, W6 ; ACCB+=(1*Ai), W6=Ar, [W10]->Ai
mac W4*W7, B, [W11]+=2, W7 ; ACCB+=(1*Bi), W7=Br, [W11]->Bi
sac.r B, #-1, [W13++] ; Ai(new)=ACCB.rnd->buf
;--- perform B
mpy W5*W6, A, [W10]-=2, W6 ; ACCA=Wr*Ar, W6=Ai, [W10]->Ar
msc W5*W7, A, [W8]-=2, W5, [W11]-=2, W7 ; ACCA-=(Wr*Br), W5=Wi, [W8]->Wr, W7=Bi, [W11]->Br
msc W5*W6, A ; ACCA-=(Wi*Ai)
mac W5*W7, A, [W8]+=2, W5 ; ACCA+=(Wi*Bi), W5=Wr, [W8]->Wi
sac.r A, #-1, [W13++] ; Br(new)=ACCA.rnd->buf
mpy W5*W6, B, [W10]+=2, W6 ; ACCB=Wr*Ai, W6=Ar, [W10]->Ai
msc W5*W7, B, [W8], W5, [W11]+=2, W7 ; ACCB-=(Wr*Bi), W5=Wi, W7=Br, [W11]->Bi
mac W5*W6, B ; ACCB+=(Wi*Ar)
msc W5*W7, B ; ACCB-=(Wi*Br)
sac.r B, #-1, [W13] ; Bi(new)=ACCB.rnd->buf
;--- save result
mov [W13--], [W11--] ; save Bi
mov [W13--], [W11] ; save Br
mov [W13--], [W10--] ; save Ai
mov [W13], [W10] ; save Ar
return