1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%default { "func":"dvmInterpHandlePackedSwitch" } 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify executed 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Handle a packed-switch or sparse-switch instruction. In both cases 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * we decode it and hand it off to a helper function. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't really expect backward branches in a switch statement, but 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * they're perfectly legal, so we check for them here. 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for: packed-switch, sparse-switch 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* op vAA, +BBBB */ 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r0, 1) @ r0<- bbbb (lo) 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r1, 2) @ r1<- BBBB (hi) 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r3, rINST, lsr #8 @ r3<- AA 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_VREG(r1, r3) @ r1<- vAA 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl $func @ r0<- code-unit branch offset 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movs r9, r0, asl #1 @ r9<- branch byte offset, check sign 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bmi common_backwardBranch @ backward branch, do periodic checks 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_backwardBranch @ (want to use BLE but V is unknown) 23ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT) 24ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_JIT_PROF_TABLE(r0) 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 26ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r0,#0 27ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne common_updateProfile 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 30ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else 31ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng FETCH_ADVANCE_INST_RB(r9) @ update rPC, load rINST 32ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GET_INST_OPCODE(ip) @ extract opcode from rINST 33ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng GOTO_OPCODE(ip) @ jump to next instruction 34ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 36