1200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung/* 2200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * Copyright (C) 2016 The Android Open Source Project 3200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * 4200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * Licensed under the Apache License, Version 2.0 (the "License"); 5200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * you may not use this file except in compliance with the License. 6200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * You may obtain a copy of the License at 7200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * 8200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * http://www.apache.org/licenses/LICENSE-2.0 9200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * 10200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * Unless required by applicable law or agreed to in writing, software 11200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * distributed under the License is distributed on an "AS IS" BASIS, 12200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * See the License for the specific language governing permissions and 14200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * limitations under the License. 15200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung */ 16200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung/* 17200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * Interpreter entry point. 18200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung */ 19200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung 20200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung .text 21200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung .align 2 22200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung .global ExecuteMterpImpl 23200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung .ent ExecuteMterpImpl 24200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung .frame sp, STACK_SIZE, ra 25200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung/* 26200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * On entry: 27200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * a0 Thread* self 28200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * a1 code_item 29200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * a2 ShadowFrame 30200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * a3 JValue* result_register 31200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung * 32200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung */ 33200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung 34200f040af3e4fe9e178cb63c90860d58d90ef665Douglas LeungExecuteMterpImpl: 35200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung .set noreorder 36200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung .cpload t9 37200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung .set reorder 38200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung/* Save to the stack. Frame size = STACK_SIZE */ 39200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung STACK_STORE_FULL() 40200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung/* This directive will make sure all subsequent jal restore gp at a known offset */ 41200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung .cprestore STACK_OFFSET_GP 42200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung 43200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* Remember the return register */ 44200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung sw a3, SHADOWFRAME_RESULT_REGISTER_OFFSET(a2) 45200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung 46200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* Remember the code_item */ 47200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung sw a1, SHADOWFRAME_CODE_ITEM_OFFSET(a2) 48200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung 49200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* set up "named" registers */ 50200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung move rSELF, a0 51200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung lw a0, SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(a2) 52ace690f5e440930d7bbad97fdbfdc3eb65e230bebuzbee addu rFP, a2, SHADOWFRAME_VREGS_OFFSET # point to vregs. 53200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung EAS2(rREFS, rFP, a0) # point to reference array in shadow frame 54200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung lw a0, SHADOWFRAME_DEX_PC_OFFSET(a2) # Get starting dex_pc 55200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung addu rPC, a1, CODEITEM_INSNS_OFFSET # Point to base of insns[] 56200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung EAS1(rPC, rPC, a0) # Create direct pointer to 1st dex opcode 57200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung 58200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung EXPORT_PC() 59200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung 60200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* Starting ibase */ 61200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung lw rIBASE, THREAD_CURRENT_IBASE_OFFSET(rSELF) 62200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung 63200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* start executing the instruction at rPC */ 64200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung FETCH_INST() # load rINST from rPC 65200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GET_INST_OPCODE(t0) # extract opcode from rINST 66200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung GOTO_OPCODE(t0) # jump to next instruction 67200f040af3e4fe9e178cb63c90860d58d90ef665Douglas Leung /* NOTE: no fallthrough */ 68