blob: 0f0243825497572c57d3b87119737c87f019e365 [file] [log] [blame]
buzbee1452bee2015-03-06 14:43:04 -08001 /*
2 * Unconditional branch, 8-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 +AA */
8 /* tuning: use sbfx for 6t2+ targets */
9#if MTERP_SUSPEND
10 mov r0, rINST, lsl #16 @ r0<- AAxx0000
11 movs r1, r0, asr #24 @ r1<- ssssssAA (sign-extended)
12 add r2, r1, r1 @ r2<- byte offset, set flags
13 @ If backwards branch refresh rIBASE
14 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
15 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
16 GET_INST_OPCODE ip @ extract opcode from rINST
17 GOTO_OPCODE ip @ jump to next instruction
18#else
buzbee1452bee2015-03-06 14:43:04 -080019 mov r0, rINST, lsl #16 @ r0<- AAxx0000
buzbeea0a16102016-02-03 15:23:56 -080020 movs rINST, r0, asr #24 @ rINST<- ssssssAA (sign-extended)
21#if MTERP_PROFILE_BRANCHES
22 mov r0, rSELF
23 add r1, rFP, #OFF_FP_SHADOWFRAME
24 mov r2, rINST
25 bl MterpProfileBranch @ (self, shadow_frame, offset)
26 cmp r0, #0
27 bne MterpOnStackReplacement @ Note: offset must be in rINST
28#endif
29 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
30 add r2, rINST, rINST @ r2<- byte offset, set flags
buzbee1452bee2015-03-06 14:43:04 -080031 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
32 @ If backwards branch refresh rIBASE
33 bmi MterpCheckSuspendAndContinue
34 GET_INST_OPCODE ip @ extract opcode from rINST
35 GOTO_OPCODE ip @ jump to next instruction
36#endif