1200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* 2200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * Unconditional branch, 8-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 +AA */ 8200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung#if MTERP_PROFILE_BRANCHES 9200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung sll a0, rINST, 16 # a0 <- AAxx0000 10200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung sra rINST, a0, 24 # rINST <- ssssssAA (sign-extended) 11200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung EXPORT_PC() 12200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung move a0, rSELF 13200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung addu a1, rFP, OFF_FP_SHADOWFRAME 14200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung move a2, rINST 15200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung JAL(MterpProfileBranch) # (self, shadow_frame, offset) 16200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung bnez v0, MterpOnStackReplacement # Note: offset must be in rINST 17200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung addu a2, rINST, rINST # a2 <- byte offset 18200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung FETCH_ADVANCE_INST_RB(a2) # update rPC, load rINST 19200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* If backwards branch refresh rIBASE */ 20200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung bgez a2, 1f 21200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung lw ra, THREAD_FLAGS_OFFSET(rSELF) 22200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung b MterpCheckSuspendAndContinue 23200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung1: 24200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GET_INST_OPCODE(t0) # extract opcode from rINST 25200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GOTO_OPCODE(t0) # jump to next instruction 26200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung#else 27200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung sll a0, rINST, 16 # a0 <- AAxx0000 28200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung sra rINST, a0, 24 # rINST <- ssssssAA (sign-extended) 29200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung addu a2, rINST, rINST # a2 <- byte offset 30200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung FETCH_ADVANCE_INST_RB(a2) # update rPC, load rINST 31200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* If backwards branch refresh rIBASE */ 32200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung bgez a1, 1f 33200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung lw ra, THREAD_FLAGS_OFFSET(rSELF) 34200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung b MterpCheckSuspendAndContinue 35200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung1: 36200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GET_INST_OPCODE(t0) # extract opcode from rINST 37200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GOTO_OPCODE(t0) # jump to next instruction 38200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung#endif 39