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







Zitieren

Lesezeichen