blob: 8a1b61a9e14f85fe2d040e90c06971863535855f [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Interpreter entry point.
*/
#define ASSIST_DEBUGGER 1
.text
.align 2
.global dvmMterpStdRun
.ent dvmMterpStdRun
.frame sp, STACK_SIZE, ra
/*
* On entry:
* r0 Thread* self
*
* The return comes via a call to dvmMterpStdBail().
*/
dvmMterpStdRun:
.set noreorder
.cpload t9
.set reorder
/* Save to the stack. Frame size = STACK_SIZE */
STACK_STORE_FULL()
/* This directive will make sure all subsequent jal restore gp at a known offset */
.cprestore STACK_OFFSET_GP
addu fp, sp, STACK_SIZE # Move Frame Pointer to the base of frame
/* save stack pointer, add magic word for debuggerd */
sw sp, offThread_bailPtr(a0) # Save SP
/* set up "named" registers, figure out entry point */
move rSELF, a0 # set rSELF
LOAD_PC_FROM_SELF()
LOAD_FP_FROM_SELF()
lw rIBASE, offThread_curHandlerTable(rSELF)
#if defined(WITH_JIT)
.LentryInstr:
/* Entry is always a possible trace start */
lw a0, offThread_pJitProfTable(rSELF)
FETCH_INST() # load rINST from rPC
sw zero, offThread_inJitCodeCache(rSELF)
#if !defined(WITH_SELF_VERIFICATION)
bnez a0, common_updateProfile # profiling is enabled
#else
lw a2, offThread_shadowSpace(rSELF) # to find out the jit exit state
beqz a0, 1f # profiling is disabled
lw a3, offShadowSpace_jitExitState(a2) # jit exit state
li t0, kSVSTraceSelect
bne a3, t0, 2f
li a2, kJitTSelectRequestHot # ask for trace selection
b common_selectTrace # go build the trace
2:
li a4, kSVSNoProfile
beq a3, a4, 1f # don't profile the next instruction?
b common_updateProfile # collect profiles
#endif
1:
GET_INST_OPCODE(t0) # extract opcode from rINST
GOTO_OPCODE(t0) # jump to next instruction
#else
/* start executing the instruction at rPC */
FETCH_INST() # load rINST from rPC
GET_INST_OPCODE(t0) # extract opcode from rINST
GOTO_OPCODE(t0) # jump to next instruction
#endif
.Lbad_arg:
la a0, .LstrBadEntryPoint
#a1 holds value of entryPoint
JAL(printf)
JAL(dvmAbort)
.end dvmMterpStdRun
.global dvmMterpStdBail
.ent dvmMterpStdBail
/* Restore the stack pointer and all the registers stored at sp from the save
* point established on entry. Return to whoever called dvmMterpStdRun.
*
* On entry:
* a0 Thread* self
*/
dvmMterpStdBail:
lw sp, offThread_bailPtr(a0) # Restore sp
STACK_LOAD_FULL()
jr ra
.end dvmMterpStdBail