Посмотрел я как компилируется моя функция разбора данных.
Лучше всего повел себя космик! Для иллюстрации выдрал кусочек в отдельную функцию
Код
void Set12(u8_t id, u16_t v);
void test_1(u8_t *ptr)
{
u8_t id, ext;
ext = ptr[0];
id = ptr[1];
Set12((id >> 4) + ext*8, ptr[2] | ((id & 0x0F)<<8) );
}
IAR что то перемудрил со сдвигами, даже разбираться в лом!
Код
\ test_1:
\ 000000 9093 LDW Y, X
119 u8_t id, ext;
120 ext = ptr[0];
121 id = ptr[1];
\ 000002 5C INCW X
\ 000003 F6 LD A, (X)
\ 000004 B700 LD S:?b0, A
122 Set12((id >> 4) + ext*8, ptr[2] | ((id & 0x0F)<<8) );
\ 000006 5F CLRW X
\ 000007 41 EXG A, XL
\ 000008 B600 LD A, S:?b0
\ 00000A 01 RRWA X, A
\ 00000B A40F AND A, #0xf
\ 00000D 02 RLWA X, A
\ 00000E 58 SLLW X
\ 00000F 58 SLLW X
\ 000010 58 SLLW X
\ 000011 58 SLLW X
\ 000012 58 SLLW X
\ 000013 58 SLLW X
\ 000014 58 SLLW X
\ 000015 58 SLLW X
\ 000016 BF00 LDW S:?w1, X
\ 000018 93 LDW X, Y
\ 000019 1C0002 ADDW X, #0x2
\ 00001C F6 LD A, (X)
\ 00001D 5F CLRW X
\ 00001E 97 LD XL, A
\ 00001F 01 RRWA X, A
\ 000020 BA00 OR A, S:?b3
\ 000022 01 RRWA X, A
\ 000023 BA00 OR A, S:?b2
\ 000025 01 RRWA X, A
\ 000026 90F6 LD A, (Y)
\ 000028 48 SLL A
\ 000029 48 SLL A
\ 00002A 48 SLL A
\ 00002B B700 LD S:?b1, A
\ 00002D B600 LD A, S:?b0
\ 00002F 4E SWAP A
\ 000030 A40F AND A, #0xf
\ 000032 BB00 ADD A, S:?b1
\ 000034 CC0000 JP L:Set12
123 }
Райзонанс, много лишних пересылок.
Код
; FUNCTION ?test_1 (BEGIN)
; Register-parameter ptr (XW) is relocated (auto)
; SOURCE LINE # 122
0000 89 PUSHW X
0001 89 PUSHW X
; SOURCE LINE # 125
0002 F6 LD A,(X)
0003 6B02 F LD (002H,SP),A ; [ ext ]
; SOURCE LINE # 126
0005 1E03 F LDW X,(003H,SP) ; [ ptr ]
0007 E601 LD A,(001H,X)
0009 6B01 F LD (001H,SP),A ; [ id ]
; SOURCE LINE # 127
000B A60F LD A,#00FH
000D 1401 F AND A,(001H,SP) ; [ id ]
000F 5F CLRW X
0010 95 LD XH,A
0011 BF03 F LDW ?CH.w,X
0013 1E03 F LDW X,(003H,SP) ; [ ptr ]
0015 B605 F LD A,?CH
0017 B703 F LD ?BH,A
0019 E602 LD A,(002H,X)
001B B704 F LD ?BL,A
001D BE02 F LDW X,?BH.w
001F 7B02 F LD A,(002H,SP) ; [ ext ]
0021 48 SLL A
0022 48 SLL A
0023 48 SLL A
0024 B703 F LD ?BH,A
0026 7B01 F LD A,(001H,SP) ; [ id ]
0028 4E SWAP A
0029 A40F AND A,#00FH
002B BB03 F ADD A,?BH
002D CD0000 F CALL ?Set12
0030 5B04 ADD SP,#004H
0032 81 RET
Космик - лучший код.
Код
477 021b _test_1:
478 021b 89 pushw x
479 021c 5203 subw sp,#3
480 00000003 OFST: set 3
482 ; 124 ext = ptr[0];
483 021e f6 ld a,(x)
484 021f 6b02 ld (OFST-1,sp),a
485 ; 125 id = ptr[1];
486 0221 e601 ld a,(1,x)
487 0223 6b03 ld (OFST+0,sp),a
488 ; 126 Set12((id >> 4) + ext*8, ptr[2] | ((id & 0x0F)<<8) );
489 0225 a40f and a,#15
490 0227 1604 ldw y,(OFST+1,sp)
491 0229 97 ld xl,a
492 022a 90e602 ld a,(2,y)
493 022d 02 rlwa x,a
494 022e 89 pushw x
495 022f 7b04 ld a,(OFST+1,sp)
496 0231 48 sll a
497 0232 48 sll a
498 0233 48 sll a
499 0234 6b03 ld (OFST+0,sp),a
500 0236 7b05 ld a,(OFST+2,sp)
501 0238 4e swap a
502 0239 a40f and a,#15
503 023b 1b03 add a,(OFST+0,sp)
504 023d cd0000 call _Set12
506 0240 85 popw x
507 ; 127 }
508 0241 5b05 addw sp,#5
509 0243 81 ret
Это только маленький кусочек. В общем на сейчас Космик выигрывает при функциях посложнее.
Например в кусочке Set8((Id & 0x1F)+Ext*32,*ptr++); стал вызывать билиотечную функцию сдвига, космик и IAR обошлись без нее!
У IAR возникают каие то артефакты!!! Про dec он вообще похоже не подозревает

Еще и такой код if (!--Len) return; скомпилировал как
Код
\ 0000A1 B600 LD A, S:?b8
\ 0000A3 ABFF ADD A, #0xff
\ 0000A5 B700 LD S:?b8, A
\ 0000A7 4F CLR A
\ 0000A8 B100 CP A, S:?b8
\ 0000AA 2600 JRNE ??lb_3
\ 0000AC CC0000 JP L:??parser_3
Цитата
К тому же IAR не использует стек, а использует виртуальные регистры. Что IMHO для этого ядра криво!
Здесь я был не прав! Это здорово улучшаед код - особенно при использовании специфической адресации
Indirect и Indexed Inderec - получаются аппаратные указатели.Так что когда IAR полечат от артефактов код у него будет хороший!
Райзонанс тоже использует виртуальные регистры, А космик стек.