Hi Folks, It seems mspgcc is generating bad code. Please see attached file.c and file.s
I compiled with the following command line: msp430-gcc -mmcu=msp430x149 -Wall -S file.c -o file.s In the assembler, there is no "cmp" after "mov", and msp user guide tells that "mov" opcode does not affect Z flag. Code generated by mspgcc: .L3: mov &menu_i, r15 rla r15 rla r15 add #menu_stack+2, r15 add #llo(12), @r15 mov @r15, r15 jne .L3 Code that I think is correct: .L3: mov &menu_i, r15 rla r15 rla r15 add #menu_stack+2, r15 add #llo(12), @r15 mov @r15, r15 cmp #0, r15 ; <- this is missing jne .L3 The C line related with this code is: while (* (int *) (++menu_stack[menu_i].item)); I already tried: while ((* (int *) (++menu_stack[menu_i].item)) != NULL); And it generated the same code. Could you help me to fix this? In many places in my complete program, when I want to see if a pointer is null or not, this error occours. Thanks, Pedro -- .''`. Pedro Zorzenon Neto <p...@autsens.com> : :' : Debian GNU/Linux | GNU/Hurd: <http://www.debian.org> `. `'` Debian BR: <http://debian-br.cipsga.org.br> `- Be Happy! Be FREE!
#include <sys/types.h> /* for uint16_t */ struct MenuItem { void (* display)(void); /* display routine */ struct MenuItem * inner; /* pointer to an inner menu (submenu) */ void (* enter)(void); /* function to execute if option is selected */ void (* incdec)(int); /* function to execute in case of inc/dec */ /* keys (parm -> 0 to dec and 1 to inc) */ void (* activate)(void); /* function to execute if activate is pressed */ uint16_t flag; /* flag to show/hide option -> */ /* if (~menu_flag & flag != 0) hide; */ }; /* Control structure for nested menus */ struct MenuControl { struct MenuItem * menu; /* menu */ struct MenuItem * item; /* saved item pointer */ }; struct MenuControl menu_stack [4]; /* first level index menu */ int menu_i = 0; /* goes to the previous menu item */ void menu_item_up(void) { if (menu_stack[menu_i].item == menu_stack[menu_i].menu) { /* if menu item is the first, find last menu */ while (* (int *) (++menu_stack[menu_i].item)); } menu_stack[menu_i].item--; }
.file "file.c" .arch msp430x149 /* Hardware multiplier registers: */ __MPY=0x130 __MPYS=0x132 __MAC=0x134 __MACS=0x136 __OP2=0x138 __RESLO=0x13a __RESHI=0x13c __SUMEXT=0x13e .global menu_i .data .p2align 1,0 .type menu_i,@object .size menu_i,2 menu_i: .short 0 .text .p2align 1,0 .global menu_item_up .type menu_item_up,@function /*********************** * Function `menu_item_up' ***********************/ menu_item_up: /* prologue: frame size = 0 */ .L__FrameSize_menu_item_up=0x0 .L__FrameOffset_menu_item_up=0x4 push r5 push r4 /* prologue end (size=2) */ mov &menu_i, r15 rla r15 rla r15 mov r15, r14 add #menu_stack+2, r14 mov &menu_i, r15 rla r15 rla r15 add #menu_stack, r15 cmp @r14, @r15 jne .L2 .L3: mov &menu_i, r15 rla r15 rla r15 add #menu_stack+2, r15 add #llo(12), @r15 mov @r15, r15 jne .L3 .L2: mov &menu_i, r15 rla r15 rla r15 add #menu_stack+2, r15 add #llo(-12), @r15 /* epilogue: frame size=0 */ pop r4 pop r5 ret /* epilogue end (size=3) */ /* function menu_item_up size 41 (36) */ .Lfe1: .size menu_item_up,.Lfe1-menu_item_up /********* End of function ******/ .comm menu_stack,16,2 /********************************************************************* * File file.c: code size: 41 words (0x29) * incl. words in prologues: 2, epilogues: 3 *********************************************************************/