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,

Reply via email to