йцукен (25.11.2017 14:01, просмотров: 529) ответил lloyd на Общеизвестно, что ARM-архитектуры хуже дружат с типами, отличающимися по размеру от размера регистра.
Поскольку мне это не было известно, проделал эксперимент. Функция складывает два вектора длиной 1024. Процессор F303, частота 72МГц, компилятор IAR8.11. Время выполнения в тактах не зависит signed/unsigned, но зависит от битности: 8 - 7425, 16 - 7423, 32 - 8187. Исходник и листинг:
#define SZ 1024
uint8_t a[SZ], b[SZ], c[SZ];
int cyc_count;
void vector_add( void )
{
int t0 = DWT->CYCCNT;
for ( int j = 0; j < SZ; j++ )
a[j] = b[j] + c[j];
cyc_count = DWT->CYCCNT - t0;
}
295 void vector_add( void )
296 {
\ _Z10vector_addv: (+1)
\ 00000000 0xB4F0 PUSH {R4-R7}
297 int t0 = DWT->CYCCNT;
\ 00000002 0x.... 0x.... LDR.W R1,??DataTable9_5 ;; 0xe0001004
298 for ( int j = 0; j < SZ; j++ )
\ 00000006 0x.... 0x.... LDR.W R3,??DataTable9_1
\ 0000000A 0x680A LDR R2,[R1, #+0]
\ 0000000C 0x.... 0x.... LDR.W R6,??DataTable9_6
\ 00000010 0xF203 0x7414 ADDW R4,R3,#+1812
\ 00000014 0xF603 0x3514 ADDW R5,R3,#+2836
\ 00000018 0xF44F 0x7080 MOV R0,#+256
299 a[j] = b[j] + c[j];
\ ??vector_add_0: (+1)
\ 0000001C 0xF815 0x7B01 LDRB R7,[R5], #+1
\ 00000020 0xF816 0xCB01 LDRB R12,[R6], #+1
\ 00000024 0x4467 ADD R7,R12,R7
\ 00000026 0xF804 0x7B01 STRB R7,[R4], #+1
\ 0000002A 0x1E40 SUBS R0,R0,#+1
\ 0000002C 0xF815 0x7B01 LDRB R7,[R5], #+1
\ 00000030 0xF816 0xCB01 LDRB R12,[R6], #+1
\ 00000034 0x4467 ADD R7,R12,R7
\ 00000036 0xF804 0x7B01 STRB R7,[R4], #+1
\ 0000003A 0xF816 0xCB01 LDRB R12,[R6], #+1
\ 0000003E 0xF815 0x7B01 LDRB R7,[R5], #+1
\ 00000042 0x4467 ADD R7,R12,R7
\ 00000044 0xF804 0x7B01 STRB R7,[R4], #+1
\ 00000048 0xF816 0xCB01 LDRB R12,[R6], #+1
\ 0000004C 0xF815 0x7B01 LDRB R7,[R5], #+1
\ 00000050 0x4467 ADD R7,R12,R7
\ 00000052 0xF804 0x7B01 STRB R7,[R4], #+1
\ 00000056 0xD1E1 BNE.N ??vector_add_0
300 cyc_count = DWT->CYCCNT - t0;
\ 00000058 0x6808 LDR R0,[R1, #+0]
\ 0000005A 0x1A82 SUBS R2,R0,R2
\ 0000005C 0xF8C3 0x2F14 STR R2,[R3, #+3860]
301 }
\ 00000060 0xBCF0 POP {R4-R7}
\ 00000062 0x4770 BX LR ;; return