target-mips: fix hflags modified in delay / forbidden slot
authorLeon Alrae <leon.alrae@imgtec.com>
Thu, 29 Jan 2015 16:15:00 +0000 (16:15 +0000)
committerLeon Alrae <leon.alrae@imgtec.com>
Wed, 18 Mar 2015 09:58:15 +0000 (09:58 +0000)
commita5f533909e746ca6e534b232fb42c9c6fd81b468
tree1062b77fd414f2ac75b6f3819127b8e2c28de404
parent62c688693bf2f0355fc5bad5dcc59c1cd2a51f1a
target-mips: fix hflags modified in delay / forbidden slot

All instructions which may change hflags terminate tb. However, this doesn't
work if such an instruction is placed in delay or forbidden slot.
gen_branch() clears MIPS_HFLAG_BMASK in ctx->hflags and then generates code
to overwrite hflags with ctx->hflags, consequently we loose any execution-time
hflags modifications. For example, in the following scenario hflag related to
Status.CU1 will not be updated:
    /* Set Status.CU1 in delay slot */
    mfc0  $24, $12, 0
    lui   $25, 0x2000
    or    $25, $25, $24
    b     check_Status_CU1
    mtc0  $25, $12, 0

With this change we clear MIPS_HFLAG_BMASK in execution-time hflags if
instruction in delay or forbidden slot wants to terminate tb for some reason
(i.e. ctx->bstate != BS_NONE).

Also, die early and loudly if "unknown branch" is encountered as this should
never happen.

Signed-off-by: Leon Alrae <leon.alrae@imgtec.com>
target-mips/translate.c