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 * Interpreter entry point.
18 */
19
20    .text
21    .global SYMBOL(ExecuteMterpImpl)
22    FUNCTION_TYPE(ExecuteMterpImpl)
23
24/*
25 * On entry:
26 *  0  Thread* self
27 *  1  insns_
28 *  2  ShadowFrame
29 *  3  JValue* result_register
30 *
31 */
32
33SYMBOL(ExecuteMterpImpl):
34    .cfi_startproc
35    .cfi_def_cfa esp, 4
36
37    /* Spill callee save regs */
38    PUSH    %ebp
39    PUSH    %edi
40    PUSH    %esi
41    PUSH    %ebx
42
43    /* Allocate frame */
44    subl    $$FRAME_SIZE, %esp
45    .cfi_adjust_cfa_offset FRAME_SIZE
46
47    /* Load ShadowFrame pointer */
48    movl    IN_ARG2(%esp), %edx
49
50    /* Remember the return register */
51    movl    IN_ARG3(%esp), %eax
52    movl    %eax, SHADOWFRAME_RESULT_REGISTER_OFFSET(%edx)
53
54    /* Remember the code_item */
55    movl    IN_ARG1(%esp), %ecx
56    movl    %ecx, SHADOWFRAME_DEX_INSTRUCTIONS_OFFSET(%edx)
57
58    /* set up "named" registers */
59    movl    SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(%edx), %eax
60    leal    SHADOWFRAME_VREGS_OFFSET(%edx), rFP
61    leal    (rFP, %eax, 4), rREFS
62    movl    SHADOWFRAME_DEX_PC_OFFSET(%edx), %eax
63    lea     (%ecx, %eax, 2), rPC
64    CFI_DEFINE_DEX_PC_WITH_OFFSET(CFI_TMP, CFI_DEX, 0)
65    EXPORT_PC
66
67    /* Set up for backwards branches & osr profiling */
68    movl    OFF_FP_METHOD(rFP), %eax
69    movl    %eax, OUT_ARG0(%esp)
70    leal    OFF_FP_SHADOWFRAME(rFP), %ecx
71    movl    %ecx, OUT_ARG1(%esp)
72    movl    rSELF, %eax
73    movl    %eax, OUT_ARG2(%esp)
74    call    SYMBOL(MterpSetUpHotnessCountdown)
75
76    /* Starting ibase */
77    REFRESH_IBASE
78
79    /* start executing the instruction at rPC */
80    FETCH_INST
81    GOTO_NEXT
82    /* NOTE: no fallthrough */
83