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