op_goto_16.S revision 00b53b7f3f9ce5996b767b52c28dd846f47a723c
1    /*
2     * Unconditional branch, 16-bit offset.
3     *
4     * The branch distance is a signed code-unit offset, which we need to
5     * double to get a byte offset.
6     */
7    /* goto/16 +AAAA */
8    lh      a0, 2(rPC)                  # a0 <- sign-extended AAAA
9    dlsa    rPC, a0, rPC, 1             # rPC <- rPC + AAAA * 2
10    FETCH_INST                          # load rINST
11
12#if MTERP_SUSPEND
13    bgez    a0, 1f                      # AA * 2 >= 0 => no suspend check
14    REFRESH_IBASE
151:
16#else
17    lw      ra, THREAD_FLAGS_OFFSET(rSELF)  # Preload flags for MterpCheckSuspendAndContinue
18    bltz    a0, MterpCheckSuspendAndContinue
19#endif
20
21    GET_INST_OPCODE v0                  # extract opcode from rINST
22    GOTO_OPCODE v0                      # jump to next instruction
23