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 * Common subroutines and data.
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backwards branch is taken
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ebx (a.k.a. rINST_FULL) -> PC adjustment in 16-bit words
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch:
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call   common_periodicChecks      # Note: expects rPC to be preserved
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common invoke code (old-style).
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING:  Rewrite along lines of new armv5 code?
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   eax = Method* methodToCall
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ecx = bool methodCallRange
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   rINST trashed, must reload
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeOld:
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)     # arg1<- methodCallRange
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  (rPC),rINST_FULL         # recover rINST
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG2(%esp)     # arg2<- method
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   4(rPC),%eax             # eax<- GFED or CCCC
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,OUT_ARG3(%esp)# arg3<- AA
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)     # arg0<- GLUE
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG4(%esp)     # arg4<- GFED/CCCC
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmMterp_invokeMethod
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_resumeAfterGlueCall
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Do we need the thread to be suspended or have debugger/profiling activity?
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ebx  -> PC adjustment in 16-bit words (must be preserved)
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ecx  -> GLUE pointer
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: A call will normally kill %eax, rPC/%edx and %ecx.  To
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       streamline the normal case, this routine will preserve rPC and
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       %ecx in addition to the normal caller save regs.  The save/restore
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       is a bit ugly, but will happen in the relatively uncommon path.
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING: Might be worthwhile to inline this.
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: Basic-block style Jit will need a hook here as well.  Fold it into
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       the suspendCount check so we can get both in 1 shot.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks:
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_pSelfSuspendCount(%ecx),%eax    # eax <- &suspendCount
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $$0,(%eax)
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     1f
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER)
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   offGlue_pDebuggerActive(%ecx),%eax      # eax <- &DebuggerActive
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_PROFILER)
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   offGlue_pActiveProfilers(%ecx),%ecx     # ecx <- &ActiveProfilers
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) && defined(WITH_PROFILER)
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    (%ecx),%eax             # eax <- debuggerActive || activeProfilers
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_DEBUGGER)
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_PROFILER)
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx),%eax             # eax <= activeProfilers
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)                 # restore rGLUE
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  %eax,%eax
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3f                      # one or both active - switch interp
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Check for suspend */
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*  At this point, the return pointer to the caller of
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  common_periodicChecks is on the top of stack.  We need to preserve
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC(edx) and GLUE(ecx).  We'll spill rPC, and reload GLUE.
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  The outgoing profile is:
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      bool dvmCheckSuspendPending(Thread* self)
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  Because we reached here via a call, go ahead and build a new frame.
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%eax      # eax<- glue->self
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                      # save edx
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebp
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,%ebp
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl    $$24,%esp
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmCheckSuspendPending
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl    $$24,%esp
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebp
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Switch interpreters */
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Note: %ebx contains the 16-bit word offset to be applied to rPC to
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "complete" the interpretation of backwards branches.  In effect, we
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * are completing the interpretation of the branch instruction here,
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and the new interpreter will resume interpretation at the branch
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * target. However, a switch request recognized during the handling
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * of a return from method instruction results in an immediate abort,
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and the new interpreter will resume by re-interpreting the return
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction.
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ebx,2),rPC       # adjust pc to show target
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)                 # bail expect GLUE already loaded
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$1,rINST_FULL         # set changeInterp to true
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_gotoBail
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod:
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set entry mode in case we bail */
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    $$kInterpEntryReturn,offGlue_entryPoint(%ecx)
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    rINST_FULL,rINST_FULL   # zero offset in case we switch interps
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    common_periodicChecks   # Note: expects %ecx to be preserved
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(%eax,rFP)                    # eax<- saveArea (old)
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offStackSaveArea_prevFrame(%eax),rFP  # rFP<- prevFrame
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST_FULL
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $$0,rINST_FULL                        # break?
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_gotoBail    # break frame, bail out completely
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offStackSaveArea_savedPc(%eax),rPC    # pc<- saveArea->savedPC
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%eax               # eax<- self
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,offGlue_method(%ecx)  # glue->method = newSave->meethod
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rFP,offThread_curFrame(%eax)     # self->curFrame = fp
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rINST_FULL),%eax # eax<- method->clazz
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_pDvmDex(%eax),%eax # eax<- method->clazz->pDvmDex
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_methodClassDex(%ecx)
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* not bailing - restore entry mode to default */
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    $$kInterpEntryInstr,offGlue_entryPoint(%ecx)
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Prepare to strip the current frame and "longjump" back to caller of
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dvmMterpStdRun.
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on entry:
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    rINST_FULL holds changeInterp
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    ecx holds glue pointer
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected profile: dvmMterpStdBail(MterpGlue *glue, bool changeInterp)
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail:
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)                # export state to glue
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,OUT_ARG0(%esp)           # glue in arg0
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   rINST_FULL,OUT_ARG1(%esp)     # changeInterp in arg1
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmMterpStdBail              # bail out....
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated values
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and start executing at the next instruction.
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project common_resumeAfterGlueCall:
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     LOAD_PC_FROM_GLUE(%ecx)
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     LOAD_FP_FROM_GLUE(%ecx)
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     FETCH_INST()
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GOTO_NEXT
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero:
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$.LstrArithmeticException,%eax
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$.LstrDivideByZero,%eax
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize:
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$.LstrNegativeArraySizeException,%eax
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod:
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$.LstrNoSuchMethodError,%eax
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Hit a null object when we weren't expecting one.  Export the PC, throw a
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NullPointerException and goto the exception processing code.
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject:
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$.LstrNullPointerException,%eax
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array index exceeds max.
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex:
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$.LstrArrayIndexException,%eax
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value.
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore:
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$.LstrArrayStoreException,%eax
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception.  Handle it.
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be.
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown:
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmMterp_exceptionThrown
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_resumeAfterGlueCall
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort:
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $$0xdeadf00d,%eax
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     *%eax
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section     .rodata
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException:
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz    "Ljava/lang/NullPointerException;"
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException:
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArithmeticException;"
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero:
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "divide by zero"
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException:
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException:
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayStoreException;"
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException:
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NegativeArraySizeException;"
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError:
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InstantiationError;"
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException:
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ClassCastException;"
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError:
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NoSuchMethodError;"
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError:
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InternalError;"
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl:
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "filled-new-array only implemented for 'int'"
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
332