Hi everyone!

Compiling the following C code, that reproduces the problem encountered,
with no optimizations (-O0) produces bad output file:

typedef unsigned long u32;
u32 var;
int main()
{
    var = 12345678;
    var >>= 16;
    return var;
}

The listing file is as follows:

shift_noopt_orig.elf:     file format elf32-msp430

Disassembly of section .text:

00003100 <__low_level_init>:
    3100:    b2 40 80 5a     mov    #23168,    &0x0120    ;#0x5a80
    3104:    20 01

00003106 <__do_copy_data>:
    3106:    3f 40 00 00     mov    #0,    r15    ;#0x0000
    310a:    0f 93           cmp    #0,    r15    ;r3 As==00
    310c:    05 24           jz    $+12         ;abs 0x3118
    310e:    2f 83           decd    r15        ;
    3110:    9f 4f 5c 31     mov    12636(r15),4352(r15);
    3114:    00 11
    3116:    fb 23           jnz    $-8          ;abs 0x310e

00003118 <__do_clear_bss>:
    3118:    3f 40 04 00     mov    #4,    r15    ;#0x0004
    311c:    0f 93           cmp    #0,    r15    ;r3 As==00
    311e:    04 24           jz    $+10         ;abs 0x3128
    3120:    1f 83           dec    r15        ;
    3122:    cf 43 00 11     mov.b    #0,    4352(r15);r3 As==00
    3126:    fc 23           jnz    $-6          ;abs 0x3120

00003128 <__jump_to_main>:
    3128:    30 40 32 31     br    #0x3132        ;

0000312c <__ctors_end>:
    312c:    30 40 30 31     br    #0x3130        ;

00003130 <_unexpected_>:
    3130:    00 13           reti

00003132 <main>:
    3132:    31 40 00 31     mov    #12544,    r1    ;#0x3100
    3136:    04 41           mov    r1,    r4    ;
    3138:    b2 40 4e 61     mov    #24910,    &0x1100    ;#0x614e
    313c:    00 11
    313e:    b2 40 bc 00     mov    #188,    &0x1102    ;#0x00bc
    3142:    02 11
    3144:    82 43 02 11     mov    #0,    &0x1102    ;r3 As==00
    3148:    92 42 02 11     mov    &0x1102,&0x1100    ;0x1102
    314c:    00 11
    314e:    82 43 02 11     mov    #0,    &0x1102    ;r3 As==00
    3152:    1f 42 00 11     mov    &0x1100,r15    ;0x1100
    3156:    30 40 5a 31     br    #0x315a        ;

0000315a <__stop_progExec__>:
    315a:    ff 3f           jmp    $+0          ;abs 0x315a
Disassembly of section .bss:

00001100 <__bss_start>:
    1100:    00 00           beq
    ...

It seems that the instruction at address 3144h should not be present, only
the one at 314eh. The idea used is to move the HI word to the LO word and
then reset the HI word. The problem is that the HI part is reset before the
move take place and this way the result will always be 0.
It is important that this problem occurs only when compiling with no
optimizations.
Any suggestions on this matter are welcome.

Regards,
Alpar

Reply via email to