http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58092

--- Comment #2 from Rafał Miłecki <zajec5 at gmail dot com> ---
### Decompiled object ###

00000000 <test>:
   0:   24020002        li      v0,2
   4:   24030004        li      v1,4
   8:   aca20000        sw      v0,0(a1)
   c:   10830002        beq     a0,v1,18 <test+0x18>
  10:   24020008        li      v0,8
  14:   8ca20040        lw      v0,64(a1)
  18:   aca20040        sw      v0,64(a1)
  1c:   03e00008        jr      ra
  20:   00000000        nop



### Decompiled with my explanations ###

   0:   24020002        li      v0,2
   4:   24030004        li      v1,4
   8:   aca20000        sw      v0,0(a1)
v0 (0x2) is stored in a1 unconditionally - this is fine

   c:   10830002        beq     a0,v1,18 <test+0x18>
  10:   24020008        li      v0,8
a0 (rev argument) is compared with v1 (0x4) - if equal CPU jumps to 0x18

  14:   8ca20040        lw      v0,64(a1)
the above line is executed to rev != 4

  18:   aca20040        sw      v0,64(a1)
the above lins (store v0 in a1+64) is always executed!
it should be executed for rev==4 only
v0 is 0x8 by default, or some different value for rev != 4

  1c:   03e00008        jr      ra
  20:   00000000        nop

Reply via email to