On Saturday 19 April 2008 14:27, you wrote: > the source you refer to has assembler prolog/epilog. ie its old. Nice joke Andy. Sorry to say this, some of us still live in the stone age and use gcc 4.2.3 ;-)
> The latest is written in RTL and does much better job of minimizing > the code. (I have attached below) Thanks, I see that the special treament of the main function has disappeared, but it does not awnser the question i had. > The frame pointer should only be used if it is needed. It will be > omitted otherwise with fomit_frame_pointer. > If stack space is needed for variables, then it will not be omitted. > R28/29 is used as frame_pointer. It can also be used for other purposes. > This register must be preserved by function. If function does not need > frame but calls another function, R28/29 will be saved. Then i don't think this works exactly according to specs. Below i have the assembly of a function from my OS. It was compiled with a -fomit_frame_pointer. The compiler decided it needs a framepointer anyway. to save just one variable over a call ( address 1174 ). Since that was the only use of the frame pointer it could have used r28 or r29 itself (as you stated that has to be fixed yet) but it could have also choosen one of the other unused registers: r3,r4,r5,r6,r7,r8,r9,r10,r11,r18,r19,r20,r21,r23,r26,r27 Why did it not do so? What is going on here? regards Ruud 0000112e <privQueuRequestBody>: 112e: cd b7 in r28, 0x3d ; 61 1130: de b7 in r29, 0x3e ; 62 1132: 21 97 sbiw r28, 0x01 ; 1 1134: 0f b6 in r0, 0x3f ; 63 1136: f8 94 cli 1138: de bf out 0x3e, r29 ; 62 113a: 0f be out 0x3f, r0 ; 63 113c: cd bf out 0x3d, r28 ; 61 113e: 08 2f mov r16, r24 1140: f6 2e mov r15, r22 1142: a1 dc rcall .-1726 ; 0xa86 <privInitOs> 1144: 87 dc rcall .-1778 ; 0xa54 <tcbCurrent> 1146: 6c 01 movw r12, r24 1148: 6f 2d mov r22, r15 114a: 80 2f mov r24, r16 114c: b5 da rcall .-2710 ; 0x6b8 <privQueuTest> 114e: 98 2f mov r25, r24 1150: 1f 14 cp r1, r15 1152: 1c f4 brge .+6 ; 0x115a <privQueuRequestBody+0x2c> 1154: 8f 15 cp r24, r15 1156: e0 f0 brcs .+56 ; 0x1190 <privQueuRequestBody+0x62> 1158: 06 c0 rjmp .+12 ; 0x1166 <privQueuRequestBody+0x38> 115a: ff 20 and r15, r15 115c: 21 f0 breq .+8 ; 0x1166 <privQueuRequestBody+0x38> 115e: 8f 2d mov r24, r15 1160: 81 95 neg r24 1162: 98 17 cp r25, r24 1164: a8 f0 brcs .+42 ; 0x1190 <privQueuRequestBody+0x62> 1166: 90 e0 ldi r25, 0x00 ; 0 1168: 10 2f mov r17, r16 116a: 1f 70 andi r17, 0x0F ; 15 116c: 10 68 ori r17, 0x80 ; 128 116e: 61 2f mov r22, r17 1170: 89 2f mov r24, r25 1172: 99 83 std Y+1, r25 ; 0x01 1174: 85 dd rcall .-1270 ; 0xc80 <privOperateSlotStack> 1176: 99 81 ldd r25, Y+1 ; 0x01 1178: 88 23 and r24, r24 117a: 31 f0 breq .+12 ; 0x1188 <privQueuRequestBody+0x5a> 117c: 07 ff sbrs r16, 7 117e: 08 c0 rjmp .+16 ; 0x1190 <privQueuRequestBody+0x62> 1180: 60 2f mov r22, r16 1182: 89 2f mov r24, r25 1184: 4b dd rcall .-1386 ; 0xc1c <privReleaseTask> 1186: 04 c0 rjmp .+8 ; 0x1190 <privQueuRequestBody+0x62> 1188: 9f 5f subi r25, 0xFF ; 255 118a: 92 30 cpi r25, 0x02 ; 2 118c: 41 f0 breq .+16 ; 0x119e <privQueuRequestBody+0x70> 118e: ef cf rjmp .-34 ; 0x116e <privQueuRequestBody+0x40> 1190: 80 2f mov r24, r16 1192: 80 68 ori r24, 0x80 ; 128 1194: 94 dd rcall .-1240 ; 0xcbe <privLockCurrentTaskOnSlot> 1196: f6 01 movw r30, r12 1198: f5 82 std Z+5, r15 ; 0x05 119a: 81 e0 ldi r24, 0x01 ; 1 119c: 03 c0 rjmp .+6 ; 0x11a4 <privQueuRequestBody+0x76> 119e: 80 2f mov r24, r16 11a0: 8e dd rcall .-1252 ; 0xcbe <privLockCurrentTaskOnSlot> 11a2: 80 e0 ldi r24, 0x00 ; 0 11a4: 1a de rcall .-972 ; 0xdda <privEnterOS> _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list