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:
Es kommt aber noch dicker, Code bei Optimierung 0: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
Bei der Optimerung 1 kommt jedoch das hier raus: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
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 ???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
MfG Mark