Цитата(SasaVitebsk @ Oct 21 2007, 00:07)

По сравнению с вариантом от Сергей Борщ, любезно им предоставленном мне, проигрыш вашего варианта оптимизации на этой подпрограмме составил 26 байт. Хотя честно говоря я не понимаю почему. Я оптимизировал прерывания примерно вашим способом. Видимо знаний компилятора недостаточно.
Мой вариант, это еще был не "мой" вариант, к реальной оптимизации я просто не приступал
так, показал направление ....
Вам нравится IAR ?
Хорошо, будет для IAR:
Код
143
144 __z void InvMixColumn1( byte * column ,byte bpoly_);
145
\ In segment CODE, align 2, keep-with-next
146 __z void InvMixColumn(byte *column)
\ InvMixColumn:
147 {
148 InvMixColumn1( column ,BPOLY);
\ 00000000 E10B LDI R16, 27
\ 00000002 REQUIRE InvMixColumn1
\ 00000002 ; // Fall through to label InvMixColumn1
149 }
\ In segment CODE, align 2, keep-with-next
150 __z void InvMixColumn1( byte * column ,byte bpoly)
\ InvMixColumn1:
151 {
152 byte r0, r1, r2, r3;
153 byte co0 = column[0],co1=column[1],co2=column[2],co3=column[3];
\ 00000000 8110 LD R17, Z
\ 00000002 8121 LDD R18, Z+1
\ 00000004 8132 LDD R19, Z+2
\ 00000006 8143 LDD R20, Z+3
154 byte tmp;
155
156 r0 = co1 ^ co2 ^ co3;
\ 00000008 2F53 MOV R21, R19
\ 0000000A 2752 EOR R21, R18
\ 0000000C 2754 EOR R21, R20
157 r1 = co0 ^ co2 ^ co3;
\ 0000000E 2F63 MOV R22, R19
\ 00000010 2761 EOR R22, R17
\ 00000012 2764 EOR R22, R20
158 tmp = r0 ^ r1;
\ 00000014 2F76 MOV R23, R22
\ 00000016 2775 EOR R23, R21
159 r2 = tmp ^ co3;
\ 00000018 2E04 MOV R0, R20
\ 0000001A 2607 EOR R0, R23
160 r3 = tmp ^ co2;
\ 0000001C 2E13 MOV R1, R19
\ 0000001E .... RCALL ?Subroutine0
161
162 co0 = (tmp=co0) << 1;
163 if ((tmp & 0x80)==0x80) co0 ^= bpoly;
164 co1 = (tmp=co1) << 1;
165 if ((tmp & 0x80)==0x80) co1 ^= bpoly;
166 co2 = (tmp=co2) << 1;
167 if ((tmp & 0x80)==0x80) co2 ^= bpoly;
168 co3 = (tmp=co3) << 1;
169 if ((tmp & 0x80)==0x80) co3 ^= bpoly;
170
171 r0 ^= co0 ^ co1;
\ ??CrossCallReturnLabel_0:
\ 00000020 2F72 MOV R23, R18
\ 00000022 2771 EOR R23, R17
\ 00000024 2757 EOR R21, R23
172 r1 ^= co1 ^ co2;
\ 00000026 2F73 MOV R23, R19
\ 00000028 2772 EOR R23, R18
\ 0000002A 2767 EOR R22, R23
173 r2 ^= co2 ^ co3;
\ 0000002C 2F74 MOV R23, R20
\ 0000002E 2773 EOR R23, R19
\ 00000030 2607 EOR R0, R23
174 r3 ^= co0 ^ co3;
\ 00000032 2F74 MOV R23, R20
\ 00000034 2771 EOR R23, R17
\ 00000036 .... RCALL ?Subroutine0
175
176 co0 = (tmp=co0) << 1;
177 if ((tmp & 0x80)==0x80) co0 ^= bpoly;
178 co1 = (tmp=co1) << 1;
179 if ((tmp & 0x80)==0x80) co1 ^= bpoly;
180 co2 = (tmp=co2) << 1;
181 if ((tmp & 0x80)==0x80) co2 ^= bpoly;
182 co3 = (tmp=co3) << 1;
183 if ((tmp & 0x80)==0x80) co3 ^= bpoly;
184
185 r0 ^= co0 ^ co2;
\ ??CrossCallReturnLabel_1:
\ 00000038 2F73 MOV R23, R19
\ 0000003A 2771 EOR R23, R17
\ 0000003C 2757 EOR R21, R23
186 r1 ^= co1 ^ co3;
\ 0000003E 2F74 MOV R23, R20
\ 00000040 2772 EOR R23, R18
\ 00000042 2767 EOR R22, R23
187 r2 ^= co0 ^ co2;
\ 00000044 2F73 MOV R23, R19
\ 00000046 2771 EOR R23, R17
\ 00000048 2607 EOR R0, R23
188 r3 ^= co1 ^ co3;
\ 0000004A 2F74 MOV R23, R20
\ 0000004C 2772 EOR R23, R18
\ 0000004E .... RCALL ?Subroutine0
189
190 co0 = (tmp=co0) << 1;
191 if ((tmp & 0x80)==0x80) co0 ^= bpoly;
192 co1 = (tmp=co1) << 1;
193 if ((tmp & 0x80)==0x80) co1 ^= bpoly;
194 co2 = (tmp=co2) << 1;
195 if ((tmp & 0x80)==0x80) co2 ^= bpoly;
196 co3 = (tmp=co3) << 1;
197 if ((tmp & 0x80)==0x80) co3 ^= bpoly;
198
199 tmp=co0 ^ co1 ^ co2 ^ co3;
\ ??CrossCallReturnLabel_2:
\ 00000050 2721 EOR R18, R17
\ 00000052 2723 EOR R18, R19
\ 00000054 2724 EOR R18, R20
200
201 column[0] = tmp ^ r0;
\ 00000056 2752 EOR R21, R18
\ 00000058 8350 ST Z, R21
202 column[1] = tmp ^ r1;
\ 0000005A 2762 EOR R22, R18
\ 0000005C 8361 STD Z+1, R22
203 column[2] = tmp ^ r2;
\ 0000005E 2602 EOR R0, R18
\ 00000060 8202 STD Z+2, R0
204 column[3] = tmp ^ r3;
\ 00000062 2612 EOR R1, R18
\ 00000064 8213 STD Z+3, R1
205 }
\ 00000066 9508 RET
\ In segment CODE, align 2, keep-with-next
\ ?Subroutine0:
\ 00000000 2617 EOR R1, R23
\ 00000002 2F71 MOV R23, R17
\ 00000004 0F11 LSL R17
\ 00000006 FB77 BST R23, 7
\ 00000008 F40E BRTC ??Subroutine0_0
\ 0000000A 2710 EOR R17, R16
\ ??Subroutine0_0:
\ 0000000C 2F72 MOV R23, R18
\ 0000000E 0F22 LSL R18
\ 00000010 FB77 BST R23, 7
\ 00000012 F40E BRTC ??Subroutine0_1
\ 00000014 2720 EOR R18, R16
\ ??Subroutine0_1:
\ 00000016 2F73 MOV R23, R19
\ 00000018 0F33 LSL R19
\ 0000001A FB77 BST R23, 7
\ 0000001C F40E BRTC ??Subroutine0_2
\ 0000001E 2730 EOR R19, R16
\ ??Subroutine0_2:
\ 00000020 2F74 MOV R23, R20
\ 00000022 0F44 LSL R20
\ 00000024 FB77 BST R23, 7
\ 00000026 F40E BRTC ??Subroutine0_3
\ 00000028 2740 EOR R20, R16
\ ??Subroutine0_3:
\ 0000002A 9508 RET
ИТОГО:
150 байтов программного кода (уже в 2 раза лучше чем оригинал

)
И если еще чуть напрячь мозг, то можно на 20-30 байт сократить...