1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/*
18 * Interpreter entry point.
19 */
20
21    .set    reorder
22
23    .text
24    .global ExecuteMterpImpl
25    .type   ExecuteMterpImpl, %function
26    .balign 16
27/*
28 * On entry:
29 *  a0  Thread* self
30 *  a1  dex_instructions
31 *  a2  ShadowFrame
32 *  a3  JValue* result_register
33 *
34 */
35ExecuteMterpImpl:
36    .cfi_startproc
37    .cpsetup t9, t8, ExecuteMterpImpl
38
39    .cfi_def_cfa sp, 0
40    daddu   sp, sp, -STACK_SIZE
41    .cfi_adjust_cfa_offset STACK_SIZE
42
43    sd      t8, STACK_OFFSET_GP(sp)
44    .cfi_rel_offset 28, STACK_OFFSET_GP
45    sd      ra, STACK_OFFSET_RA(sp)
46    .cfi_rel_offset 31, STACK_OFFSET_RA
47
48    sd      s0, STACK_OFFSET_S0(sp)
49    .cfi_rel_offset 16, STACK_OFFSET_S0
50    sd      s1, STACK_OFFSET_S1(sp)
51    .cfi_rel_offset 17, STACK_OFFSET_S1
52    sd      s2, STACK_OFFSET_S2(sp)
53    .cfi_rel_offset 18, STACK_OFFSET_S2
54    sd      s3, STACK_OFFSET_S3(sp)
55    .cfi_rel_offset 19, STACK_OFFSET_S3
56    sd      s4, STACK_OFFSET_S4(sp)
57    .cfi_rel_offset 20, STACK_OFFSET_S4
58    sd      s5, STACK_OFFSET_S5(sp)
59    .cfi_rel_offset 21, STACK_OFFSET_S5
60    sd      s6, STACK_OFFSET_S6(sp)
61    .cfi_rel_offset 22, STACK_OFFSET_S6
62
63    /* Remember the return register */
64    sd      a3, SHADOWFRAME_RESULT_REGISTER_OFFSET(a2)
65
66    /* Remember the dex instruction pointer */
67    sd      a1, SHADOWFRAME_DEX_INSTRUCTIONS_OFFSET(a2)
68
69    /* set up "named" registers */
70    move    rSELF, a0
71    daddu   rFP, a2, SHADOWFRAME_VREGS_OFFSET
72    lw      v0, SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(a2)
73    dlsa    rREFS, v0, rFP, 2
74    lw      v0, SHADOWFRAME_DEX_PC_OFFSET(a2)
75    dlsa    rPC, v0, a1, 1
76    CFI_DEFINE_DEX_PC_WITH_OFFSET(CFI_TMP, CFI_DEX, 0)
77    EXPORT_PC
78
79    /* Starting ibase */
80    REFRESH_IBASE
81
82    /* Set up for backwards branches & osr profiling */
83    ld      a0, OFF_FP_METHOD(rFP)
84    daddu   a1, rFP, OFF_FP_SHADOWFRAME
85    move    a2, rSELF
86    jal     MterpSetUpHotnessCountdown
87    move    rPROFILE, v0                # Starting hotness countdown to rPROFILE
88
89    /* start executing the instruction at rPC */
90    FETCH_INST
91    GET_INST_OPCODE v0
92    GOTO_OPCODE v0
93
94    /* NOTE: no fallthrough */
95