IARSTM8并不是一无是处,简单循环比较iar,cosmic效率
[复制链接]
简单指针+循环测试,基本上都是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 0 f01 clr (OFST+0 ,sp)
67 0004 L33:
68 ; 21 p=i;
70 0004 7 b02 ld a,(OFST+1 ,sp)
71 0006 97 ld xl,a
72 0007 7 b03 ld a,(OFST+2 ,sp)
73 0009 1 b01 add a,(OFST+0 ,sp)
74 000 b 2401 jrnc L6
75 000 d 5 c incw x
76 000 e L6:
77 000 e 02 rlwa x,a
78 000 f 7 b01 ld a,(OFST+0 ,sp)
79 0011 f7 ld (x),a
80 ; 19 for (i=0 ;i<100 ;i++)
82 0012 0 c01 inc (OFST+0 ,sp)
85 0014 7 b01 ld a,(OFST+0 ,sp)
86 0016 a164 cp a,#100
87 0018 25 ea jrult L33
88 ; 23 }
91 001 a 5 b03 addw sp,#3
92 001 c 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 001 d _test2:
140 001 d 89 pushw x
141 001 e 88 push a
142 00000001 OFST: set 1
145 ; 29 for (i=0 ;i<100 ;i++)
147 001 f 4 f clr a
148 0020 6 b01 ld (OFST+0 ,sp),a
149 0022 L36:
150 ; 31 p=i;
152 0022 5 f clrw x
153 0023 97 ld xl,a
154 0024 905 f clrw y
155 0026 9097 ld yl,a
156 0028 9058 sllw y
157 002 a 72 f902 addw y,(OFST+1 ,sp)
158 002 d 90 ff ldw (y),x
159 ; 29 for (i=0 ;i<100 ;i++)
161 002 f 0 c01 inc (OFST+0 ,sp)
164 0031 7 b01 ld a,(OFST+0 ,sp)
165 0033 a164 cp a,#100
166 0035 25 eb jrult L36
167 ; 33 }
170 0037 5 b03 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 003 a _test3:
229 003 a 89 pushw x
230 003 b 88 push a
231 00000001 OFST: set 1
234 ; 38 for (i=0 ;i<100 ;i++)
236 003 c 0 f01 clr (OFST+0 ,sp)
237 003 e L711:
238 ; 40 p1=p2;
240 003 e 7 b02 ld a,(OFST+1 ,sp)
241 0040 97 ld xl,a
242 0041 7 b03 ld a,(OFST+2 ,sp)
243 0043 1 b01 add a,(OFST+0 ,sp)
244 0045 2401 jrnc L41
245 0047 5 c incw x
246 0048 L41:
247 0048 02 rlwa x,a
248 0049 89 pushw x
249 004 a 7 b08 ld a,(OFST+7 ,sp)
250 004 c 97 ld xl,a
251 004 d 7 b09 ld a,(OFST+8 ,sp)
252 004 f 1 b03 add a,(OFST+2 ,sp)
253 0051 2401 jrnc L61
254 0053 5 c 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 0 c01 inc (OFST+0 ,sp)
265 005 a 7 b01 ld a,(OFST+0 ,sp)
266 005 c a164 cp a,#100
267 005 e 25 de jrult L711
268 ; 42 }
271 0060 5 b03 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 4 f clr a
338 0066 6 b01 ld (OFST+0 ,sp),a
339 0068 L351:
340 ; 49 p1=p2;
342 0068 5 f clrw x
343 0069 97 ld xl,a
344 006 a 58 sllw x
345 006 b 72 fb06 addw x,(OFST+5 ,sp)
346 006 e 905 f clrw y
347 0070 9097 ld yl,a
348 0072 9058 sllw y
349 0074 72 f902 addw y,(OFST+1 ,sp)
350 0077 fe ldw x,(x)
351 0078 90 ff ldw (y),x
352 ; 47 for (i=0 ;i<100 ;i++)
354 007 a 0 c01 inc (OFST+0 ,sp)
357 007 c 7 b01 ld a,(OFST+0 ,sp)
358 007 e a164 cp a,#100
359 0080 25e6 jrult L351
360 ; 51 }
363 0082 5 b03 addw sp,#3
364 0084 81 ret