• P
    arm: Thumb shift operations should not permit interworking branches · bedb8a6b
    Peter Maydell 提交于
    In Thumb mode, the only instructions which can cause an interworking
    branch by writing the PC are BLX, BX, BXJ, LDR, POP and LDM. Unlike
    ARM mode, data processing instructions which target the PC do not
    cause interworking branches.
    
    When we added support for doing interworking branches on writes to
    PC from data processing instructions in commit 21aeb343, we
    accidentally changed a Thumb instruction to have interworking
    branch behaviour for writes to PC. (MOV, MOVS register-shifted
    register, encoding T2; this is the standard encoding for
    LSL/LSR/ASR/ROR (register).)
    
    For this encoding, behaviour with Rd == R15 is specified as
    UNPREDICTABLE, so allowing an interworking branch is within
    spec, but it's confusing and differs from our handling of this
    class of UNPREDICTABLE for other Thumb ALU operations. Make
    it perform a simple (non-interworking) branch like the others.
    Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: NRichard Henderson <rth@twiddle.net>
    Reviewed-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
    Message-id: 1491844419-12485-3-git-send-email-peter.maydell@linaro.org
    bedb8a6b
translate.c 425.5 KB