There is something _really_ odd.
The listing file you've generated is incomplete. For example,
    jmp &0x000
    bic rN, &0x000
is impossible.

Also, try to use something like gcc-3.2.3, not a pre-release.
~d

Tommy Andersson wrote:

> Hello maintainers,
>
> I am using msp430-gcc and friends, and I have found some possible
> bugs. My computer is setup according to:
>
> cat /etc/slackware-version
> Slackware 9.0.0
>
> uname -a
> Linux gaston 2.4.20 #2 Mon Mar 17 22:02:15 PST 2003 i686 unknown
>
> I have included some source-code in this message, which begins at
> "Listing 1", and also some assembly output which begins at
> "Listing 2". The following files have been downloaded and installed:
>
> msp430-gcc-3.2.2.20030214.tar.bz2
> msp430-libc-1.0.20030207.tar.bz2
>
> The commandline used to compile the program in listing 1 was:
>
> msp430-gcc -O -S -fpeephole -fpeephole2 -mmcu=msp430x147 bugsdemo.c -o
> bugsdemo.s
>
> The reason that I activated the flag -fpeephole2, was that I was not
> satisfied with the optimization when using the datatype long int. The
> flag made the optimizer remove a few redundant instructions, but also,
> as we will see, a few necessary instructions as well.
>
> Now to the details:
>
> 1. Sourcecode line 63 and line 74 generates an invalid opcode, "jne
>    &0x0000", as can be seen in lines 44 and 61 in the assembly
>    listing. The workaround was to rewrite the macros DISABLE_TX_INTR
>    and ENABLE_TX_INTR to generate function calls. This is not a very
>    efficient way of coding however.
>
> 2. Sourcecode line 137 generates an invalid opcode, "jl &0x001D", as
>    can be seen in line 151 in the assembly listing. The workaround was
>    to rewrite the macro DATA_DIR_OUT to generate a function call. The
>    phenomenom seems to be related the one above.
>
> 3. Lines 237 to 244 have an #if/#else/#endif macro. If the first case
>    is compiled, the value of grid[0] will not be correct when the call
>    to pr_txchar( grid[0] ) in line 239 is made. A "mov @r11, r15"
>    between lines 266 and 267 would save the day. The second case of
>    the macro always compile correctly. During the writing of this
>    message I found that the problem disappeared when I omitted the
>    flag -fpeephole2 on the commandline. The commndline now was:
>    msp430-gcc -O -S -fpeephole -mmcu=msp430x147 bugsdemo.c -o bugsdemo.s
>
> I do not know if -O automatically sets -fpeephole, is there any way of
> checking this ?
>
> NOTE that the line-numbers above refers to line-numbers in the source,
> not to line-numbers in this text.
>
> The code in the example below is copied from different files in
> production code.
>
> With Best Regards, Tommy Andersson
>
> tommy.anders...@geodynamik.com
>
> --- Listing 1 begins here ---------------------------------------
> #include <io.h>
> #include <signal.h>
>
> #define ENABLE_TX_INTR  SFR_CMD(bis.b,IE1,UTXIE0)
> #define DISABLE_TX_INTR SFR_CMD(bic.b,IE1,UTXIE0)
>
> #define U0_BUFSIZE      10
> #define PRC_PRINTER     2
>
> // Push flags and disable interrupts
> inline static void pushf_disable( void )
> {
>   asm volatile ( "push r2 \n\t" : : );
>   dint();
>   asm volatile ( "nop     \n\t" : : );  // dint() is delayed 1 clock !
> }
>
> // Pop the flags, possibly enabling interrupts
> inline static void popf( void )
> {
>   asm volatile ( "pop r2 \n\t" : : );
> }
>
> typedef unsigned char BYTE;
>
> /*** Global control variables: ***/
> extern volatile unsigned char           curr_pid;
>
> /*----------------------------------------------------------------------
>                         Local variables
> ----------------------------------------------------------------------*/
> static volatile BYTE    tx0_buffer[U0_BUFSIZE];
> static volatile BYTE    *tx0_head = tx0_buffer;
> static volatile BYTE    *tx0_tail = tx0_buffer;
>
> static volatile BYTE    tx0_stop;
> static volatile BYTE    tx0_pending;
>
> static volatile BYTE    suspended, wait_data_flag;
>
> /*----------------------------------------------------------------------
> Transmit a character through the serial interface. Returns -1 on a
> failure, otherwise 0 is returned.
> ----------------------------------------------------------------------*/
> int pr_txchar( char ch )
> {
> BYTE            *ptr;
>
>  retry:
>   DISABLE_TX_INTR;
>
>   if ( !tx0_pending ) { // NO pending transmissions
>     U0TXBUF = ch;
>     tx0_pending = 1;
>   }
>   else {
>     ptr = tx0_head;
>     if (++ptr >= tx0_buffer+U0_BUFSIZE)
>       ptr = tx0_buffer;
>     if (ptr == tx0_tail) { // Buffer is FULL !
>       ENABLE_TX_INTR;
>
>       if ( curr_pid == PRC_PRINTER ) {
>         pushf_disable();
>         suspended = 1;  // This flag MUST BE SET before suspending the proc !
>         proc_suspend( PRC_PRINTER ); // Suspend printer process
>         popf();
>         goto retry;
>       }
>       else
>         return -1;      // Otherwise, return error.
>     }
>     *tx0_head = ch;     // Save next printer character.
>     tx0_head = ptr;
>   }
>   ENABLE_TX_INTR;
>   return 0;
> }
>
> #define CLOCK_LOW               SFR_CMD( bic, P4OUT, 1<<0 )
> #define CLOCK_HIGH              SFR_CMD( bis, P4OUT, 1<<0 )
> #define DATA_LOW                SFR_CMD( bic, P4OUT, 1<<1 )
> #define DATA_HIGH               SFR_CMD( bis, P4OUT, 1<<1 )
> #define DATA_DIR_IN             SFR_CMD( bic, P4DIR, 1<<1 )
> #define DATA_DIR_OUT            SFR_CMD( bis, P4DIR, 1<<1 )
> #define DATA_IN                 (P4IN&(1<<1))
>
> /*----------------------------------------------------------------------
> Read one byte of data from the RTC.
>
> The argument 'bytecount' shall be assigned the number of to be read at
> this 'session', and is used to control the acknowledge bit.
> ----------------------------------------------------------------------*/
> static unsigned char rtc_read( signed char bytecount )
> {
>   unsigned char         bitcount, data_read;
>   static signed char    count;
>
>   if (bytecount)
>     count = bytecount-1;
>   else
>     --count;
>
>   DATA_DIR_IN;          // DATA goes high (hi-z)
>   for (bitcount = 0; bitcount < 8; bitcount++ ) {
>     CLOCK_HIGH;
>     delay_us( 4 );
>
>     data_read <<= 1;
>     if ( DATA_IN )
>       data_read |= (1<<0);
>     else
>       data_read &= ~(1<<0);
>
>     CLOCK_LOW;
>     delay_us( 4 );
>   }
>   DATA_LOW;
>
>   if ( count > 0 )
>     DATA_DIR_OUT;       // DATA goes low -> Acknowledge */
>
>   delay_us( 2 );
>   CLOCK_HIGH;
>   delay_us( 4 );
>   CLOCK_LOW;
>   delay_us( 2 );
>   DATA_DIR_IN;
>
>   return data_read;
> }
>
> #define LF                      10
> #define FF                      12
> #define CR                      13
> #define ESC                     27
>
> #define WIDTH_CHAR              12
> #define WIDTH_PRINTROW          400
> #define MAXWIDTH_PRINTROW
> (WIDTH_PRINTROW>WIDTH_LOGO?WIDTH_PRINTROW:WIDTH_LOGO)
> #define LOGO_HORZ_TAB           ((480-300)/2)
> #define HDR_HORZ_TAB            49
> #define DATA_HORZ_TAB           49
> #define FOOT_HORZ_TAB           49
> #define HEIGHT_TEXTLINE         12
> #define HEIGHT_PRINTROW         8
> #define HEIGHT_FOOTER           (12*HEIGHT_TEXTLINE)
> #define HEIGHT_A4               ((int)(VERT_DPI*297/25.4))
> #define HORZ_GRIDLINE_SPACE     30
> #define COARSE_VERT_GRIDLINE_SPACE      67
> #define FINE_VERT_GRIDLINE_SPACE        100
> #define CURVE_WIDTH             3
>
> #define PC_BEGIN_LOGO           {pr_txchar(ESC);pr_txchar('L');\
>                                 pr_txchar((WIDTH_LOGO+LOGO_HORZ_TAB)&0xff);\
>                                 pr_txchar((WIDTH_LOGO+LOGO_HORZ_TAB)>>8);}
> #define PC_BEGIN_HDRTAB         {pr_txchar(ESC);pr_txchar('L');\
>                                 pr_txchar(LOGO_HORZ_TAB&0xff);\
>                                 pr_txchar(LOGO_HORZ_TAB>>8);}
> #define PC_BEGIN_GRAPHIC        {pr_txchar(ESC);pr_txchar('L');\
>                                 pr_txchar((WIDTH_PRINTROW)&0xff);\
>                                 pr_txchar((WIDTH_PRINTROW)>>8);}
> #define PC_BEGIN_GRA_RMV        {pr_txchar(ESC);pr_txchar('L');\
>                                 pr_txchar((WIDTH_PRINTROW+5)&0xff);\
>                                 pr_txchar((WIDTH_PRINTROW+5)>>8);}
> #define PC_SET_LINESPACING(x)   {pr_txchar(ESC);pr_txchar('A');pr_txchar(x);}
> #define PC_SET_GRLINESPACING    {pr_txchar(ESC);pr_txchar('A');pr_txchar(8);}
> #define PC_SET_TXTLINESPACING   {pr_txchar(ESC);pr_txchar('A');pr_txchar(12);}
> #define PC_SELECT_CHARSET(x)    {pr_txchar(ESC);pr_txchar('R');pr_txchar(x);\
>                                 pr_txchar(ESC);pr_txchar('t');pr_txchar(x);}
> #define PC_CRLF                 {pr_txchar(CR);pr_txchar(LF);}
> #define PC_PIXELTAB(x)          {int q;pr_txchar(ESC);pr_txchar('L');\
>                                 pr_txchar((x)&0xff);pr_txchar((x)>>8);\
>                                 for(q=(x);q;q--)pr_txchar(0);}
> #define PC_FEED                 pr_txchar(FF)
> #define PC_SET_CONDENSED        pr_txchar(0x0f)
> #define PC_SET_NORMAL           pr_txchar(0x12)
>
> static int              timeaxis;
>
> unsigned char *make_grid_and_frame( int horz_pos, int vert_pos );
> unsigned char create_data_curve( int pos );
>
> int print_data( void )
> {
>   int           printbyte;
>   unsigned char vline8, *grid;
>
>   PC_SET_GRLINESPACING;
>   // Left margin
>   grid = make_grid_and_frame( 0, timeaxis );
>   if (grid[1] != 128) {
> #if (DATA_HORZ_TAB - 4*WIDTH_CHAR -1) < 0
> #error "***** Not enough space for numeric scale at left edge *****"
> #else
> #if (DATA_HORZ_TAB - 4*WIDTH_CHAR -1) > 0
>     PC_PIXELTAB(DATA_HORZ_TAB - 4*WIDTH_CHAR -1);
> #endif
> #endif
>
>     pr_txnum_i( (timeaxis+7-grid[1])/3, 3 ); pr_txchar( 's' );
>     PC_PIXELTAB(1);
>   }
>   else
>     PC_PIXELTAB(DATA_HORZ_TAB);
>
>   // Data
>   PC_BEGIN_GRA_RMV;
>
>   for (printbyte = 0; printbyte<WIDTH_PRINTROW; printbyte++ ) {
>     grid = make_grid_and_frame( printbyte, timeaxis );
> #ifndef COMPILER_BUG    // This does not work due to a compiler bug
>     grid[0] |= create_data_curve( printbyte );
>     pr_txchar( grid[0] );
> #else
>     vline8 = grid[0];
>     vline8 |= create_data_curve( printbyte );
>     pr_txchar( vline8 );
> #endif
>   }
>   pr_txchar( 0 );
>   pr_txchar( 0 );
>   vline8 = create_rmv8( printbyte );
>   pr_txchar( vline8 );
>   pr_txchar( vline8 );
>   pr_txchar( vline8 );
>   PC_CRLF;
>
>   timeaxis += 8;
>   return HEIGHT_PRINTROW;
> }
>
> --- Listing 2 begins here ---------------------------------------
>         .file   "bugsdemo.c"
>         .arch msp430x147
>
> /* Hardware multiplier registers: */
> __MPY=0x130
> __MPYS=0x132
> __MAC=0x134
> __MACS=0x136
> __OP2=0x138
> __RESLO=0x13a
> __RESHI=0x13c
> __SUMEXT=0x13e
>
>         .data
>         .p2align 1,0
>         .type   tx0_head,@object
>         .size   tx0_head,2
> tx0_head:
>         .short  tx0_buffer
>         .p2align 1,0
>         .type   tx0_tail,@object
>         .size   tx0_tail,2
> tx0_tail:
>         .short  tx0_buffer
>         .text
>         .p2align 1,0
> .global pr_txchar
>         .type   pr_txchar,@function
> /***********************
>  * Function `pr_txchar'
>  ***********************/
> pr_txchar:
> /* prologue: frame size = 0 */
> .L__FrameSize_pr_txchar=0x0
> .L__FrameOffset_pr_txchar=0x2
>         push    r11
> /* prologue end (size=1) */
>         mov.b   r15, r11
> .L2:
> /* #APP */
>         bic.b   #llo(-128), &0x0000
> /* #NOAPP */
>         cmp.b   #llo(0), &tx0_pending
>         jne     &0x0000
>         mov.b   r11, &0x0077
>         mov.b   #llo(1), &tx0_pending
>         jmp     .L4
> .L3:
>         mov     &tx0_head, r14
>         add     #llo(1), r14
>         cmp     #tx0_buffer+10, r14
>         jlo     .L5
>         mov     #tx0_buffer, r14
> .L5:
>         cmp     &tx0_tail, r14
>         jne     .L6
> /* #APP */
>         bis.b   #llo(-128), &0x0000
> /* #NOAPP */
>         cmp.b   #llo(2), &curr_pid
>         jne     &0x0000
> /* #APP */
>         push r2
>
>         dint
>         nop
>
> /* #NOAPP */
>         mov.b   #llo(1), &suspended
>         mov     #llo(2), r15
>         call    #proc_suspend
> /* #APP */
>         pop r2
>
> /* #NOAPP */
>         jmp     .L2
> .L7:
>         mov     #llo(-1), r15
>         jmp     .L1
> .L6:
>         mov     &tx0_head, r15
>         mov.b   r11, @r15
>         mov     r14, &tx0_head
> .L4:
> /* #APP */
>         bis.b   #llo(-128), &0x0000
> /* #NOAPP */
>         mov     #llo(0), r15
> .L1:
> /* epilogue: frame size=0 */
>         pop     r11
>         ret
> /* epilogue end (size=2) */
> /* function pr_txchar size 64 (61) */
> .Lfe1:
>         .size   pr_txchar,.Lfe1-pr_txchar
> /********* End of function ******/
>
>         .local count.0
>         .comm count.0,1
>         .p2align 1,0
>         .type   rtc_read,@function
> /***********************
>  * Function `rtc_read'
>  ***********************/
> rtc_read:
> /* prologue: frame size = 0 */
> .L__FrameSize_rtc_read=0x0
> .L__FrameOffset_rtc_read=0x4
>         push    r11
>         push    r10
> /* prologue end (size=2) */
>         cmp.b   #llo(0), r15
>         jeq     .L12
>         add.b   #llo(-1), r15
>         mov.b   r15, &count.0
>         jmp     .L13
> .L12:
>         add.b   #llo(-1), &count.0
> .L13:
> /* #APP */
>         bic     #llo(2), &0x001E
> /* #NOAPP */
>         mov.b   #llo(0), r10
> .L20:
> /* #APP */
>         bis     #llo(1), &0x001D
> /* #NOAPP */
>         mov     #llo(4), r15
>         call    #delay_us
>         rla.b   r11
>         bit.b   #llo(2),&0x001C
>         jeq     .L18
>         bis.b   #llo(1), r11
>         jmp     .L19
> .L18:
>         bic.b   #llo(1),r11
> .L19:
> /* #APP */
>         bic     #llo(1), &0x001D
> /* #NOAPP */
>         mov     #llo(4), r15
>         call    #delay_us
>         add.b   #llo(1), r10
>         cmp.b   #llo(8), r10
>         jlo     .L20
> /* #APP */
>         bic     #llo(2), &0x001D
> /* #NOAPP */
>         cmp.b   #llo(1), &count.0
>         jl      &0x001D ;       &0x001D
> /* #APP */
>         bis     #llo(2), &0x001E
> /* #NOAPP */
> .L21:
>         mov     #llo(2), r15
>         call    #delay_us
> /* #APP */
>         bis     #llo(1), &0x001D
> /* #NOAPP */
>         mov     #llo(4), r15
>         call    #delay_us
> /* #APP */
>         bic     #llo(1), &0x001D
> /* #NOAPP */
>         mov     #llo(2), r15
>         call    #delay_us
> /* #APP */
>         bic     #llo(2), &0x001E
> /* #NOAPP */
>         mov.b   r11, r15
> /* epilogue: frame size=0 */
>         pop     r10
>         pop     r11
>         ret
> /* epilogue end (size=3) */
> /* function rtc_read size 61 (56) */
> .Lfe2:
>         .size   rtc_read,.Lfe2-rtc_read
> /********* End of function ******/
>
>         .p2align 1,0
> .global print_data
>         .type   print_data,@function
> /***********************
>  * Function `print_data'
>  ***********************/
> print_data:
> /* prologue: frame size = 0 */
> .L__FrameSize_print_data=0x0
> .L__FrameOffset_print_data=0x4
>         push    r11
>         push    r10
> /* prologue end (size=2) */
>         mov.b   #llo(27), r15
>         call    #pr_txchar
>         mov.b   #llo(65), r15
>         call    #pr_txchar
>         mov.b   #llo(8), r15
>         call    #pr_txchar
>         mov     &timeaxis, r14
>         mov     #llo(0), r15
>         call    #make_grid_and_frame
>         cmp.b   #llo(-128), 1(r15)
>         jeq     .L25
>         mov.b   1(r15), r15
>         mov     &timeaxis, r14
>         sub     r15, r14
>         mov     r14, r15
>         add     #llo(7), r15
>         mov     r15, r12
>         mov     #llo(3), r10
>         call    #__divmodhi4
>         mov     r12, r15
>         mov     #llo(3), r14
>         call    #pr_txnum_i
>         mov.b   #llo(115), r15
>         call    #pr_txchar
>         mov.b   #llo(27), r15
>         call    #pr_txchar
>         mov.b   #llo(76), r15
>         call    #pr_txchar
>         mov.b   #llo(1), r15
>         call    #pr_txchar
>         mov.b   #llo(0), r15
>         call    #pr_txchar
>         mov     #llo(1), r11
> .L30:
>         mov.b   #llo(0), r15
>         call    #pr_txchar
>         add     #llo(-1), r11
>         jeq     .L31
>         jmp     .L30
> .L25:
>         mov.b   #llo(27), r15
>         call    #pr_txchar
>         mov.b   #llo(76), r15
>         call    #pr_txchar
>         mov.b   #llo(49), r15
>         call    #pr_txchar
>         mov.b   #llo(0), r15
>         call    #pr_txchar
>         mov     #llo(49), r11
> .L36:
>         mov.b   #llo(0), r15
>         call    #pr_txchar
>         add     #llo(-1), r11
>         jne     .L36
> .L31:
>         mov.b   #llo(27), r15
>         call    #pr_txchar
>         mov.b   #llo(76), r15
>         call    #pr_txchar
>         mov.b   #llo(-107), r15
>         call    #pr_txchar
>         mov.b   #llo(1), r15
>         call    #pr_txchar
>         mov     #llo(0), r10
> .L41:
>         mov     &timeaxis, r14
>         mov     r10, r15
>         call    #make_grid_and_frame
>         mov     r15, r11
>         mov     r10, r15
>         call    #create_data_curve
>         bis.b   r15, @r11
>         call    #pr_txchar
>         add     #llo(1), r10
>         cmp     #llo(400), r10
>         jl      .L41    ;       .L41
>         mov.b   #llo(0), r15
>         call    #pr_txchar
>         mov.b   #llo(0), r15
>         call    #pr_txchar
>         mov     r10, r15
>         call    #create_rmv8
>         mov     r15, r11
>         call    #pr_txchar
>         mov.b   r11, r15
>         call    #pr_txchar
>         mov.b   r11, r15
>         call    #pr_txchar
>         mov.b   #llo(13), r15
>         call    #pr_txchar
>         mov.b   #llo(10), r15
>         call    #pr_txchar
>         add     #llo(8), &timeaxis
>         mov     #llo(8), r15
> /* epilogue: frame size=0 */
>         pop     r10
>         pop     r11
>         ret
> /* epilogue end (size=3) */
> /* function print_data size 153 (148) */
> .Lfe3:
>         .size   print_data,.Lfe3-print_data
> /********* End of function ******/
>
>         .local tx0_buffer
>         .comm tx0_buffer,10,2
>         .local tx0_stop
>         .comm tx0_stop,1
>         .local tx0_pending
>         .comm tx0_pending,1
>         .local suspended
>         .comm suspended,1
>         .local wait_data_flag
>         .comm wait_data_flag,1
>         .local timeaxis
>         .comm timeaxis,2,2
>
> /*********************************************************************
>  * File bugsdemo.c: code size: 278 words (0x116)
>  * incl. words in prologues: 5, epilogues: 8
>  *********************************************************************/
>
> --- End Of File  ---------------------------------------
>
> -------------------------------------------------------
> This SF.Net email is sponsored by: YOU BE THE JUDGE. Be one of 170
> Project Admins to receive an Apple iPod Mini FREE for your judgement on
> who ports your project to Linux PPC the best. Sponsored by IBM.
> Deadline: Sept. 24. Go here: http://sf.net/ppc_contest.php
> _______________________________________________
> Mspgcc-users mailing list
> Mspgcc-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users


Reply via email to