Re: C: Arduino : Přesun pole bytů do proměnné unsigned long
Jindroush
jindroush na seznam.cz
Středa Listopad 8 19:47:42 CET 2023
Toto je ale velmi vtipne, ten rozdil!
To vypada, jako by si optimalizator v tom druhem pripade nedokazal dat
dohromady, ze bb.b[0...3] je totez jako bb.w32, jako prosty alias, takze
to provedl ve dvou nezavislych operacich.
V prvnim pripade mezivysledek rovnou pouzil v druhem radku.
A protoze jsem na mnoooohoregistrove architekture nikdy nic nedelal -
proc v druhem pripade pouziva r20, r18, r19, r24 pro ten prvni radek, a
ne porad dokola jen jeden registr? To uz tam je pouzit nejaky
pipelining, takze ty instrukce jedou paralelne? (takze by jim sdileni
registru zpusobovalo cekani?)
J.
On 08.11.2023 19:34, Jan Waclawek wrote:
>
> Pricom odvolavam co som odvolal. Skusil som niekolko sposobov na niekolkych
> verziach gcc, a "optimalne" fungoval naozaj len ten cez type punning cez
> pretypovanie smernika...
>
> b1 = *(uint32_t*)&rx[3];
> c = b1;
>
> 27 0018 8091 0000 lds r24,rx+3
> 28 001c 9091 0000 lds r25,rx+3+1
> 29 0020 A091 0000 lds r26,rx+3+2
> 30 0024 B091 0000 lds r27,rx+3+3
> 31 0028 8093 0000 sts b1,r24
> 32 002c 9093 0000 sts b1+1,r25
> 33 0030 A093 0000 sts b1+2,r26
> 34 0034 B093 0000 sts b1+3,r27
> 35 0038 8093 0000 sts c,r24
> 36 003c 9093 0000 sts c+1,r25
> 37 0040 A093 0000 sts c+2,r26
> 38 0044 B093 0000 sts c+3,r27
>
> bb.b[0] = rx[3]; bb.b[1] = rx[4]; bb.b[2] = rx[5]; bb.b[3] = rx[6];
> c = bb.w32;
>
> 39 0048 4091 0000 lds r20,rx+3
> 40 004c 4093 0000 sts bb,r20
> 41 0050 2091 0000 lds r18,rx+4
> 42 0054 2093 0000 sts bb+1,r18
> 43 0058 3091 0000 lds r19,rx+5
> 44 005c 3093 0000 sts bb+2,r19
> 45 0060 8091 0000 lds r24,rx+6
> 46 0064 8093 0000 sts bb+3,r24
> 47 0068 C090 0000 lds r12,bb
> 48 006c D090 0000 lds r13,bb+1
> 49 0070 E090 0000 lds r14,bb+2
> 50 0074 F090 0000 lds r15,bb+3
> 51 0078 C092 0000 sts c,r12
> 52 007c D092 0000 sts c+1,r13
> 53 0080 E092 0000 sts c+2,r14
> 54 0084 F092 0000 sts c+3,r15
>
--
Jindroush <jindroush na seznam.cz>
Další informace o konferenci Hw-list