简单指针+循环测试,基本上都是iar胜过cosmic。
iar在寄存器和循环优化比cosmic好。
iar劣势在不会stm8复杂的寻址,不会操作ram,就只会用寄存器。
如果iar加上针对stm8的指令优化,相信效率超过cosmic不是难事。
void test1(uint8 *p)
{
uint8 i;
for(i=0;i<100;i++)
{
p=i;
}
}
IAR:
SECTION `.far_func.text`:CODE:NOROOT(0)
CODE
test1:
CLR A
??test1_0:
LD (X), A
ADD A, #0x1
INCW X
CP A, #0x64
JRC L:??test1_0
RETF
COSMIC:
54 ; 16 void test1(uint8 *p)
54 ; 17 {
56 switch .text
57 0000 _test1:
59 0000 89 pushw x
60 0001 88 push a
61 00000001 OFST: set 1
64 ; 19 for(i=0;i<100;i++)
66 0002 0f01 clr (OFST+0,sp)
67 0004 L33:
68 ; 21 p=i;
70 0004 7b02 ld a,(OFST+1,sp)
71 0006 97 ld xl,a
72 0007 7b03 ld a,(OFST+2,sp)
73 0009 1b01 add a,(OFST+0,sp)
74 000b 2401 jrnc L6
75 000d 5c incw x
76 000e L6:
77 000e 02 rlwa x,a
78 000f 7b01 ld a,(OFST+0,sp)
79 0011 f7 ld (x),a
80 ; 19 for(i=0;i<100;i++)
82 0012 0c01 inc (OFST+0,sp)
85 0014 7b01 ld a,(OFST+0,sp)
86 0016 a164 cp a,#100
87 0018 25ea jrult L33
88 ; 23 }
91 001a 5b03 addw sp,#3
92 001c 81 ret
void test2(uint16 *p)
{
uint8 i;
for(i=0;i<100;i++)
{
p=i;
}
}
IAR:
SECTION `.far_func.text`:CODE:NOROOT(0)
CODE
test2:
CLR A
??test2_0:
CLRW Y
LD YL, A
LDW (X), Y
ADD A, #0x1
ADDW X, #0x2
CP A, #0x64
JRC L:??test2_0
RETF// 37
// 38
COSMIC:
; 26 void test2(uint16 *p)
136 ; 27 {
137 switch .text
138 001d _test2:
140 001d 89 pushw x
141 001e 88 push a
142 00000001 OFST: set 1
145 ; 29 for(i=0;i<100;i++)
147 001f 4f clr a
148 0020 6b01 ld (OFST+0,sp),a
149 0022 L36:
150 ; 31 p=i;
152 0022 5f clrw x
153 0023 97 ld xl,a
154 0024 905f clrw y
155 0026 9097 ld yl,a
156 0028 9058 sllw y
157 002a 72f902 addw y,(OFST+1,sp)
158 002d 90ff ldw (y),x
159 ; 29 for(i=0;i<100;i++)
161 002f 0c01 inc (OFST+0,sp)
164 0031 7b01 ld a,(OFST+0,sp)
165 0033 a164 cp a,#100
166 0035 25eb jrult L36
167 ; 33 }
170 0037 5b03 addw sp,#3
171 0039 81 ret
void test3(uint8 *p1,uint8 *p2)
{
uint8 i;
for(i=0;i<100;i++)
{
p1=p2;
}
}
IAR:
SECTION `.far_func.text`:CODE:NOROOT(0)
CODE
test3:
LD A, #0x64
LD S:?b0, A
??test3_0:
LD A, (Y)
LD (X), A
INCW Y
INCW X
LD A, S:?b0
ADD A, #0xff
LD S:?b0, A
CLR A
CP A, S:?b0
JRNE L:??test3_0
RETF
COSMIC:
225 ; 35 void test3(uint8 *p1,uint8 *p2)
225 ; 36 {
226 switch .text
227 003a _test3:
229 003a 89 pushw x
230 003b 88 push a
231 00000001 OFST: set 1
234 ; 38 for(i=0;i<100;i++)
236 003c 0f01 clr (OFST+0,sp)
237 003e L711:
238 ; 40 p1=p2;
240 003e 7b02 ld a,(OFST+1,sp)
241 0040 97 ld xl,a
242 0041 7b03 ld a,(OFST+2,sp)
243 0043 1b01 add a,(OFST+0,sp)
244 0045 2401 jrnc L41
245 0047 5c incw x
246 0048 L41:
247 0048 02 rlwa x,a
248 0049 89 pushw x
249 004a 7b08 ld a,(OFST+7,sp)
250 004c 97 ld xl,a
251 004d 7b09 ld a,(OFST+8,sp)
252 004f 1b03 add a,(OFST+2,sp)
253 0051 2401 jrnc L61
254 0053 5c incw x
255 0054 L61:
256 0054 02 rlwa x,a
257 0055 f6 ld a,(x)
258 0056 85 popw x
259 0057 f7 ld (x),a
260 ; 38 for(i=0;i<100;i++)
262 0058 0c01 inc (OFST+0,sp)
265 005a 7b01 ld a,(OFST+0,sp)
266 005c a164 cp a,#100
267 005e 25de jrult L711
268 ; 42 }
271 0060 5b03 addw sp,#3
272 0062 81 ret
void test4(uint16 *p1,uint16 *p2)
{
uint8 i;
for(i=0;i<100;i++)
{
p1=p2;
}
}
IAR:
SECTION `.far_func.text`:CODE:NOROOT(0)
CODE
test4:
LDW S:?w0, X
LDW X, Y
LD A, #0x64
LD S:?b2, A
??test4_0:
LDW Y, X
LDW Y, (Y)
LDW [S:?w0.w], Y
ADDW X, #0x2
LDW Y, S:?w0
ADDW Y, #0x2
LDW S:?w0, Y
LD A, S:?b2
ADD A, #0xff
LD S:?b2, A
CLR A
CP A, S:?b2
JRNE L:??test4_0
RETF
COSMIC:
326 ; 44 void test4(uint16 *p1,uint16 *p2)
326 ; 45 {
327 switch .text
328 0063 _test4:
330 0063 89 pushw x
331 0064 88 push a
332 00000001 OFST: set 1
335 ; 47 for(i=0;i<100;i++)
337 0065 4f clr a
338 0066 6b01 ld (OFST+0,sp),a
339 0068 L351:
340 ; 49 p1=p2;
342 0068 5f clrw x
343 0069 97 ld xl,a
344 006a 58 sllw x
345 006b 72fb06 addw x,(OFST+5,sp)
346 006e 905f clrw y
347 0070 9097 ld yl,a
348 0072 9058 sllw y
349 0074 72f902 addw y,(OFST+1,sp)
350 0077 fe ldw x,(x)
351 0078 90ff ldw (y),x
352 ; 47 for(i=0;i<100;i++)
354 007a 0c01 inc (OFST+0,sp)
357 007c 7b01 ld a,(OFST+0,sp)
358 007e a164 cp a,#100
359 0080 25e6 jrult L351
360 ; 51 }
363 0082 5b03 addw sp,#3
364 0084 81 ret
cosmic不太熟悉,在STVD上选择优化是"maximize execute speed",
IAR优化选择是"High speed".
测试代码,楼上可以试试。
貌似论坛【i】显示有问题,换成【k】
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
void test1(uint8 *p)
{
uint8 k;
for(k=0;k<100;k++)
{
p[k]=k;
}
}
void test2(uint16 *p)
{
uint8 k;
for(k=0;k<100;k++)
{
p[k]=k;
}
}
void test3(uint8 *p1,uint8 *p2)
{
uint8 k;
for(k=0;k<100;k++)
{
p1[k]=p2[k];
}
}
void test4(uint16 *p1,uint16 *p2)
{
uint8 k;
for(k=0;k<100;k++)
{
p1[k]=p2[k];
}
}
SECTION `.far_func.text`:CODE:NOROOT(0) 这句楼主可以讲解下是什么意思吗?