android_mt6572_jiabo/art/runtime/interpreter/mterp/mips/op_goto.S
2025-09-05 16:56:03 +08:00

38 lines
1.6 KiB
ArmAsm

/*
* Unconditional branch, 8-bit offset.
*
* The branch distance is a signed code-unit offset, which we need to
* double to get a byte offset.
*/
/* goto +AA */
#if MTERP_PROFILE_BRANCHES
sll a0, rINST, 16 # a0 <- AAxx0000
sra rINST, a0, 24 # rINST <- ssssssAA (sign-extended)
EXPORT_PC()
move a0, rSELF
addu a1, rFP, OFF_FP_SHADOWFRAME
move a2, rINST
JAL(MterpProfileBranch) # (self, shadow_frame, offset)
bnez v0, MterpOnStackReplacement # Note: offset must be in rINST
addu a2, rINST, rINST # a2 <- byte offset
FETCH_ADVANCE_INST_RB(a2) # update rPC, load rINST
/* If backwards branch refresh rIBASE */
bgez a2, 1f
lw ra, THREAD_FLAGS_OFFSET(rSELF)
b MterpCheckSuspendAndContinue
1:
GET_INST_OPCODE(t0) # extract opcode from rINST
GOTO_OPCODE(t0) # jump to next instruction
#else
sll a0, rINST, 16 # a0 <- AAxx0000
sra rINST, a0, 24 # rINST <- ssssssAA (sign-extended)
addu a2, rINST, rINST # a2 <- byte offset
FETCH_ADVANCE_INST_RB(a2) # update rPC, load rINST
/* If backwards branch refresh rIBASE */
bgez a1, 1f
lw ra, THREAD_FLAGS_OFFSET(rSELF)
b MterpCheckSuspendAndContinue
1:
GET_INST_OPCODE(t0) # extract opcode from rINST
GOTO_OPCODE(t0) # jump to next instruction
#endif