1200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* 2200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * Unconditional branch, 16-bit offset. 3200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * 4200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * The branch distance is a signed code-unit offset, which we need to 5200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * double to get a byte offset. 6200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung */ 7200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* goto/16 +AAAA */ 8200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung#if MTERP_PROFILE_BRANCHES 9200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung FETCH_S(rINST, 1) # rINST <- ssssAAAA (sign-extended) 10200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung EXPORT_PC() 11200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung move a0, rSELF 12200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung addu a1, rFP, OFF_FP_SHADOWFRAME 13200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung move a2, rINST 14200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung JAL(MterpProfileBranch) # (self, shadow_frame, offset) 15200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung bnez v0, MterpOnStackReplacement # Note: offset must be in rINST 16200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung addu a1, rINST, rINST # a1 <- byte offset, flags set 17200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung FETCH_ADVANCE_INST_RB(a1) # update rPC, load rINST 18200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung bgez a1, 1f 19200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung lw ra, THREAD_FLAGS_OFFSET(rSELF) 20200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung b MterpCheckSuspendAndContinue 21200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung1: 22200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GET_INST_OPCODE(t0) # extract opcode from rINST 23200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GOTO_OPCODE(t0) # jump to next instruction 24200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung#else 25200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung FETCH_S(rINST, 1) # rINST <- ssssAAAA (sign-extended) 26200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung addu a1, rINST, rINST # a1 <- byte offset, flags set 27200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung FETCH_ADVANCE_INST_RB(a1) # update rPC, load rINST 28200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung bgez a1, 1f 29200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung lw ra, THREAD_FLAGS_OFFSET(rSELF) 30200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung b MterpCheckSuspendAndContinue 31200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung1: 32200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GET_INST_OPCODE(t0) # extract opcode from rINST 33200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GOTO_OPCODE(t0) # jump to next instruction 34200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung#endif 35