цикл без поллитры не соптимизируешь руками, это на отлично компилятор делает, а линейный код компилятор почти не распараллеливает, это эффективно можно сделать только на ассемблере. Так и получается - цикл на С пишу, и вставляю из сгенеренного компилером асм-файла в асм-исходник. Вот пример (от init prolog и до конца piped loop kernel сгенерено С-компилером, остальное плюс немного припараллеленного мной в прологе - мое ассемблерное):
[!B1] B .S2 L2 ; (P) |53|
|| [!B1] MVK .S1 0x80,A0
|| [!B1] MV .L2X A9,B4
|| [!B1] ADDAW .D2 B4,14,B9 ; +56
;---
; !D2
[!B1] MVK .S1 0xffffff80,A6
|| [!B1] MVK .S2 4,B0
|| [!B1] LDW .D2T2 *B9++,B6 ; (P) |50|
|| [!B1] LDW .D1T1 *A9++,A0 ; (P) ^ |47|
|| ABS .L2 B6,B6 ; B6 = abs((dms<<2) - dml)
;---
; B10 <= a[0]
; !D2
[!B1] MVK .S1 0x2,A2 ; init prolog collapse predicate
|| [!B1] ADD .L1X 1,B0,A1
|| [!B1] SHR .S2 B10,8,B11 ; B11 = a[0]>>8
|| [!B1] MV .D1 A5,A8 ; A8 <= dqsez
|| CMPLT .L2 B6,B13,B13 ; B13 = (abs((dms<<2) - dml))<(dml>>3)
;---
; A10 <= a[1]
;---
;** --------------------------------------------------------------------------*
L2: ; PIPED LOOP KERNEL
[ B1] MV .D1 A6,A7 ; if ((B2 ^ dq[i]) < 0) A7 = +128
|| [!B1] MVK .S1 0x80,A7 ; if ((B2 ^ dq[i]) >= 0) A7 = -128
|| [ B0] B .S2 L2 ;
[ B2] ADD .L1 A7,A3,A3 ; if (B2) A3 += A7
|| SHR .S1 A0,8,A5 ; A5 = b[i] >> 8
|| XOR .S2 B2,B6,B6 ; B6 = B2 ^ dq[i]
|| [ A1] LDW .D2T2 *B9++,B6 ;
|| [ A1] LDW .D1T1 *A9++,A0 ;
[ A2] SUB .D1 A2,1,A2 ;
|| [ A1] SUB .S1 A1,1,A1 ;
|| [!A2] STW .D2T1 A3,*B4++ ; store new b[i]
|| SUB .L1 A0,A5,A3 ; A3 = b[i] - (b[i] >> 8)
|| CMPLT .L2 B6,0,B1 ; B1 = (B2 ^ dq[i]) < 0
|| [ B0] SUB .S2 B0,1,B0 ;
;** --------------------------------------------------------------------------*
[!B1] MVK .S1 0x80,A7
|| [B1] MV .L1 A6,A7
|| LDHU .D1T1 *+A4(44),A6 ; PK[0]
|| SUB .L2 B10,B11,B11 ; B11 = a[0]-(a[0]>>8)
;---
[B2] ADD .D1 A7,A3,A3
|| XOR .S2 B2,B6,B6
|| SHR .S1 A0,8,A5
|| MV .L1 A8,A2 ; dqsez
;---
SUB .L1 A0,A5,A3
|| CMPLT .L2 B6,0,B1
|| STW .D2T1 A3,*B4++
|| SHR .S1 A10,7,A0 ; A0 = a[1]>>7
|| [!A2] B .S2 no_a2p
|| LDH .D1T2 *+A4(10),B2