oops... my fault... if no optimization implied saveprologue does not work. ~d
On Thursday 15 April 2004 12:03, Peter Jansen wrote: > With msp430-gcc V3.2.3 I seem to get incorrect code when using the > saveprologue attribute function on an interrupt function (maybe this is > not intended to work this way) > > Here is my test code, > > /* > * msp saveprologue test routine > */ > > #include <io.h> > #include <signal.h> > > volatile int a; > > main() > { > int x; > > for (;;) > { > x = x + a; > a = 0; > } > } > > interrupt (TIMERA1_VECTOR) timerA1Int(void) > { > a = 1; > } > > interrupt (TIMERA0_VECTOR) saveprologue timerA0Int(void) > { > a = 2; > } > > The compile line and compile output > > [peter_...@sts-cvs test]$ msp430-gcc -v -mmcu=msp430x149 -o test test.c > Reading specs from /usr/local/lib/gcc-lib/msp430/3.2.3/specs > Configured with: ../gcc-3.2.3/configure --target=msp430 > Thread model: single > gcc version 3.2.3 > /usr/local/lib/gcc-lib/msp430/3.2.3/cc1 -lang-c -v -D__GNUC__=3 > -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=3 -D__GXX_ABI_VERSION=102 > -DMSP430 -D__MSP430__ -D__MSP430 -D__NO_INLINE__ -D__STDC_HOSTED__=1 > -DMSP430_HAS_HW_MUL -D__MSP430_149__ -DMSP430_HAS_HWMUL > -D__SIZE_TYPE__=unsigned int -D__PTRDIFF_TYPE__=int -D__INT_MAX__=32767 > test.c -quiet -dumpbase test.c -mmcu=msp430x149 -version -o /tmp/ccbZOnZg.s > GNU CPP version 3.2.3 (cpplib) (GNU assembler syntax) > GNU C version 3.2.3 (msp430) > compiled by GNU C version 3.2 20020903 (Red Hat Linux 8.0 3.2-7). > ignoring nonexistent directory "NONE/include" > ignoring nonexistent directory "/usr/local/msp430/sys-include" > #include "..." search starts here: > #include <...> search starts here: > /usr/local/lib/gcc-lib/msp430/3.2.3/include > /usr/local/msp430/include > End of search list. > /usr/local/lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/as -o > /tmp/cc4BB3Rr.o /tmp/ccbZOnZg.s > msp430-ld -m msp430x149 -o test > /usr/local/lib/gcc-lib/msp430/3.2.3/../../../../msp430/lib/crt430x149.o > -L/usr/local/lib/gcc-lib/msp430/3.2.3/msp2 > -L/usr/local/lib/gcc-lib/msp430/3.2.3 > -L/usr/local/lib/gcc-lib/msp430/3.2.3/../../../../msp430/lib/msp2 > -L/usr/local/lib/gcc-lib/msp430/3.2.3/../../../../msp430/lib > /tmp/cc4BB3Rr.o -lgcc -lc -lgcc > > and the generated code > [peter_...@sts-cvs test]$ msp430-objdump -dS test > > test: file format elf32-msp430 > > Disassembly of section .text: > > 00001100 <_reset_vector__>: > 1100: b2 40 80 5a mov #23168, &0x0120 ;#0x5a80 > 1104: 20 01 > 1106: 3f 40 90 11 mov #4496, r15 ;#0x1190 > 110a: 3e 40 00 02 mov #512, r14 ;#0x0200 > 110e: 3d 40 00 02 mov #512, r13 ;#0x0200 > 1112: 0d 9e cmp r14, r13 ; > 1114: 05 24 jz $+12 ;abs 0x1120 > 1116: fe 4f 00 00 mov.b @r15+, 0(r14) ; > 111a: 1e 53 inc r14 ; > 111c: 0e 9d cmp r13, r14 ; > 111e: fb 2b jnc $-8 ;abs 0x1116 > 1120: 3f 40 00 02 mov #512, r15 ;#0x0200 > 1124: 3d 40 02 02 mov #514, r13 ;#0x0202 > 1128: 0d 9f cmp r15, r13 ; > 112a: 05 24 jz $+12 ;abs 0x1136 > 112c: cf 43 00 00 mov.b #0, 0(r15) ;r3 As==00 > 1130: 1f 53 inc r15 ; > 1132: 0f 9d cmp r13, r15 ; > 1134: fb 2b jnc $-8 ;abs 0x112c > 1136: 30 40 40 11 br #0x1140 ; > > 0000113a <__ctors_end>: > 113a: 30 40 3e 11 br #0x113e ; > > 0000113e <_unexpected_>: > 113e: 00 13 reti > > 00001140 <main>: > 1140: 31 40 fe 09 mov #2558, r1 ;#0x09fe > 1144: 04 41 mov r1, r4 ; > 1146: 94 52 00 02 add &0x0200,0(r4) ;0x0200 > 114a: 00 00 > 114c: 82 43 00 02 mov #0, &0x0200 ;r3 As==00 > 1150: fa 3f jmp $-10 ;abs 0x1146 > 1152: 21 53 incd r1 ; > 1154: 30 40 72 11 br #0x1172 ; > > 00001158 <timerA1Int>: > 1158: 05 12 push r5 ; > 115a: 04 12 push r4 ; > 115c: 92 43 00 02 mov #1, &0x0200 ;r3 As==01 > 1160: 34 41 pop r4 ; > 1162: 35 41 pop r5 ; > 1164: 00 13 reti > > 00001166 <timerA0Int>: > 1166: 05 12 push r5 ; > 1168: 04 12 push r4 ; > 116a: a2 43 00 02 mov #2, &0x0200 ;r3 As==10 > 116e: 30 40 8a 11 br #0x118a ; > > 00001172 <__stop_progExec__>: > 1172: 02 df bis r15, r2 ; > 1174: fe 3f jmp $-2 ;abs 0x1172 > > 00001176 <__epilogue_restorer_intr>: > 1176: 34 41 pop r4 ; > 1178: 35 41 pop r5 ; > 117a: 36 41 pop r6 ; > 117c: 37 41 pop r7 ; > 117e: 38 41 pop r8 ; > 1180: 39 41 pop r9 ; > 1182: 3a 41 pop r10 ; > 1184: 3b 41 pop r11 ; > 1186: 3c 41 pop r12 ; > 1188: 3d 41 pop r13 ; > 118a: 3e 41 pop r14 ; > 118c: 3f 41 pop r15 ; > 118e: 00 13 reti > Disassembly of section .vectors: > > 0000ffe0 <InterruptVectors>: > ffe0: 3a 11 3a 11 3a 11 3a 11 3a 11 58 11 66 11 3a 11 > > :.:.:.:.:.X.f.:. > > fff0: 3a 11 3a 11 3a 11 3a 11 3a 11 3a 11 3a 11 00 11 > > :.:.:.:.:.:.:... > > The epilogue_restorer_intr function is called, but the same registers > are not pushed onto the start at the start of the interrupt. > > I guess that the logic in gcc/config/msp430/msp430.c line 879 is not > correct > > this is the code > /* Here, we've got a chance to jump to prologue saver */ > num_saved_regs = msp430_func_num_saved_regs (); > > if ((TARGET_SAVE_PROLOGUE || save_prologue_p) > && !interrupt_func_p && !arg_register_used[12] && > num_saved_regs > 4) > { > ... > > what it should be I don't quite know. The __epilogue_restorer_intr seems > to be optimised out in my example by using -O2 to compile also. > > Thanks,