1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdRun
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdRun, %function
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
229f601a917c8878204482c37aec7005054b6776fabuzbee * bool dvmMterpStdRun(Thread* self)
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point.  Returns changeInterp.
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun:
28f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    push    %ebp                 # save caller base pointer
29f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    %esp, %ebp           # set our %ebp
309a3147c7412f4794434b4c2604aa2ba784867774buzbee    movl    rSELF, %ecx          # get incoming rSELF
31f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee/*
324570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin * At this point we've allocated one slot on the stack
33f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee * via push and stack is 8-byte aligned.  Allocate space
344570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin * for 9 spill slots, 4 local slots, 5 arg slots to bring
354570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin * us to 16-byte alignment
36f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee */
374570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin    subl    $$(FRAME_SIZE-4), %esp
38f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee
39f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee/* Spill callee save regs */
40f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    %edi,EDI_SPILL(%ebp)
41f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    %esi,ESI_SPILL(%ebp)
42f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    %ebx,EBX_SPILL(%ebp)
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Set up "named" registers */
459f601a917c8878204482c37aec7005054b6776fabuzbee    movl    offThread_pc(%ecx),rPC
4630bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    movl    offThread_curFrame(%ecx),rFP
47a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    movl    offThread_curHandlerTable(%ecx),rIBASE
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
490c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    /* Remember %esp for future "longjmp" */
509f601a917c8878204482c37aec7005054b6776fabuzbee    movl    %esp,offThread_bailPtr(%ecx)
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
520c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    /* Fetch next instruction before potential jump */
53f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    FETCH_INST
540c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#if defined(WITH_JIT)
550c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    GET_JIT_PROF_TABLE %ecx %eax
560c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    movl        $$0, offThread_inJitCodeCache(%ecx)
570c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    cmpl        $$0, %eax
580c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    jne         common_updateProfile # set up %ebx & %edx & rPC
590c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#endif
600c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen
610c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen   /* Normal case: start executing the instruction at rPC */
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdBail
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdBail, %function
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
679f601a917c8878204482c37aec7005054b6776fabuzbee * void dvmMterpStdBail(Thread* self, bool changeInterp)
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We're not going to build a standard frame here, so the arg accesses will
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * look a little strange.
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
779f601a917c8878204482c37aec7005054b6776fabuzbee *  esp+4 (arg0)  Thread* self
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  esp+8 (arg1)  bool changeInterp
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail:
819f601a917c8878204482c37aec7005054b6776fabuzbee    movl    4(%esp),%ecx                 # grab self
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    8(%esp),%eax                 # changeInterp to return reg
830c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    movl    offThread_bailPtr(%ecx),%esp # Restore "setjmp" esp
84c11e0e14df2c0c4264e5cc6c3e96d14832cbecadbuzbee    movl    %esp,%ebp
859a3147c7412f4794434b4c2604aa2ba784867774buzbee    addl    $$(FRAME_SIZE-4), %ebp       # Restore %ebp at point of setjmp
86f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    EDI_SPILL(%ebp),%edi
87f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    ESI_SPILL(%ebp),%esi
88f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl    EBX_SPILL(%ebp),%ebx
894570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin    movl    %ebp, %esp                   # strip frame
904570ad0a7706d3338d58bd0204e102719e4d68fbEugene Surovegin    pop     %ebp                         # restore caller's ebp
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret                                  # return to dvmMterpStdRun's caller
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
940c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#ifdef WITH_JIT
950c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    .global     dvmNcgInvokeInterpreter
960c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    .type       dvmNcgInvokeInterpreter, %function
970c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen/* input: start of method in %eax */
980c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan ChendvmNcgInvokeInterpreter:
990c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    movl        %eax, rPC
1000c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    movl   rSELF, %ecx
1010c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    movl   offThread_curHandlerTable(%ecx),rIBASE
1020c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    FETCH_INST_R %ecx                    # %edx<- opcode
1030c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    GOTO_NEXT_R %ecx                    # start executing the instruction at rPC
1040c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#endif
1050c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section    .rodata
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint:
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Bad entry point %d\n"
112f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee
113