73 lines
2.4 KiB
ArmAsm
73 lines
2.4 KiB
ArmAsm
/*
|
|
* Copyright (C) 2016 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.
|
|
*/
|
|
|
|
.text
|
|
.align 2
|
|
.global ExecuteMterpImpl
|
|
.ent ExecuteMterpImpl
|
|
.frame sp, STACK_SIZE, ra
|
|
/*
|
|
* On entry:
|
|
* a0 Thread* self
|
|
* a1 code_item
|
|
* a2 ShadowFrame
|
|
* a3 JValue* result_register
|
|
*
|
|
*/
|
|
|
|
ExecuteMterpImpl:
|
|
.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
|
|
|
|
/* Remember the return register */
|
|
sw a3, SHADOWFRAME_RESULT_REGISTER_OFFSET(a2)
|
|
|
|
/* Remember the code_item */
|
|
sw a1, SHADOWFRAME_CODE_ITEM_OFFSET(a2)
|
|
|
|
/* set up "named" registers */
|
|
move rSELF, a0
|
|
lw a0, SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(a2)
|
|
addu rFP, a2, SHADOWFRAME_VREGS_OFFSET # point to vregs.
|
|
EAS2(rREFS, rFP, a0) # point to reference array in shadow frame
|
|
lw a0, SHADOWFRAME_DEX_PC_OFFSET(a2) # Get starting dex_pc
|
|
addu rPC, a1, CODEITEM_INSNS_OFFSET # Point to base of insns[]
|
|
EAS1(rPC, rPC, a0) # Create direct pointer to 1st dex opcode
|
|
|
|
EXPORT_PC()
|
|
|
|
/* Starting ibase */
|
|
lw rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF)
|
|
|
|
/* Set up for backwards branches & osr profiling */
|
|
lw a0, OFF_FP_METHOD(rFP)
|
|
addu a1, rFP, OFF_FP_SHADOWFRAME
|
|
JAL(MterpSetUpHotnessCountdown) # (method, shadow_frame)
|
|
move rPROFILE, v0 # Starting hotness countdown to rPROFILE
|
|
|
|
/* 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
|
|
/* NOTE: no fallthrough */
|