Hallo,
ich habe eine Funktion add(char,char), die mir die Summe der beiden Werte liefert. Nun hat GCC 3.4.6 mit der Optimierung 2,3,s folgendes draus gemacht:
Code:
35 .global _Z3addcc
37 _Z3addcc:
38 .LFB42:
39 .LM1:
40 /* prologue: frame size=0 */
41 /* prologue end (size=0) */
42 0000 962F mov r25,r22
43 .LBB2:
44 .LM2:
45 0002 980F add r25,r24
46 .LBE2:
47 .LM3:
48 0004 892F mov r24,r25
49 0006 9927 clr r25
50 /* epilogue: frame size=0 */
51 0008 0895 ret
Es kommt aber noch dicker, Code bei Optimierung 0:
Code:
32 .global _Z3addcc
34 _Z3addcc:
35 .LFB42:
36 .LM1:
37 /* prologue: frame size=2 */
38 0000 CF93 push r28
39 0002 DF93 push r29
40 0004 CDB7 in r28,__SP_L__
41 0006 DEB7 in r29,__SP_H__
42 0008 2297 sbiw r28,2
43 000a 0FB6 in __tmp_reg__,__SREG__
44 000c F894 cli
45 000e DEBF out __SP_H__,r29
46 0010 0FBE out __SREG__,__tmp_reg__
47 0012 CDBF out __SP_L__,r28
48 /* prologue end (size=10) */
49 0014 8983 std Y+1,r24
50 0016 6A83 std Y+2,r22
51 .LBB2:
52 .LM2:
53 0018 9981 ldd r25,Y+1
54 001a 8A81 ldd r24,Y+2
55 001c 890F add r24,r25
56 001e 9927 clr r25
57 .LBE2:
58 /* epilogue: frame size=2 */
59 0020 2296 adiw r28,2
60 0022 0FB6 in __tmp_reg__,__SREG__
61 0024 F894 cli
62 0026 DEBF out __SP_H__,r29
63 0028 0FBE out __SREG__,__tmp_reg__
64 002a CDBF out __SP_L__,r28
65 002c DF91 pop r29
66 002e CF91 pop r28
67 0030 0895 ret
Bei der Optimerung 1 kommt jedoch das hier raus:
Code:
32 .global _Z3addcc
34 _Z3addcc:
35 .LFB42:
36 .LM1:
37 /* prologue: frame size=0 */
38 /* prologue end (size=0) */
39 .LBB2:
40 .LM2:
41 0000 860F add r24,r22
42 .LBE2:
43 .LM3:
44 0002 9927 clr r25
45 /* epilogue: frame size=0 */
46 0004 0895 ret
Kann mir jemand erklären, wieso GCC bei Opt. 0,2,3,s solch einen Mist produziert? Besonders bei Opt. 0, wo er anscheinend aus dem Hw-Stack einen Sw-Stack macht ???
MfG Mark
Lesezeichen