InterpAsm-x86.S revision c95e0fbce4f77b2b08eb48205e405793de0d4248
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This file was generated automatically by gen-mterp.py for 'x86'.
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * --> DO NOT EDIT <--
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/header.S */
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 32-bit x86 definitions and declarations.
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project386 ABI general notes:
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCaller save set:
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   eax, edx, ecx, st(0)-st(7)
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCallee save set:
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   ebx, esi, edi, ebp
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectReturn regs:
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   32-bit in eax
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   64-bit in edx:eax (low-order 32 in eax)
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   fp on top of fp stack st(0)
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectParameters passed on stack, pushed right-to-left.  On entry to target, first
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectparm is at 4(%esp).  Traditional entry code is:
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectfunctEntry:
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebp             # save old frame pointer
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     %ebp,%esp        # establish new frame pointer
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     FrameSize,%esp   # Allocate storage for spill, locals & outs
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOnce past the prologue, arguments are referenced at ((argno + 2)*4)(%ebp)
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectAlignment of stack not strictly required, but should be for performance.  We'll
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectalign frame sizes to 16-byte multiples.
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectIf we're not doing variable stack allocation (alloca), the frame pointer can be
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecteliminated and all arg references adjusted to be esp relative.
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMterp notes:
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSome key interpreter variables will be assigned to registers.  Note that each
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectwill also have an associated spill location (mostly used useful for those assigned
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectto callee save registers).
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  nick     reg   purpose
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  rPC      edx   interpreted program counter, used for fetching instructions
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  rFP      esi   interpreted frame pointer, used for accessing locals and args
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  rIBASE   edi   Base pointer for instruction dispatch computed goto
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  rINST    bx    first 16-bit code of current instruction
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  rOPCODE  bl    opcode portion of instruction word
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  rINST_HI bh    high byte of instruction word, usually contains src/tgt reg names
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectNotes:
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   o High order 16 bits of ebx must be zero on entry to handler
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   o rPC, rFP, rIBASE, rINST/rOPCODE valid on handler entry and exit
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   o eax and ecx are scratch, rINST/ebx sometimes scratch
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   o rPC is in the caller save set, and will be killed across external calls. Don't
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     forget to SPILL/UNSPILL it around call points
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rPC      %edx
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rFP      %esi
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rIBASE   %edi
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rINST_FULL %ebx
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rINST    %bx
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rINST_HI %bh
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rINST_LO %bl
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rOPCODE  %bl
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Frame diagram while executing dvmMterpStdRun, high to low addresses */
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define IN_ARG0        (  8)
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define CALLER_RP      (  4)
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define PREV_FP        (  0) /* <- dvmMterpStdRun ebp */
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Spill offsets relative to %ebp */
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define EDI_SPILL      ( -4)
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ESI_SPILL      ( -8)
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define EDX_SPILL      (-12) /* <- esp following dmMterpStdRun header */
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rPC_SPILL      (-16)
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rFP_SPILL      (-20)
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rGLUE_SPILL    (-24)
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rIBASE_SPILL   (-28)
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rINST_FULL_SPILL    (-32)
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define TMP_SPILL      (-36)
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOCAL0_OFFSET  (-40)
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOCAL1_OFFSET  (-44)
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOCAL2_OFFSET  (-48)
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOCAL3_OFFSET  (-52)
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Out Arg offsets, relative to %sp */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define OUT_ARG4       ( 16)
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define OUT_ARG3       ( 12)
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define OUT_ARG2       (  8)
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define OUT_ARG1       (  4)
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define OUT_ARG0       (  0)  /* <- dvmMterpStdRun esp */
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SPILL(reg) movl reg##,reg##_SPILL(%ebp)
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define UNSPILL(reg) movl reg##_SPILL(%ebp),reg
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SPILL_TMP(reg) movl reg,TMP_SPILL(%ebp)
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define UNSPILL_TMP(reg) movl TMP_SPILL(%ebp),reg
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* save/restore the PC and/or FP from the glue struct */
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_PC_FROM_GLUE(_glu)     movl    offGlue_pc(_glu),rPC
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_PC_TO_GLUE(_glu)       movl    rPC,offGlue_pc(_glu)
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_FP_FROM_GLUE(_glu)     movl    offGlue_fp(_glu),rFP
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_FP_TO_GLUE(_glu)       movl    rFP,offGlue_fp(_glu)
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_GLUE(_reg)     movl   rGLUE_SPILL(%ebp),_reg
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* The interpreter assumes a properly aligned stack on entry, and
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * will preserve 16-byte alignment.
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "export" the PC to the interpreted stack frame, f/b/o future exception
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * objects.  Must * be done *before* something calls dvmThrowException.
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It's okay to do this more than once.
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define EXPORT_PC() \
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC, (-sizeofStackSaveArea + offStackSaveArea_currentPc)(rFP)
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a frame pointer, find the stack save area.
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "((StackSaveArea*)(_fp) -1)".
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVEAREA_FROM_FP(_reg, _fpreg) \
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    -sizeofStackSaveArea(_fpreg),_reg
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_INST()            movzwl    (rPC),rINST_FULL
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the nth instruction word from rPC into rINST.  Does not advance
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rPC, and _count is in words
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_INST_WORD(_count)  movzwl  _count*2(rPC),rINST_FULL
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch instruction word indexed (used for branching).
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Index is in instruction word units.
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_INST_INDEXED(_reg) movzwl  (rPC,_reg,2),rINST_FULL
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Extract the opcode of the instruction in rINST
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define EXTRACT_OPCODE(_reg)   movzx rOPCODE,_reg
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Advance rPC by instruction count
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ADVANCE_PC(_count)    leal  2*_count(rPC),rPC
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Advance rPC by branch offset in register
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ADVANCE_PC_INDEXED(_reg) leal (rPC,_reg,2),rPC
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: assumes opcode previously fetched and in rINST, and
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       %eax is killable at this point.
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 1
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro GOTO_NEXT
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For computed next version */
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movzx    rOPCODE,%eax
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     sall     $6,%eax
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     addl     rIBASE,%eax
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jmp      *%eax
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   /* For jump table version */
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro GOTO_NEXT
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movzx   rOPCODE,%eax
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jmp     *(rIBASE,%eax,4)
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get/set the 32-bit value from a Dalvik register.
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_VREG(_reg, _vreg)   movl     (rFP,_vreg,4),_reg
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_VREG(_reg, _vreg)   movl     _reg,(rFP,_vreg,4)
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_VREG_WORD(_reg, _vreg, _offset)   movl     4*(_offset)(rFP,_vreg,4),_reg
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_VREG_WORD(_reg, _vreg, _offset)   movl     _reg,4*(_offset)(rFP,_vreg,4)
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is a #include, not a %include, because we want the C pre-processor
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to expand the macros into assembler assignment statements.
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "../common/asm-constants.h"
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionStart
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmInstructionStart, %function
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOP: /* 0x00 */
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NOP.S */
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE: /* 0x01 */
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE.S */
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb   $0xf,%al             # eax<- A
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_FROM16.S */
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%eax            # eax <= AA
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     2(rPC),rINST             # rINST <= BBBB
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG (%ecx,rINST_FULL)        # ecx<- fp[BBBB]
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG (%ecx,%eax)              # fp[AA]<- ecx]
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_16.S */
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx              # ecx<- BBBB
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- AAAA
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_WIDE.S */
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide vA, vB */
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                # ecx <- BA
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL              # rinst_FULL<- B
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[B+0]
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[B+1]
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%cl                    # ecx <- A
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rINST_FULL,%ecx,1)       # v[A+1]<- rINST_FULL
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)             # v[A+0]<- eax
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_WIDE_FROM16.S */
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/from16 vAA, vBBBB */
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx              # ecx<- BBBB
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax            # eax<- AAAA
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0)   # rINST_FULL<- v[BBBB+0]
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[BBBB+1]
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rINST_FULL,%eax,0)   # v[AAAA+0]<- rINST_FULL
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,%eax,1)         # v[AAAA+1]<- eax
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_WIDE_16.S */
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/16 vAAAA, vBBBB */
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx            # ecx<- BBBB
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax            # eax<- AAAA
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0) # rINST_WORD<- v[BBBB+0]
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)       # ecx<- v[BBBB+1]
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rINST_FULL,%eax,0) # v[AAAA+0]<- rINST_FULL
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,%eax,1)       # v[AAAA+1]<- ecx
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_OBJECT.S */
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE.S */
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb   $0xf,%al             # eax<- A
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_OBJECT_FROM16.S */
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_FROM16.S */
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%eax            # eax <= AA
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     2(rPC),rINST             # rINST <= BBBB
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG (%ecx,rINST_FULL)        # ecx<- fp[BBBB]
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG (%ecx,%eax)              # fp[AA]<- ecx]
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_OBJECT_16.S */
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_16.S */
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx              # ecx<- BBBB
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- AAAA
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_RESULT.S */
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)                         # eax<- rGLUE
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx                 # ecx<- AA
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_retval(%eax),%eax     # eax<- glue->retval.l
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG (%eax,%ecx)                   # fp[AA]<- retval.l
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_RESULT_WIDE.S */
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-result-wide vAA */
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_retval(%ecx),%eax
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    4+offGlue_retval(%ecx),%ecx
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)    # v[AA+0] <- eax
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)    # v[AA+1] <- ecx
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_RESULT_OBJECT.S */
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_RESULT.S */
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)                         # eax<- rGLUE
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx                 # ecx<- AA
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_retval(%eax),%eax     # eax<- glue->retval.l
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG (%eax,%ecx)                   # fp[AA]<- retval.l
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_EXCEPTION.S */
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-exception vAA */
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%ecx    # ecx<- glue->self
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offThread_exception(%ecx),%eax # eax<- dvmGetException bypass
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)          # fp[AA]<- exception object
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,offThread_exception(%ecx) # dvmClearException bypass
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN_VOID.S */
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_returnFromMethod
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN: /* 0x0f */
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN.S */
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)   # retval.i <- AA
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_returnFromMethod
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_WIDE: /* 0x10 */
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN_WIDE.S */
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 64-bit value.  Copies the return value into the "glue"
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* return-wide vAA */
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL            # rINST_FULL<- AA
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[AA+0]
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[AA+1]
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,4+offGlue_retval(%ecx)
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_returnFromMethod
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN_OBJECT.S */
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN.S */
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)   # retval.i <- AA
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_returnFromMethod
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_4: /* 0x12 */
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_4.S */
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/4 vA, #+B */
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsx   rINST_HI,%eax              # eax<-ssssssBx
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0xf,%ecx
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl    %eax,%ecx                  # ecx<- A
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%eax
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_16: /* 0x13 */
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_16.S */
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/16 vAA, #+BBBB */
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl  2(rPC),%ecx                # ecx<- ssssBBBB
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%eax              # eax<- AA
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)                # vAA<- ssssBBBB
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST: /* 0x14 */
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST.S */
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const vAA, #+BBBBbbbb */
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- AA
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      2(rPC),%eax               # grab all 32 bits at once
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                 # vAA<- eax
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_HIGH16.S */
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/high16 vAA, #+BBBB0000 */
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                # eax<- 0000BBBB
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl     rINST_HI,%ecx              # ecx<- AA
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall       $16,%eax                  # eax<- BBBB0000
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                   # vAA<- eax
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_16: /* 0x16 */
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_WIDE_16.S */
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/16 vAA, #+BBBB */
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl    2(rPC),%eax               # eax<- ssssBBBB
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- AA
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd                                # rPC:eax<- ssssssssssssBBBB
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)           # store msw
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_WIDE_32.S */
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/32 vAA, #+BBBBbbbb */
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     2(rPC),%eax               # eax<- BBBBbbbb
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- AA
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd                                # rPC:eax<- ssssssssssssBBBB
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)           # store msw
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_WIDE.S */
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      2(rPC),%eax         # eax<- lsw
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx       # ecx <- AA
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      6(rPC),rINST_FULL   # rINST_FULL<- msw
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%ecx,4),%ecx   # dst addr
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,4(%ecx)
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(5)
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(%ecx)
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(5)
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_WIDE_HIGH16.S */
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/high16 vAA, #+BBBB000000000000 */
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                # eax<- 0000BBBB
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl     rINST_HI,%ecx              # ecx<- AA
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall       $16,%eax                  # eax<- BBBB0000
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,1)            # v[AA+1]<- eax
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl       %eax,%eax
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)            # v[AA+0]<- eax
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_STRING.S */
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBB */
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # resolved yet?
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CONST_STRING_resolve
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_STRING_JUMBO.S */
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBBBBBB */
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      2(rPC),%eax              # eax<- BBBBBBBB
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # resolved yet?
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CONST_STRING_JUMBO_resolve
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_CLASS.S */
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/class vAA, Class@BBBB */
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- dvmDex->pResClasses
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- rResClasses[BBBB]
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # resolved yet?
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CONST_CLASS_resolve
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                # vAA<- rResClasses[BBBB]
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MONITOR_ENTER.S */
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Synchronize on an object.
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-enter vAA */
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # null object?
68599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         # need for precise GC, MONITOR_TRACKING
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_MONITOR_ENTER_continue
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errNullObject
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MONITOR_EXIT.S */
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlock an object.
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exceptions that occur when unlocking a monitor need to appear as
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if they happened at the following instruction.  See the Dalvik
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction spec.
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-exit vAA */
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # null object?
706668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    je      .LOP_MONITOR_EXIT_errNullObject   # go if so
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_MONITOR_EXIT_continue
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CHECK_CAST.S */
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if a cast from one class to another is allowed.
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* check-cast vAA, class@BBBB */
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA (object)
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # is oject null?
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CHECK_CAST_okay          # null obj, cast always succeeds
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved class
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # have we resolved this before?
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CHECK_CAST_resolve       # no, go do it now
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolved:
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      %eax,%ecx                 # same class (trivial success)?
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_CHECK_CAST_fullcheck     # no, do full check
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_okay:
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INSTANCE_OF.S */
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if an object reference is an instance of a class.
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Most common situation is a non-null object, being compared against
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an already-resolved class.
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* instance-of vA, vB, class@CCCC */
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%eax               # eax<- BA
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%eax                    # eax<- B
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # object null?
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      .LOP_INSTANCE_OF_store           # null obj, not instance, store it
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rPC                  # rPC<- CCCC
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%ecx,rPC,4),%ecx           # ecx<- resolved class
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                   # have we resolved this before?
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      .LOP_INSTANCE_OF_resolve         # not resolved, do it now
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolved:  # eax<- obj->clazz, ecx<- resolved class
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    %eax,%ecx                   # same class (trivial success)?
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      .LOP_INSTANCE_OF_trivial         # yes, trivial finish
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_INSTANCE_OF_fullcheck       # no, do full check
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ARRAY_LENGTH.S */
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the length of an array.
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   movzbl   rINST_HI,%eax              # eax<- BA
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   sarl     $12,rINST_FULL            # rINST_FULL<- B
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   GET_VREG(%ecx,rINST_FULL)           # ecx<- vB (object ref)
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   andb     $0xf,%al                  # eax<- A
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   testl    %ecx,%ecx                  # is null?
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   je       common_errNullObject
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   FETCH_INST_WORD(1)
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   movl     offArrayObject_length(%ecx),%ecx
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   ADVANCE_PC(1)
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   SET_VREG(%ecx,%eax)
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   GOTO_NEXT
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEW_INSTANCE.S */
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new instance of a class.
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-instance vAA, class@BBBB */
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved class
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # resolved?
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_NEW_INSTANCE_resolve       # no, go do it
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolved:  # on entry, ecx<- class
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb      $CLASS_INITIALIZED,offClassObject_status(%ecx)
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_NEW_INSTANCE_initialized
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_NEW_INSTANCE_needinit
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEW_ARRAY.S */
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Allocate an array of objects, specified with the array class
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and a count.
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The verifier guarantees that this is an array class, so we don't
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * check for it here.
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-array vA, vB, class@CCCC */
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                       # eax<- CCCC
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResClasses(%ecx),%ecx  # ecx<- pDvmDex->pResClasses
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%ecx,%eax,4),%ecx                # ecx<- resolved class
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%eax
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%eax                          # eax<- B
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                       # eax<- vB (array length)
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                    # rINST_FULL<- A
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js      common_errNegativeArraySize       # bail
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                         # already resolved?
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_NEW_ARRAY_finish                # yes, fast path
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_NEW_ARRAY_resolve               # resolve now
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FILLED_NEW_ARRAY.S */
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL               # rINST_FULL<- AA or BA
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%eax),%eax # eax<- pDvmDex
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                       # ecx<- BBBB
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax                # eax<- resolved class
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # already resolved?
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_FILLED_NEW_ARRAY_continue              # yes, continue
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # less frequent path, so we'll redo some work
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)                # arg2<- false
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%eax),%eax         # eax<- glue->method
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_FILLED_NEW_ARRAY_more
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FILLED_NEW_ARRAY_RANGE.S */
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FILLED_NEW_ARRAY.S */
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL               # rINST_FULL<- AA or BA
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%eax),%eax # eax<- pDvmDex
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                       # ecx<- BBBB
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax                # eax<- resolved class
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # already resolved?
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_FILLED_NEW_ARRAY_RANGE_continue              # yes, continue
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # less frequent path, so we'll redo some work
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)                # arg2<- false
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%eax),%eax         # eax<- glue->method
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_FILLED_NEW_ARRAY_RANGE_more
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FILL_ARRAY_DATA.S */
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fill-array-data vAA, +BBBBBBBB */
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    2(rPC),%ecx                # ecx<- BBBBbbbb
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ecx,2),%ecx          # ecx<- PC + BBBBbbbb*2
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInterpHandleFillArrayData
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # exception thrown?
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_THROW: /* 0x27 */
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_THROW.S */
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception object in the current thread.
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* throw vAA */
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL       # rINST_FULL<- AA
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)          # eax<- exception object
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_self(%ecx),%ecx   # ecx<- glue->self
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # null object?
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errNullObject
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,offThread_exception(%ecx) # thread->exception<- obj
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO: /* 0x28 */
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_GOTO.S */
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 8-bit offset.
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto +AA */
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl  rINST_HI,rINST_FULL         # ebx<- ssssssAA
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rINST_FULL,rINST_FULL       # test for <0
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js      common_backwardBranch
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_GOTO_16.S */
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 16-bit offset.
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/16 +AAAA */
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl  2(rPC),rINST_FULL           # rINST_FULL<- ssssAAAA
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rINST_FULL,rINST_FULL       # test for <0
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js      common_backwardBranch
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_GOTO_32.S */
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 32-bit offset.
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset.
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most opcodes, this one is allowed to branch to itself, so
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * our "backward branch" test must be "<=0" instead of "<0".
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/32 AAAAAAAA */
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    2(rPC),rINST_FULL           # rINST_FULL<- AAAAAAAA
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $0,rINST_FULL              # test for <= 0
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle     common_backwardBranch
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_PACKED_SWITCH.S */
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInterpHandlePackedSwitch
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,rINST_FULL             # set up word offset
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle     common_backwardBranch       # check on special actions
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPARSE_SWITCH.S */
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_PACKED_SWITCH.S */
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInterpHandleSparseSwitch
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,rINST_FULL             # set up word offset
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle     common_backwardBranch       # check on special actions
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPL_FLOAT.S */
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %ecx,%ecx
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%eax
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_CMPL_FLOAT_isNaN
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_CMPL_FLOAT_finish
1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl     %ecx,%ecx
1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb       .LOP_CMPL_FLOAT_finish
1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    incl     %ecx
1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_finish:
1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_FLOAT.S */
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)
1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)
1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)
1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %ecx,%ecx
1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%eax
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_CMPG_FLOAT_isNaN
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_CMPG_FLOAT_finish
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl     %ecx,%ecx
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb       .LOP_CMPG_FLOAT_finish
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    incl     %ecx
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_finish:
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */
1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPL_DOUBLE.S */
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)
1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)
1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)
1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)
1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %ecx,%ecx
1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%eax
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_CMPL_DOUBLE_isNaN
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_CMPL_DOUBLE_finish
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl     %ecx,%ecx
1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb       .LOP_CMPL_DOUBLE_finish
1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    incl     %ecx
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_finish:
1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */
1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)
1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)
1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)
1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)
1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %ecx,%ecx
1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%eax
1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_CMPG_DOUBLE_isNaN
1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_CMPG_DOUBLE_finish
1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl     %ecx,%ecx
1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb       .LOP_CMPG_DOUBLE_finish
1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    incl     %ecx
1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_finish:
1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */
1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMP_LONG.S */
1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * register based on the results of the comparison.
1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* cmp-long vAA, vBB, vCC */
1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),rPC               # rPC<- CC
1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,1)         # eax<- v[BB+1]
1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,0)         # ecx<- v[BB+0]
1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      4(rFP,rPC,4),%eax
1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jl        .LOP_CMP_LONG_smaller
1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jg        .LOP_CMP_LONG_bigger
1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub       (rFP,rPC,4),%ecx
1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ja        .LOP_CMP_LONG_bigger
1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb        .LOP_CMP_LONG_smaller
1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMP_LONG_finish
1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */
1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_EQ.S */
1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne   1f
1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NE: /* 0x33 */
1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_NE.S */
1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je   1f
1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LT: /* 0x34 */
1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_LT.S */
1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jge   1f
1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GE: /* 0x35 */
1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_GE.S */
1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jl   1f
1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GT: /* 0x36 */
1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_GT.S */
1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle   1f
1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LE: /* 0x37 */
1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_LE.S */
1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jg   1f
1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */
1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_EQZ.S */
1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne   1f
1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */
1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_NEZ.S */
1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je   1f
1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LTZ: /* 0x3a */
1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_LTZ.S */
1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jge   1f
1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GEZ: /* 0x3b */
1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_GEZ.S */
1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jl   1f
1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */
1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_GTZ.S */
1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle   1f
1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */
1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_LEZ.S */
1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jg   1f
1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */
1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_3E.S */
1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */
1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_3F.S */
1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */
1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_40.S */
1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */
1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_41.S */
1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */
1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_42.S */
1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */
1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_43.S */
1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET: /* 0x44 */
1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offArrayObject_contents(%eax,%ecx,4),%eax
1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */
1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_WIDE.S */
1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 64 bits.  vAA <- vBB[vCC].
1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb        .LOP_AGET_WIDE_finish        # index < length, OK
1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errArrayIndex      # index >= length, bail
1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */
1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_OBJECT.S */
1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offArrayObject_contents(%eax,%ecx,4),%eax
1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */
1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_BOOLEAN.S */
1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl     offArrayObject_contents(%eax,%ecx,1),%eax
1711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */
1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_BYTE.S */
1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl     offArrayObject_contents(%eax,%ecx,1),%eax
1740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */
1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_CHAR.S */
1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     offArrayObject_contents(%eax,%ecx,2),%eax
1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */
1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_SHORT.S */
1781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl     offArrayObject_contents(%eax,%ecx,2),%eax
1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT: /* 0x4b */
1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,4),%eax
1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,(%eax)
1829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */
1836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_WIDE.S */
1837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 64 bits.  vBB[vCC]<-vAA.
1839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb        .LOP_APUT_WIDE_finish        # index < length, OK
1851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errArrayIndex      # index >= length, bail
1852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */
1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_OBJECT.S */
1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA
1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb        .LOP_APUT_OBJECT_continue
1873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errArrayIndex      # index >= length, bail
1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */
1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_BOOLEAN.S */
1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,1),%eax
1896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     %cl,(%eax)
1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */
1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_BYTE.S */
1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,1),%eax
1925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     %cl,(%eax)
1928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */
1936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_CHAR.S */
1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,2),%eax
1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %cx,(%eax)
1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */
1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_SHORT.S */
1966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,2),%eax
1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %cx,(%eax)
1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET: /* 0x52 */
1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_finish                    # no, already resolved
2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_resolve
2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */
2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_WIDE.S */
2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit instance field get.
2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_WIDE_finish                    # no, already resolved
2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_WIDE_resolve
2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */
2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_OBJECT.S */
2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_OBJECT_finish                    # no, already resolved
2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_OBJECT_resolve
2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */
2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_BOOLEAN.S */
2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BOOLEAN_finish                    # no, already resolved
2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_BOOLEAN_resolve
2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */
2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_BYTE.S */
2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BYTE_finish                    # no, already resolved
2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_BYTE_resolve
2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */
2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_CHAR.S */
2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_CHAR_finish                    # no, already resolved
2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_CHAR_resolve
2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */
2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_SHORT.S */
2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_SHORT_finish                    # no, already resolved
2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_SHORT_resolve
2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT: /* 0x59 */
2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_finish                    # no, already resolved
2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_resolve
2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */
2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_WIDE.S */
2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit instance field put.
2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_WIDE_finish                    # no, already resolved
2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_WIDE_resolve
2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */
2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_OBJECT.S */
2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_OBJECT_finish                    # no, already resolved
2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_OBJECT_resolve
2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */
2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_BOOLEAN.S */
2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BOOLEAN_finish                    # no, already resolved
2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_BOOLEAN_resolve
2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */
2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_BYTE.S */
2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BYTE_finish                    # no, already resolved
2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_BYTE_resolve
2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */
2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_CHAR.S */
2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_CHAR_finish                    # no, already resolved
2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_CHAR_resolve
2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */
2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_SHORT.S */
2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_SHORT_finish                    # no, already resolved
2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_SHORT_resolve
2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */
2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_resolve                # if not, make it so
2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish:     # field ptr in eax
2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */
2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_WIDE.S */
2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SGET handler.
2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sget-wide vAA, field@BBBB */
2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_WIDE_resolve                # if not, make it so
2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish:     # field ptr in eax
2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%ecx    # ecx<- lsw
2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4+offStaticField_value(%eax),%eax  # eax<- msw
2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL                # rINST_FULL<- AA
2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */
2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_OBJECT.S */
2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_OBJECT_resolve                # if not, make it so
2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish:     # field ptr in eax
2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */
2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_BOOLEAN.S */
2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_BOOLEAN_resolve                # if not, make it so
2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish:     # field ptr in eax
2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */
2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_BYTE.S */
2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_BYTE_resolve                # if not, make it so
2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish:     # field ptr in eax
2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */
2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_CHAR.S */
2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_CHAR_resolve                # if not, make it so
2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish:     # field ptr in eax
2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */
2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_SHORT.S */
2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_SHORT_resolve                # if not, make it so
2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish:     # field ptr in eax
2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */
2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_resolve                # if not, make it so
2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_finish:     # field ptr in eax
2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */
2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_WIDE.S */
2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_WIDE_resolve                # if not, make it so
2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_finish:     # field ptr in eax
2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0)             # rINST_FULL<- lsw
2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)                   # ecx<- msw
2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,offStaticField_value(%eax)
2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+offStaticField_value(%eax)
2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */
2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_OBJECT.S */
2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_OBJECT_resolve                # if not, make it so
2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_finish:     # field ptr in eax
2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */
2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_BOOLEAN.S */
2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_BOOLEAN_resolve                # if not, make it so
2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish:     # field ptr in eax
2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */
2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_BYTE.S */
2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_BYTE_resolve                # if not, make it so
2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish:     # field ptr in eax
2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */
2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_CHAR.S */
2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_CHAR_resolve                # if not, make it so
2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish:     # field ptr in eax
2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */
2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_SHORT.S */
2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_SHORT_resolve                # if not, make it so
2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish:     # field ptr in eax
2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */
2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL.S */
2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx                 # ecx<- BBBB
2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # already resolved?
2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_continue        # yes, continue
2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%eax),%eax   # eax<- glue->method
2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_VIRTUAL_more
2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */
2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER.S */
2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rINST_FULL)
2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(rINST_FULL),%eax # eax<- method
2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # null "this"?
2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yes, throw
2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # already resolved?
2819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_SUPER_continue      # yes - go on
2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_SUPER_resolve
2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */
2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT.S */
2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
2846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
2848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # already resolved?
2850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_INVOKE_DIRECT_resolve      # not resolved, do it now
2852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish:
2853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
2854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                # null "this"?
2855c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange  # no, continue on
2856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errNullObject
2857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */
2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_STATIC.S */
2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax
2876c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange
2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax
2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_STATIC_continue
2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */
2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE.S */
2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
2897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if        (!0)
2899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl       $0xf,%eax               # eax<- C (or stays CCCC)
2900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
2902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax                # null this?
2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_errNullObject     # yes, fail
2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_methodClassDex(%ecx),%eax   # eax<- methodClassDex
2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_method(%ecx),%ecx           # ecx<- method
2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                         # eax<- BBBB
2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp        .LOP_INVOKE_INTERFACE_continue
2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */
2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_73.S */
2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
2927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_RANGE.S */
2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL.S */
2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx                 # ecx<- BBBB
2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # already resolved?
2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # yes, continue
2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%eax),%eax   # eax<- glue->method
2948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_VIRTUAL_RANGE_more
2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_RANGE.S */
2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER.S */
2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rINST_FULL)
2965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(rINST_FULL),%eax # eax<- method
2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # null "this"?
2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yes, throw
2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # already resolved?
2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_SUPER_RANGE_continue      # yes - go on
2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_SUPER_RANGE_resolve
2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT_RANGE.S */
2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT.S */
2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
3002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
3003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
3004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
3005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
3007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
3008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
3010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # already resolved?
3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_INVOKE_DIRECT_RANGE_resolve      # not resolved, do it now
3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish:
3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                # null "this"?
3018c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange  # no, continue on
3019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errNullObject
3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_STATIC_RANGE.S */
3026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_STATIC.S */
3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
3035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
3036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
3037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
3038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
3039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax
3041c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange
3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
3043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
3044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax
3045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
3046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
3047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
3048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_STATIC_RANGE_continue
3049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE_RANGE.S */
3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE.S */
3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
3064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if        (!1)
3066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl       $0xf,%eax               # eax<- C (or stays CCCC)
3067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
3069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
3070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax                # null this?
3071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_errNullObject     # yes, fail
3072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
3073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
3074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_methodClassDex(%ecx),%eax   # eax<- methodClassDex
3075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_method(%ecx),%ecx           # ecx<- method
3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
3077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                         # eax<- BBBB
3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
3079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp        .LOP_INVOKE_INTERFACE_RANGE_continue
3082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */
3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_79.S */
3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */
3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_7A.S */
3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */
3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_INT.S */
3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    negl %eax
3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */
3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NOT_INT.S */
3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    notl %eax
3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */
3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_LONG.S */
3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx            # ecx<- BA
3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                 # ecx<- B
3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO           # rINST_FULL<- A
3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    negl      %eax
3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl      $0,%ecx
3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    negl      %ecx
3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */
3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NOT_LONG.S */
3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx            # ecx<- BA
3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                 # ecx<- B
3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO           # rINST_FULL<- A
3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    notl      %eax
3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    notl      %ecx
3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */
3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_FLOAT.S */
3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,rINST_FULL,4)      # %st0<- vB
3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fchs
3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */
3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_DOUBLE.S */
3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fchs
3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */
3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_LONG.S */
3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* int to long vA, vB */
3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- +A
3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # will step on edx later
3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd                                # edx:eax<- sssssssBBBBBBBB
3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)          # v[A+1]<- edx/rPC
3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # v[A+0]<- %eax
3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */
3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_FLOAT.S */
3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */
3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_DOUBLE.S */
3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */
3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_LONG_TO_INT.S */
3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */
3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE.S */
3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb   $0xf,%al             # eax<- A
3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */
3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_LONG_TO_FLOAT.S */
3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
3313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_LONG_TO_DOUBLE.S */
3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */
3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FLOAT_TO_INT.S */
3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_FLOAT_TO_INT_continue
3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */
3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FLOAT_TO_LONG.S */
3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_FLOAT_TO_LONG_continue
3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FLOAT_TO_DOUBLE.S */
3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,rINST_FULL,4)      # %st0<- vB
3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */
3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DOUBLE_TO_INT.S */
3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DOUBLE_TO_INT_continue
3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DOUBLE_TO_LONG.S */
3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DOUBLE_TO_LONG_continue
3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DOUBLE_TO_FLOAT.S */
3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */
3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_BYTE.S */
3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl %al,%eax
3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */
3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_CHAR.S */
3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl %ax,%eax
3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */
3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_SHORT.S */
3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl %ax,%eax
3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */
3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT.S */
3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */
3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_INT.S */
3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */
3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT.S */
3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary multiplication.
3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul vAA, vBB, vCC */
3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull    (rFP,%ecx,4),%eax      # trashes rPC/edx
3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # ecx<- AA
3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */
3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT.S */
3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv.S */
3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_continue_div
3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_continue_div
3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_finish_div
3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */
3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT.S */
3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv.S */
3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_continue_div
3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_continue_div
3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_finish_div
3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */
3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT.S */
3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */
3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT.S */
3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */
3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT.S */
3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */
3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_INT.S */
3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop1.S */
3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall    %cl,%eax                          # ex: addl    %ecx,%eax
3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */
3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_INT.S */
3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop1.S */
3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    %cl,%eax                          # ex: addl    %ecx,%eax
3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */
3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_INT.S */
3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop1.S */
3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl    %cl,%eax                          # ex: addl    %ecx,%eax
3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */
3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_LONG.S */
3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
3889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
3890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
3892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
3894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */
3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_LONG.S */
3903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
3904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */
3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_LONG.S */
3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply.
3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We could definately use more free registers for
3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this code.  We must spill rPC (edx) because it
3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is used by imul.  We'll also spill rINST (ebx),
3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * giving us eax, ebc, ecx and edx as computational
3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * temps.  On top of that, we'll spill rIBASE (edi)
3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for use as the vB pointer and rFP (esi) for use
3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as the vC pointer.  Yuck.
3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long vAA, vBB, vCC */
3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- B
3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx              # ecx<- C
3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)
3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)
3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rINST_FULL)
3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[B]
3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%ecx,4),rFP         # rFP<- &v[C]
3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rIBASE),%ecx      # ecx<- Bmsw
3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rFP),%ecx          # ecx<- (Bmsw*Clsw)
3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rFP),%eax         # eax<- Cmsw
3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rIBASE),%eax       # eax<- (Cmsw*Blsw)
3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl      %eax,%ecx           # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (rFP),%eax          # eax<- Clsw
3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mull      (rIBASE)            # eax<- (Clsw*Alsw)
3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rINST_FULL)
3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_MUL_LONG_continue
3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */
3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG.S */
3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div vAA, vBB, vCC */
3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax              # eax<- CC
3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_check_zero
3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_check_neg1
3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_notSpecial:
3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_notSpecial1:
3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_continue
3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */
3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_LONG.S */
3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG.S */
3989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div vAA, vBB, vCC */
3990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax              # eax<- CC
3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
3992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
3994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
3996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
3997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_check_zero
3998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
3999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_check_neg1
4000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_notSpecial:
4001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
4002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
4003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_notSpecial1:
4004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
4005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
4007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_continue
4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */
4013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_LONG.S */
4014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
4025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
4026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */
4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_LONG.S */
4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
4050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
4051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
4052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
4055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
4057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */
4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_LONG.S */
4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */
4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_LONG.S */
4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * case specially.
4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long vAA, vBB, vCC */
4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # spill edx
4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # ecx<- v[BB+1]
4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shldl     %eax,%edx
4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall      %cl,%eax
4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,%edx
4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %eax,%eax
4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- %edx
4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHL_LONG_finish
4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */
4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_LONG.S */
4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * case specially.
4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # spill edx
4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      %cl,%edx
4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $31,%edx
4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- edx
4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHR_LONG_finish
4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */
4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_LONG.S */
4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * case specially.
4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # spill edx
4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      %cl,%edx
4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %edx,%edx
4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[BB+1]<- edx
4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_USHR_LONG_finish
4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */
4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_FLOAT.S */
4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fadds   (rFP,%ecx,4)           # ex: faddp
4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */
4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_FLOAT.S */
4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubs   (rFP,%ecx,4)           # ex: faddp
4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */
4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_FLOAT.S */
4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmuls   (rFP,%ecx,4)           # ex: faddp
4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */
4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_FLOAT.S */
4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivs   (rFP,%ecx,4)           # ex: faddp
4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */
4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_FLOAT.S */
4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float vAA, vBB, vCC */
4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)           # vCC to fp stack
4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)           # vCC to fp stack
4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)           # %st to vAA
4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */
4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_DOUBLE.S */
4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    faddl   (rFP,%ecx,4)           # ex: faddp
4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */
4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_DOUBLE.S */
4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubl   (rFP,%ecx,4)           # ex: faddp
4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */
4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_DOUBLE.S */
4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmull   (rFP,%ecx,4)           # ex: faddp
4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */
4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_DOUBLE.S */
4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivl   (rFP,%ecx,4)           # ex: faddp
4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */
4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_DOUBLE.S */
4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float vAA, vBB, vCC */
4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)           # vCC to fp stack
4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)           # vCC to fp stack
4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # ecx<- AA
4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)           # %st to vAA
4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */
4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT_2ADDR.S */
4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */
4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_INT_2ADDR.S */
4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */
4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT_2ADDR.S */
4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul vA, vB */
4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull   (rFP,%ecx,4),%eax
4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */
4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT_2ADDR.S */
4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv2addr.S */
4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/2addr vA, vB */
4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_2ADDR_continue_div2addr
4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_2ADDR_continue_div2addr
4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_2ADDR_finish_div2addr
4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */
4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT_2ADDR.S */
4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv2addr.S */
4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/2addr vA, vB */
4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_2ADDR_continue_div2addr
4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_2ADDR_continue_div2addr
4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_2ADDR_finish_div2addr
4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */
4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT_2ADDR.S */
4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */
4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT_2ADDR.S */
4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */
4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT_2ADDR.S */
4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */
4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_INT_2ADDR.S */
4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/shop2addr.S */
4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shift/2addr vA, vB */
4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall    %cl,%eax                          # ex: sarl %cl,%eax
4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */
4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_INT_2ADDR.S */
4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/shop2addr.S */
4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shift/2addr vA, vB */
4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    %cl,%eax                          # ex: sarl %cl,%eax
4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */
4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_INT_2ADDR.S */
4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/shop2addr.S */
4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shift/2addr vA, vB */
4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl    %cl,%eax                          # ex: sarl %cl,%eax
4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */
4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_LONG_2ADDR.S */
4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */
4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_LONG_2ADDR.S */
4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */
4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_LONG_2ADDR.S */
4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply, 2-addr version
4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We could definately use more free registers for
4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this code.  We must spill rPC (edx) because it
4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is used by imul.  We'll also spill rINST (ebx),
4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * giving us eax, ebc, ecx and edx as computational
4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * temps.  On top of that, we'll spill rIBASE (edi)
4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for use as the vA pointer and rFP (esi) for use
4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as the vB pointer.  Yuck.
4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long/2addr vA, vB */
4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax            # eax<- BA
4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%al                # eax<- A
4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL          # rINST_FULL<- B
4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)
4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)
4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[A]
4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,rINST_FULL,4),rFP   # rFP<- &v[B]
4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rIBASE),%ecx      # ecx<- Amsw
4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rFP),%ecx          # ecx<- (Amsw*Blsw)
4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rFP),%eax         # eax<- Bmsw
4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rIBASE),%eax       # eax<- (Bmsw*Alsw)
4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl      %eax,%ecx           # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (rFP),%eax          # eax<- Blsw
4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mull      (rIBASE)            # eax<- (Blsw*Alsw)
4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_MUL_LONG_2ADDR_continue
4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */
4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG_2ADDR.S */
4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/2addr vA, vB */
4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax
4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      $4,%eax                  # eax<- B
4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_2ADDR_check_zero
4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_2ADDR_check_neg1
4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_notSpecial:
4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_notSpecial1:
4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_2ADDR_continue
4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */
4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_LONG_2ADDR.S */
4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG_2ADDR.S */
4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/2addr vA, vB */
4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax
4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      $4,%eax                  # eax<- B
4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_2ADDR_check_zero
4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_2ADDR_check_neg1
4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_notSpecial:
4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_notSpecial1:
4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_2ADDR_continue
4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */
4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_LONG_2ADDR.S */
4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */
4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_LONG_2ADDR.S */
4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_LONG_2ADDR.S */
4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_LONG_2ADDR.S */
4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
4910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shldl     %eax,%edx
4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall      %cl,%eax
4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,%edx
4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %eax,%eax
4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHL_LONG_2ADDR_finish
4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_LONG_2ADDR.S */
4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      %cl,%edx
4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $31,%edx
4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHR_LONG_2ADDR_finish
4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_LONG_2ADDR.S */
4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      %cl,%edx
4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %edx,%edx
4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_USHR_LONG_2ADDR_finish
4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_FLOAT_2ADDR.S */
4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fadds   (rFP,rINST_FULL,4)           # ex: faddp
5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_FLOAT_2ADDR.S */
5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubs   (rFP,rINST_FULL,4)           # ex: faddp
5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_FLOAT_2ADDR.S */
5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmuls   (rFP,rINST_FULL,4)           # ex: faddp
5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_FLOAT_2ADDR.S */
5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivs   (rFP,rINST_FULL,4)           # ex: faddp
5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */
5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_FLOAT_2ADDR.S */
5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float/2addr vA, vB */
5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)         # vBB to fp stack
5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)               # vAA to fp stack
5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)               # %st to vA
5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_DOUBLE_2ADDR.S */
5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    faddl   (rFP,rINST_FULL,4)           # ex: faddp
5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_DOUBLE_2ADDR.S */
5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubl   (rFP,rINST_FULL,4)           # ex: faddp
5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_DOUBLE_2ADDR.S */
5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmull   (rFP,rINST_FULL,4)           # ex: faddp
5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_DOUBLE_2ADDR.S */
5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivl   (rFP,rINST_FULL,4)           # ex: faddp
5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_DOUBLE_2ADDR.S */
5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float/2addr vA, vB */
5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)         # vBB to fp stack
5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)               # vAA to fp stack
5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)               # %st to vA
5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */
5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT_LIT16.S */
5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl %ecx,%eax                              # for example: addl %ecx, %eax
5242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT: /* 0xd1 */
5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RSUB_INT.S */
5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl %eax,%ecx                              # for example: addl %ecx, %eax
5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,rINST_FULL)
5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */
5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT_LIT16.S */
5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul/lit16 vA, vB, #+CCCC */
5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     %ecx,%eax                 # trashes rPC
5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */
5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT_LIT16.S */
5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit16.S */
5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit16 vA, vB, #+CCCC */
5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT16_continue_div
5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT16_continue_div
5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_LIT16_finish_div
5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */
5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT_LIT16.S */
5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit16.S */
5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit16 vA, vB, #+CCCC */
5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT16_continue_div
5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT16_continue_div
5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_LIT16_finish_div
5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */
5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT_LIT16.S */
5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %ecx,%eax                              # for example: addl %ecx, %eax
5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */
5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT_LIT16.S */
5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl     %ecx,%eax                              # for example: addl %ecx, %eax
5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */
5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT_LIT16.S */
5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xor    %ecx,%eax                              # for example: addl %ecx, %eax
5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */
5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT_LIT8.S */
5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl %ecx,%eax                             # ex: addl %ecx,%eax
5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */
5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RSUB_INT_LIT8.S */
5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl  %eax,%ecx                             # ex: addl %ecx,%eax
5487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%ecx,rINST_FULL)
5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */
5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT_LIT8.S */
5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul/lit8 vAA, vBB, #+CC */
5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     %ecx,%eax                # trashes rPC
5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */
5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT_LIT8.S */
5515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit8.S */
5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit div/rem "lit8" binary operation.  Handles special case of
5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op0=minint & op1=-1
5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit8 vAA, vBB, #+CC */
5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT8_continue_div
5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT8_continue_div
5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_LIT8_finish_div
5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */
5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT_LIT8.S */
5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit8.S */
5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit div/rem "lit8" binary operation.  Handles special case of
5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op0=minint & op1=-1
5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit8 vAA, vBB, #+CC */
5547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT8_continue_div
5556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT8_continue_div
5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_LIT8_finish_div
5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */
5566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT_LIT8.S */
5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %ecx,%eax                             # ex: addl %ecx,%eax
5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */
5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT_LIT8.S */
5594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl     %ecx,%eax                             # ex: addl %ecx,%eax
5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */
5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT_LIT8.S */
5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xor    %ecx,%eax                             # ex: addl %ecx,%eax
5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */
5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_INT_LIT8.S */
5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall  %cl,%eax                             # ex: addl %ecx,%eax
5666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */
5675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_INT_LIT8.S */
5676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    %cl,%eax                             # ex: addl %ecx,%eax
5693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */
5702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_INT_LIT8.S */
5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl     %cl,%eax                             # ex: addl %ecx,%eax
5720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E3: /* 0xe3 */
5729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E3.S */
5730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E4: /* 0xe4 */
5737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E4.S */
5738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E5: /* 0xe5 */
5745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E5.S */
5746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E6: /* 0xe6 */
5753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E6.S */
5754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E7: /* 0xe7 */
5761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E7.S */
5762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
57685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
57695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
57705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
57725387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
57735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
57745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_IGET_WIDE_VOLATILE     # do the real work
57755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
57775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
57785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
57795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
57825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
57835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
57845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
57865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
57875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
57885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_IPUT_WIDE_VOLATILE     # do the real work
57895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
57915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
57925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
57935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
57965387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
57975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
57985387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57995387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
58005387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
58015387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
58025387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_SGET_WIDE_VOLATILE     # do the real work
58035387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
58055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
58065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
58075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
58105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
58115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
58125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
58145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
58155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
58165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_SPUT_WIDE_VOLATILE     # do the real work
58175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
58195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
58205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
58215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
582496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */
582596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: x86/OP_BREAKPOINT.S */
5826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
58323a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
5833be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee/* File: x86/OP_THROW_VERIFICATION_ERROR.S */
5834be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    /*
5835be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     * Handle a throw-verification-error instruction.  This throws an
5836be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     * exception for an error discovered during verification.  The
5837be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     * exception is indicated by AA, with some detail provided by BBBB.
5838be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     */
5839be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    /* op AA, ref@BBBB */
5840b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    GET_GLUE(%ecx)
5841be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movzwl   2(rPC),%eax                     # eax<- BBBB
5842be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     offGlue_method(%ecx),%ecx       # ecx<- glue->method
5843be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    EXPORT_PC()
5844be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movzbl   rINST_HI,rINST_FULL             # rINST_FULL<- AA
5845be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     %eax,OUT_ARG2(%esp)             # arg2<- BBBB
5846be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     rINST_FULL,OUT_ARG1(%esp)       # arg1<- AA
5847be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     %ecx,OUT_ARG0(%esp)             # arg0<- method
5848be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    SPILL(rPC)
5849be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    call     dvmThrowVerificationError       # call(method, kind, ref)
5850be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    UNSPILL(rPC)
5851be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    jmp      common_exceptionThrown          # handle exception
5852be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee
5853be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee
5854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */
5857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_EXECUTE_INLINE.S */
5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Execute a "native inline" instruction.
5860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We will be calling through a function table:
5862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (*gDvmInlineOpsTable[opIndex].func)(arg0, arg1, arg2, arg3, pResult)
5864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
5867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
5868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
5869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
5870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offGlue_retval(%ecx),%ecx # ecx<- & glue->retval
5871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG4(%esp)
5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL           # rINST_FULL<- arg count (0-4)
5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      .LOP_EXECUTE_INLINE_continue      # make call; will return after
5875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # successful?
5877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_exceptionThrown    # no, handle exception
5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5884b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
5885b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /* (stub) */
5886b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_GLUE(%ecx)
5887b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
5888b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
5889b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
5890b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    call      dvmMterp_OP_EXECUTE_INLINE_RANGE     # do the real work
5891b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_GLUE(%ecx)
5892b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
5893b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
5894b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH_INST()
5895b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GOTO_NEXT
5896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */
5899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT_EMPTY.S */
5900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * invoke-direct-empty is a no-op in a "standard" interpreter.
5902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */
5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_F1.S */
5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */
5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_QUICK.S */
5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,1),%eax
5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%cl                 # rINST_FULL<- A
5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,%ecx)               # fp[A]<- result
5933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
5938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_WIDE_QUICK.S */
5939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-wide-quick */
5940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%eax,1),%eax        # eax<- address of 64-bit source
5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax),%ecx               # ecx<- lsw
5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(%eax),%eax               # eax<- msw
5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)    # v[A+0]<- lsw
5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[A+1]<- msw
5954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_OBJECT_QUICK.S */
5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_QUICK.S */
5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,1),%eax
5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%cl                 # rINST_FULL<- A
5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,%ecx)               # fp[A]<- result
5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */
5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_QUICK.S */
5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                  # is object null?
5994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,(%ecx,%eax,1)
5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_WIDE_QUICK.S */
6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-wide-quick */
6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %ecx,%ecx                # is object null?
6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%eax,1),%ecx        # ecx<- Address of 64-bit target
6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- lsw
6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- msw
6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(%ecx)
6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,4(%ecx)
6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
6026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_OBJECT_QUICK.S */
6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_QUICK.S */
6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
6033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                  # is object null?
6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,(%ecx,%eax,1)
6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
6051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx               # ecx<- BBBB
6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- C (or stays CCCC)
6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null?
6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yep, throw exception
6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         # might throw later - get ready
6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
6068c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
6069c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
6076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
6085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx               # ecx<- BBBB
6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- C (or stays CCCC)
6088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null?
6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yep, throw exception
6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         # might throw later - get ready
6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
6096c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
6097c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK.S */
6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
6109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- GFED or CCCC
6114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- current method
6115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- D (or stays CCCC)
6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null "this"?
6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # "this" is null, throw exception
6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
6127c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK_RANGE.S */
6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK.S */
6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- GFED or CCCC
6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- current method
6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- D (or stays CCCC)
6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null "this"?
6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # "this" is null, throw exception
6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
6157c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FC: /* 0xfc */
6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_FC.S */
6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FD: /* 0xfd */
6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_FD.S */
6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FE: /* 0xfe */
6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_FE.S */
6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */
6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_FF.S */
6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionEnd
6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionEnd:
6198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Sister implementations
6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
6203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterStart
6205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmSisterStart, %function
6206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
6207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 4
6208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterStart:
6209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING */
6211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* This is the less common path, so we'll redo some work
6213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   here rather than force spills on the common path */
6214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_resolve:
6215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
6216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
6217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
6219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%ecx               # ecx<- BBBB
6220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
6221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
6223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
6224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveString          # go resolve
6225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # failed?
6227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown
6228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
6229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */
6235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* This is the less common path, so we'll redo some work
6237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   here rather than force spills on the common path */
6238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve:
6239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
6240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
6241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
6243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     2(rPC),%ecx               # ecx<- BBBBBBBB
6244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
6245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
6247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
6248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveString          # go resolve
6249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # failed?
6251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown
6252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
6253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
6255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_CLASS */
6259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* This is the less common path, so we'll redo some work
6261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   here rather than force spills on the common path */
6262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_CLASS_resolve:
6263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
6264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
6265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
6267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $1,OUT_ARG2(%esp)        # true
6268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%ecx               # ecx<- BBBB
6269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
6270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
6272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
6273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveClass           # go resolve
6274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # failed?
6276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown
6277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
6278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MONITOR_ENTER */
6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MONITOR_ENTER_continue:
6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # have to - caller save
6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmLockObject               # dvmLockObject(self,object)
6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION
6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlueSelf(%ecx),%ecx      # ecx<- glue->self
6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offThread_exception(%ecx),%eax
6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     common_exceptionThrown
6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MONITOR_EXIT */
6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MONITOR_EXIT_continue:
6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmUnlockObject             # unlock(self,obj)
6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # success?
6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
6309668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    je      common_exceptionThrown      # no, exception pending
6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6311668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee.LOP_MONITOR_EXIT_errNullObject:
6312668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    ADVANCE_PC(1)                       # advance before throw
6313668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    jmp     common_errNullObject
6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CHECK_CAST */
6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds obj->clazz
6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds class resolved from BBBB
6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_FULL holds object
6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_fullcheck:
6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInstanceofNonTrivial     # eax<- boolean result
6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # failed?
6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_CHECK_CAST_okay            # no, success
6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # A cast has failed.  We need to throw a ClassCastException with the
6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # class of the object that failed to be cast.
6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrClassCastException,%eax
6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%ecx),%ecx
6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)     # arg0<- message
6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)     # arg1<- obj->clazz->descriptor
6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowExceptionWithClassMessage
6342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path, and we're
6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * going to have to recreate some data.
6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_FULL holds object
6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolve:
6352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                # eax<- BBBB
6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)        # arg1<- BBBB
6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx # ecx<- metho->clazz
6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)         # arg2<- false
6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)        # arg0<- method->clazz
6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass            # eax<- resolved ClassObject ptr
6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                  # got null?
6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown     # yes, handle exception
6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_CHECK_CAST_resolved       # pick up where we left off
6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INSTANCE_OF */
6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds obj->clazz
6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class resolved from BBBB
6374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_HI has BA
6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC already spilled
6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_fullcheck:
6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)
6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInstanceofNonTrivial     # eax<- boolean result
6381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # fall through to OP_INSTANCE_OF_store
6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax holds boolean result
6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * rINST_HI holds BA
6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_store:
6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- BA
6390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecl<- A
6392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                 # vA<- eax
6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test succeeded, save and bail.
6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_trivial:
6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- BA
6403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecl<- A
6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $1,%eax
6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                  # vA<- true
6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC holds BBBB
6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_HI holds BA
6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolve:
6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG1(%esp)          # arg1<- BBBB
6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx
6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $1,OUT_ARG2(%esp)          # arg2<- true
6422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # arg0<- method->clazz
6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass             # eax<- resolved ClassObject ptr
6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # success?
6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown      # no, handle exception
6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Now, we need to sync up with fast path.  We need eax to
6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * hold the obj->clazz, and ecx to hold the resolved class
6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved class
6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%eax               # eax<- BA
6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%eax                    # eax<- B
6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_INSTANCE_OF_resolved
6438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_INSTANCE */
6441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized:  # on entry, ecx<- class
6443b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    /* TODO: remove test for interface/abstract, now done in verifier */
6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     $(ACC_INTERFACE|ACC_ABSTRACT),offClassObject_accessFlags(%ecx)
6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $ALLOC_DONT_TRACK,OUT_ARG1(%esp)
6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_NEW_INSTANCE_abstract
6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_finish: # ecx=class
6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmAllocObject             # eax<- new object
6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%ecx
6452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                  # success?
6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown     # no, bail out
6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class initialization required.
6461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class object
6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_needinit:
6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                     # save object
6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInitClass                # initialize class
6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)                   # restore object
6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # success?
6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_NEW_INSTANCE_initialized     # success, continue
6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)                        # failed, restore PC
6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # go deal with init exception
6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolve:
6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax
6481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx   # ecx<- glue->method
6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)
6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass             # call(clazz,off,flags)
6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved ClassObject ptr
6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                   # success?
6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_NEW_INSTANCE_resolved        # good to go
6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # no, handle exception
6492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6494b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden     * TODO: remove this
6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We can't instantiate an abstract class or interface, so throw an
6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * InstantiationError with the class descriptor as the message.
6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class object
6499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_abstract:
6501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%ecx),%eax
6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrInstantiationError,OUT_ARG0(%esp)
6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowExceptionWithClassMessage
6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_ARRAY */
6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolve class.  (This is an uncommon case.)
6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class (null here)
6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds array length (vB)
6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_resolve:
6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%eax)                    # save array length
6521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                # eax<- CCCC
6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)
6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass            # eax<- call(clazz,ref,flag)
6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx
6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%eax)
6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                  # successful resolution?
6533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown     # no, bail.
6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# fall through to OP_NEW_ARRAY_finish
6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finish allocation
6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx holds class
6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax holds array length (vB)
6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_finish:
6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)
6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass    # eax<- call(clazz,length,flags)
6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax               # failed?
6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown  # yup - go handle
6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%ecx
6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */
6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_more:
6561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # null?
6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown            # yes, handle it
6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project       # note: fall through to .LOP_FILLED_NEW_ARRAY_continue
6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    eax holds array class [r0]
6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rINST_FULL holds AA or BB [r10]
6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    ecx is scratch
6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rPC is valid, but has been spilled
6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue:
6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'I',%cl                             # supported?
6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'L',%cl
6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'[',%cl
6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_FILLED_NEW_ARRAY_notimpl                  # no, not handled yet
6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if      (!0)
6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,rINST_FULL
6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass                  # eax<- call(arrayClass, length, flags)
6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # alloc successful?
6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown                # no, handle exception
6599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
6602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* at this point:
6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     eax is pointer to tgt
6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rINST_FULL is length
6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     ecx is FEDC or CCCC
6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     TMP_SPILL is BA
6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rPC is valid, but spilled
6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  We now need to copy values from registers into the array
6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # set up src pointer
6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)     # esi
6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)   # edi
6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%edi         # set up dst ptr
6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rFP,%ecx,4),%esi # set up src ptr
6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%ecx   # load count register
6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rep
6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsd
6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  rINST_FULL,rINST_FULL
6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     4f
6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(rPC)
6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   $0x0f,rPC            # rPC<- 0000000A
6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall   $16,rPC              # rPC<- 000A0000
6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    %ecx,rPC              # rpc<- 000AFEDC
6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   $0xf,%ecx
6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   rPC,%ecx           # ecx<- next reg to load
6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $4,rPC
6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal   4(%eax),%eax
6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,-4(%eax)
6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub    $1,rINST_FULL
6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3b
6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:
6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl:
6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrInternalError,%eax
6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrFilledNewArrayNotImpl,%eax
6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_more:
6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
6668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # null?
6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown            # yes, handle it
6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project       # note: fall through to .LOP_FILLED_NEW_ARRAY_RANGE_continue
6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    eax holds array class [r0]
6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rINST_FULL holds AA or BB [r10]
6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    ecx is scratch
6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rPC is valid, but has been spilled
6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue:
6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'I',%cl                             # supported?
6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'L',%cl
6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'[',%cl
6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_FILLED_NEW_ARRAY_RANGE_notimpl                  # no, not handled yet
6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if      (!1)
6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,rINST_FULL
6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass                  # eax<- call(arrayClass, length, flags)
6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # alloc successful?
6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown                # no, handle exception
6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* at this point:
6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     eax is pointer to tgt
6710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rINST_FULL is length
6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     ecx is FEDC or CCCC
6712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     TMP_SPILL is BA
6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rPC is valid, but spilled
6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  We now need to copy values from registers into the array
6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # set up src pointer
6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)     # esi
6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)   # edi
6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%edi         # set up dst ptr
6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rFP,%ecx,4),%esi # set up src ptr
6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%ecx   # load count register
6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rep
6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsd
6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  rINST_FULL,rINST_FULL
6731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     4f
6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(rPC)
6733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   $0x0f,rPC            # rPC<- 0000000A
6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall   $16,rPC              # rPC<- 000A0000
6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    %ecx,rPC              # rpc<- 000AFEDC
6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
6737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   $0xf,%ecx
6738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   rPC,%ecx           # ecx<- next reg to load
6739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
6740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $4,rPC
6741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal   4(%eax),%eax
6742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,-4(%eax)
6743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub    $1,rINST_FULL
6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3b
6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:
6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrInternalError,%eax
6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrFilledNewArrayNotImpl,%eax
6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_FLOAT */
6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_isNaN:
6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $-1,%ecx
6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPL_FLOAT_finish
6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_FLOAT */
6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_isNaN:
6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $1,%ecx
6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPG_FLOAT_finish
6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */
6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_isNaN:
6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $-1,%ecx
6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPL_DOUBLE_finish
6785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */
6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_isNaN:
6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $1,%ecx
6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPG_DOUBLE_finish
6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMP_LONG */
6793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_bigger:
6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $1,%ecx
6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMP_LONG_finish
6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_smaller:
6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $-1,%ecx
6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_finish:
6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,rINST_FULL)
6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_AGET_WIDE */
6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_AGET_WIDE_finish:
6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,8),%eax
6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax),%ecx
6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(%eax),%eax
6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_WIDE */
6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_WIDE_finish:
6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,8),%eax
6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,0)
6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)
6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,4(%eax)
6827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,(%eax)
6829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_OBJECT */
6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* On entry:
6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax<- array object
6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx<- index
6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL<- vAA
6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_continue:
6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,4),%ecx
6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # storing null reference?
6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_APUT_OBJECT_skip_check
6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)
6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- arrayObj->clazz
6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
6848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)
6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)
6850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmCanPutArrayElement     # test object type vs. array type
6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax
6854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errArrayStore
6855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_skip_check:
6857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,(%ecx)
6858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET */
6864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_resolve:
6867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_finish
6879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_finish:
6882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
6884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
6885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
6886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
6887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
6888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
6890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
6892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
6893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
6894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
6895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_WIDE */
6902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_resolve:
6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_WIDE_finish
6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_finish:
6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax),%ecx                          # ecx<- lsw
6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    4(%eax),%eax                         # eax<- msw
6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_OBJECT */
6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_resolve:
6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_OBJECT_finish
6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_finish:
6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
6962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
6964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
6965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
6966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
6968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
6970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
6975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */
6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_resolve:
6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BOOLEAN_finish
6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_finish:
6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BYTE */
7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_resolve:
7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BYTE_finish
7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_finish:
7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_CHAR */
7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_resolve:
7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_CHAR_finish
7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_finish:
7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_SHORT */
7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_resolve:
7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_SHORT_finish
7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_finish:
7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT */
7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_resolve:
7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_finish
7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_finish:
7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_WIDE */
7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_resolve:
7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_WIDE_finish
7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_finish:
7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,0)             # ecx<- lsw
7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)       # rINST_FULL<- msw
7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,4(%eax)
7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,(%eax)
7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_OBJECT */
7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_resolve:
7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_OBJECT_finish
7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_finish:
7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */
7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_resolve:
7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BOOLEAN_finish
7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_finish:
7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BYTE */
7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_resolve:
7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BYTE_finish
7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_finish:
7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_CHAR */
7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_resolve:
7318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_CHAR_finish
7330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_finish:
7333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_SHORT */
7351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_resolve:
7354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_SHORT_finish
7366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_finish:
7369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET */
7387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_resolve:
7392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_finish                 # success, continue
7404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_WIDE */
7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_resolve:
7413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_WIDE_finish                 # success, continue
7425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_OBJECT */
7429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_resolve:
7434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_OBJECT_finish                 # success, continue
7446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */
7450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_resolve:
7455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_BOOLEAN_finish                 # success, continue
7467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BYTE */
7471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_resolve:
7476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_BYTE_finish                 # success, continue
7488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_CHAR */
7492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_resolve:
7497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_CHAR_finish                 # success, continue
7509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_SHORT */
7513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_resolve:
7518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_SHORT_finish                 # success, continue
7530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT */
7534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_resolve:
7539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_finish                 # success, continue
7551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_WIDE */
7555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_resolve:
7560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_WIDE_finish                 # success, continue
7572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_OBJECT */
7576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_resolve:
7581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_OBJECT_finish                 # success, continue
7593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */
7597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve:
7602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_BOOLEAN_finish                 # success, continue
7614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BYTE */
7618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_resolve:
7623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_BYTE_finish                 # success, continue
7635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_CHAR */
7639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_resolve:
7644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_CHAR_finish                 # success, continue
7656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_SHORT */
7660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_resolve:
7665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_SHORT_finish                 # success, continue
7677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */
7681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_more:
7684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
7685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
7686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
7687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
7688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # got null?
7690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_continue        # no, continue
7691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown      # yes, handle exception
7692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax = resolved base method
7695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx = scratch
7696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue:
7698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
7699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
7700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
7701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
7703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
7704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # null this?
7705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # go if so
7706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
7707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
7708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
7709c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
7710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER */
7713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
7716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method [r0]
7717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax = method->clazz [r9]
7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_continue:
7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
7721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
7722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
7723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae     .LOP_INVOKE_SUPER_nsm           # method not present in superclass
7724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
7725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
7726c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp     common_invokeMethodNoRange
7727c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
7728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx = null (needs to be resolved base method)
7731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax = method->clazz
7732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
7733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_resolve:
7734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%eax)                     # method->clazz
7735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
7736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                 # ecx<- BBBB
7737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
7738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
7739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
7741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # got null?
7743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved base method
7744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%eax)                   # restore method->clazz
7745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_INVOKE_SUPER_continue        # good to go - continue
7746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # handle exception
7747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
7750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method
7751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_nsm:
7753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_name(%ecx),%eax
7754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     %eax,OUT_ARG1(%esp)
7755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errNoSuchMethod
7756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */
7758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
7761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   TMP_SPILL  <- "this" register
7762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Things a bit ugly on this path, but it's the less
7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * frequent one.  We'll have to do some reloading.
7764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_resolve:
7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     SPILL_TMP(%ecx)
7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
7768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
7770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
7771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
7772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     $METHOD_DIRECT,OUT_ARG2(%esp)
7773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %eax,OUT_ARG1(%esp)
7774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %ecx,OUT_ARG0(%esp)
7775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     call     dvmResolveMethod # eax<- call(clazz, ref, flags)
7776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL_TMP(%ecx)
7777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     testl    %eax,%eax
7778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jne      .LOP_INVOKE_DIRECT_finish
7779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jmp      common_exceptionThrown
7781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_STATIC */
7783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_STATIC_continue:
7785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_STATIC,%eax
7786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
7787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod          # call(clazz,ref,flags)
7789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # got null?
7791c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange
7792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown
7793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_INTERFACE */
7796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_INTERFACE_continue:
7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax
7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_exceptionThrown
7802c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp        common_invokeMethodNoRange
7803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL_RANGE */
7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_more:
7809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
7811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
7813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # got null?
7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # no, continue
7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown      # yes, handle exception
7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax = resolved base method
7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx = scratch
7821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_continue:
7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
7824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
7825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
7829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # null this?
7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # go if so
7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
7834c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */
7838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method [r0]
7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax = method->clazz [r9]
7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue:
7845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
7846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
7848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae     .LOP_INVOKE_SUPER_RANGE_nsm           # method not present in superclass
7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
7851c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp     common_invokeMethodRange
7852c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx = null (needs to be resolved base method)
7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax = method->clazz
7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve:
7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%eax)                     # method->clazz
7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                 # ecx<- BBBB
7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
7863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # got null?
7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved base method
7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%eax)                   # restore method->clazz
7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_INVOKE_SUPER_RANGE_continue        # good to go - continue
7871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # handle exception
7872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method
7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm:
7878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_name(%ecx),%eax
7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     %eax,OUT_ARG1(%esp)
7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errNoSuchMethod
7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */
7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   TMP_SPILL  <- "this" register
7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Things a bit ugly on this path, but it's the less
7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * frequent one.  We'll have to do some reloading.
7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve:
7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     SPILL_TMP(%ecx)
7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
7893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
7895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
7896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
7897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     $METHOD_DIRECT,OUT_ARG2(%esp)
7898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %eax,OUT_ARG1(%esp)
7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %ecx,OUT_ARG0(%esp)
7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     call     dvmResolveMethod # eax<- call(clazz, ref, flags)
7901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL_TMP(%ecx)
7902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     testl    %eax,%eax
7903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jne      .LOP_INVOKE_DIRECT_RANGE_finish
7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jmp      common_exceptionThrown
7906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_STATIC_RANGE */
7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_STATIC_RANGE_continue:
7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_STATIC,%eax
7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
7912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod          # call(clazz,ref,flags)
7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # got null?
7916c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange
7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown
7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_INTERFACE_RANGE */
7921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_INTERFACE_RANGE_continue:
7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax
7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_exceptionThrown
7927c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp        common_invokeMethodRange
7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_INT */
7931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_continue:
7934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
7939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
7940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_FLOAT_TO_INT_special_case # fix up result
7942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_finish:
7944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
7945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_special_case:
7948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
7949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
7950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_FLOAT_TO_INT_isNaN
7951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
7952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
7954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_FLOAT_TO_INT_finish
7956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_isNaN:
7957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
7958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
7960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_FLOAT_TO_INT_finish
7962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */
7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_continue:
7967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
7969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
7970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
7971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
7972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
7973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_FLOAT_TO_LONG_special_case # fix up result
7975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_finish:
7977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
7978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_special_case:
7981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
7982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
7983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_FLOAT_TO_LONG_isNaN
7984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
7985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
7987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_FLOAT_TO_LONG_finish
7989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_isNaN:
7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_FLOAT_TO_LONG_finish
7995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_INT */
7997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_continue:
8000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
8001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
8002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
8003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
8004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
8006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DOUBLE_TO_INT_special_case # fix up result
8008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_finish:
8010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_special_case:
8014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
8015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
8016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_DOUBLE_TO_INT_isNaN
8017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
8018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
8019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
8020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_DOUBLE_TO_INT_finish
8022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_isNaN:
8023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
8024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
8025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
8026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_DOUBLE_TO_INT_finish
8028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */
8030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_continue:
8033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
8034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
8035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
8036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
8037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
8039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DOUBLE_TO_LONG_special_case # fix up result
8041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_finish:
8043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_special_case:
8047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
8048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
8049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_DOUBLE_TO_LONG_isNaN
8050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
8051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
8052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
8053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_DOUBLE_TO_LONG_finish
8055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_isNaN:
8056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
8057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
8058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
8059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_DOUBLE_TO_LONG_finish
8061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT */
8063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_continue_div:
8064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_finish_div:
8067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecl<- AA
8068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
8069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT */
8075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_continue_div:
8076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_finish_div:
8079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecl<- AA
8080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,%ecx)
8081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG */
8087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_continue:
8089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
8090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx       # ecx<- A
8091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,4(rFP,%ecx,4)  # v[B+1]<- %edx
8092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)                  # restore rPC/%edx
8093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
8095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(rFP,%ecx,4)   # v[B]<- %eax
8096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_LONG */
8101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_continue:
8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __divdi3
8104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_finish:
8105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx
8106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_check_zero:
8114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_notSpecial
8116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_check_neg1:
8119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_notSpecial
8121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_notSpecial1
8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_notSpecial1
8127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%edx
8130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_finish
8131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_LONG */
8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_continue:
8138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __moddi3
8139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_finish:
8140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx
8141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_check_zero:
8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_notSpecial
8151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_check_neg1:
8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_notSpecial
8156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
8158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_notSpecial1
8160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_notSpecial1
8162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
8165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_finish
8166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG */
8171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_finish:
8173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- %eax
8174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG */
8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_finish:
8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- eax
8182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG */
8186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_finish:
8189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)        # v[BB+0]<- eax
8190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT_2ADDR */
8195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_2ADDR_continue_div2addr:
8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_2ADDR_finish_div2addr:
8199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
8200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT_2ADDR */
8206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_2ADDR_continue_div2addr:
8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_2ADDR_finish_div2addr:
8210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
8211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG_2ADDR */
8217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_2ADDR_continue:
8219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,4(rIBASE)      # v[A+1]<- %edx
8221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)                  # restore rPC/%edx
8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(rIBASE)       # v[A]<- %eax
8224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
8225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
8226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_LONG_2ADDR */
8231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_continue:
8233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
8234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
8235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
8236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __divdi3
8237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_finish:
8238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%ecx
8239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_check_zero:
8247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_2ADDR_notSpecial
8249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_check_neg1:
8252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_2ADDR_notSpecial
8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
8256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_2ADDR_notSpecial1
8258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_2ADDR_notSpecial1
8260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%edx
8263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_2ADDR_finish
8264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_LONG_2ADDR */
8267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_continue:
8269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
8271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __moddi3
8273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_finish:
8274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%ecx
8275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_check_zero:
8283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_2ADDR_notSpecial
8285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_check_neg1:
8288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_2ADDR_notSpecial
8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
8291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
8292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_2ADDR_notSpecial1
8294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_2ADDR_notSpecial1
8296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
8299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_2ADDR_finish
8300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */
8303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish:
8306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
8307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */
8312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish:
8315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
8316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */
8321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish:
8324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[AA+0]<- eax
8325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT_LIT16 */
8330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT16_continue_div:
8331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT16_finish_div:
8334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
8335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT_LIT16 */
8341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT16_continue_div:
8342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT16_finish_div:
8345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
8346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT_LIT8 */
8352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT8_continue_div:
8353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT8_finish_div:
8356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
8357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT_LIT8 */
8363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT8_continue_div:
8364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT8_finish_div:
8367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
8368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */
8374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_continue:
8376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Extract args, call function.
8378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = #of args (0-4)
8379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax = call index
8380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  @esp = return addr
8381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  esp is -4 from normal
8382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  Go ahead and load all 4 args, even if not used.
8384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rPC
8386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG0(%esp)
8392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG1(%esp)
8398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG2(%esp)
8404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG3(%esp)
8410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall      $4,%eax      # index *= sizeof(table entry)
8412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       *gDvmInlineOpsTable(%eax)
8413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # will return to caller of .LOP_EXECUTE_INLINE_continue
8414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
8417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterEnd
8418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterEnd:
8419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/entry.S */
8421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
8423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
8425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
8426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
8427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
8429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
8431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
8432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
8434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
8435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
8439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdRun
8440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdRun, %function
8441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * bool dvmMterpStdRun(MterpGlue* glue)
8443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point.  Returns changeInterp.
8445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun:
8448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebp
8449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,%ebp
8450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %edi
8451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %esi
8452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebx
8453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* at this point, stack is misaligned by 1 word
8455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   We're allocating spill space for 6 words, plus
8456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   outgoing argument (5 words) and local variables
8457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   (4 words) - 15 words or 60 bytes total. See
8458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   diagram in header.S
8459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
8460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl   $60,%esp
8461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Set up "named" registers */
8463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    IN_ARG0(%ebp),%ecx
8464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,rGLUE_SPILL(%ebp)
8465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FROM_GLUE(%ecx)
8466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_FP_FROM_GLUE(%ecx)
8467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $dvmAsmInstructionStart,rIBASE
8468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Remember %esp for future "longjmp" */
8470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,offGlue_bailPtr(%ecx)
8471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* How to start? */
8473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    offGlue_entryPoint(%ecx),%al
8474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Normal start? */
8476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $kInterpEntryInstr,%al
8477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .Lnot_instr
8478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   /* Normal case: start executing the instruction at rPC */
8480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
8481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_instr:
8484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Reset to normal case */
8485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb   $kInterpEntryInstr,offGlue_entryPoint(%ecx)
8486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb   $kInterpEntryReturn,%al
8487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     common_returnFromMethod
8488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb   $kInterpEntryThrow,%al
8489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     common_exceptionThrown
8490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx  %al,%eax
8491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %eax,OUT_ARG1(%esp)
8492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   $.LstrBadEntryPoint,OUT_ARG0(%esp)
8493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call   printf
8494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call   dvmAbort
8495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Not reached */
8496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdBail
8499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdBail, %function
8500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * void dvmMterpStdBail(MterpGlue* glue, bool changeInterp)
8502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
8504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
8505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
8506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We're not going to build a standard frame here, so the arg accesses will
8508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * look a little strange.
8509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  esp+4 (arg0)  MterpGlue* glue
8512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  esp+8 (arg1)  bool changeInterp
8513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail:
8515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    4(%esp),%ecx                 # grab glue
8516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    8(%esp),%eax                 # changeInterp to return reg
8517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_bailPtr(%ecx),%esp   # Stack back to normal
8518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl    $60,%esp                    # Strip dvmMterpStdRun's frame
8519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebx
8520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %esi
8521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %edi
8522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebp
8523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret                                  # return to dvmMterpStdRun's caller
8524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings
8528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section    .rodata
8530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint:
8531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Bad entry point %d\n"
8532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/footer.S */
8534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
8536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
8538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
8539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
8540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
8542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
8544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
8545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
8547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
8548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common subroutines and data.
8551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backwards branch is taken
8555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ebx (a.k.a. rINST_FULL) -> PC adjustment in 16-bit words
8558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch:
8560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8561c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    call   common_periodicChecks  # Note: expects rPC to be preserved
8562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
8563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
8564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8566c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8567c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8568c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch/*
8569c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch * Common code for method invocation with range.
8570c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *
8571c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch * On entry:
8572c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *   eax = Method* methodToCall
8573c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *   rINST trashed, must reload
8574c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch */
8575c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8576c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birchcommon_invokeMethodRange:
8577c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNewRange:
8578c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8579c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8580c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * prepare to copy args to "outs" area of current frame
8581c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8582c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8583c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- AA
8584c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      4(rPC), %ecx            # %ecx<- CCCC
8585c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SPILL(rPC)
8586c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
8587c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    test        rINST_FULL, rINST_FULL
8588c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- AA
8589c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jz          .LinvokeArgsDone        # no args; jump to args done
8590c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8591c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8592c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8593c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, %ecx=CCCC, LOCAL0_OFFSET(%ebp)=count, %edx=&outs (&stackSaveArea)
8594c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * (very few methods have > 10 args; could unroll for common cases)
8595c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8596c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8597c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ebx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- save %ebx
8598c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         (rFP, %ecx, 4), %ecx    # %ecx<- &vCCCC
8599c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shll        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
8600c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        LOCAL0_OFFSET(%ebp), %edx       # %edx<- update &outs
8601c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shrl        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
8602c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch1:
8603c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (%ecx), %ebx            # %ebx<- vCCCC
8604c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%ecx), %ecx           # %ecx<- &vCCCC++
8605c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        $1, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET<- LOCAL0_OFFSET--
8606c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ebx, (%edx)            # *outs<- vCCCC
8607c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%edx), %edx           # outs++
8608c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         1b                      # loop if count (LOCAL0_OFFSET(%ebp)) not zero
8609c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ebx       # %ebx<- restore %ebx
8610c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp         .LinvokeArgsDone        # continue
8611c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8612c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8613c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax is "Method* methodToCall", the method we're trying to call
8614c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * prepare to copy args to "outs" area of current frame
8615c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8616c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8617c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birchcommon_invokeMethodNoRange:
8618c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNewNoRange:
8619c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- BA
8620c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SPILL(rPC)
8621c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BA
8622c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shrl        $4, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- B
8623c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          .LinvokeArgsDone        # no args; jump to args done
8624c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      4(rPC), %ecx            # %ecx<- GFED
8625c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
8626c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8627c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8628c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, %ecx=GFED, LOCAL0_OFFSET(%ebp)=count, %edx=outs
8629c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8630c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8631c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNonRange:
8632c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $2, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 2
8633c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- GFED
8634c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          1f                      # handle 1 arg
8635c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          2f                      # handle 2 args
8636c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $4, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 4
8637c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          3f                      # handle 3 args
8638c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          4f                      # handle 4 args
8639c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch5:
8640c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    andl        $15, rINST_FULL        # rINST<- A
8641c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8642c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, rINST_FULL, 4), %ecx # %ecx<- vA
8643c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vA
8644c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8645c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch4:
8646c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $12, %ecx              # %ecx<- G
8647c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8648c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vG
8649c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vG
8650c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8651c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch3:
8652c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x0f00, %ecx          # %ecx<- 0F00
8653c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $8, %ecx               # %ecx<- F
8654c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8655c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vF
8656c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vF
8657c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8658c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch2:
8659c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x00f0, %ecx          # %ecx<- 00E0
8660c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $4, %ecx               # %ecx<- E
8661c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8662c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vE
8663c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vE
8664c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8665c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch1:
8666c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x000f, %ecx          # %ecx<- 000D
8667c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vD
8668c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, -4(%edx)          # *--outs<- vD
8669c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch0:
8670c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8671c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8672c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax is "Method* methodToCall", the method we're trying to call
8673c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * find space for the new stack frame, check for overflow
8674c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8675c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8676c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeArgsDone:
8677c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      offMethod_registersSize(%eax), %edx # %edx<- methodToCall->regsSize
8678c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      offMethod_outsSize(%eax), %ecx # %ecx<- methodToCall->outsSize
8679c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, LOCAL0_OFFSET(%ebp)       # LOCAL0_OFFSET<- methodToCall
8680c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shl         $2, %edx               # %edx<- update offset
8681c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%eax,rFP)          # %eax<- &StackSaveArea
8682c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        %edx, %eax              # %eax<- newFP; (old savearea - regsSize)
8683c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%edx)                      # %edx<- pMterpGlue
8684c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- &outs
8685c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        $sizeofStackSaveArea, %eax # %eax<- newSaveArea (stack save area using newFP)
8686c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_interpStackEnd(%edx), %edx # %edx<- glue->interpStackEnd
8687c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, LOCAL2_OFFSET(%ebp)       # LOCAL2_OFFSET<- glue->interpStackEnd
8688c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shl         $2, %ecx               # %ecx<- update offset for outsSize
8689c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, %edx              # %edx<- newSaveArea
8690c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    sub         %ecx, %eax              # %eax<- bottom; (newSaveArea - outsSize)
8691c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         LOCAL2_OFFSET(%ebp), %eax       # compare interpStackEnd and bottom
8692c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL0_OFFSET(%ebp), %eax       # %eax<- restore methodToCall
8693c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          .LstackOverflow         # handle frame overflow
8694c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8695c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8696c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * set up newSaveArea
8697c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8698c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8699c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch#ifdef EASY_GDB
8700c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%ecx,rFP)          # %ecx<- &StackSaveArea
8701c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, offStackSaveArea_prevSave(%edx) # newSaveArea->prevSave<- &outs
8702c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch#endif
8703c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offStackSaveArea_prevFrame(%edx) # newSaveArea->prevFrame<- rFP
8704c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rPC_SPILL(%ebp), %ecx
8705c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, offStackSaveArea_savedPc(%edx) # newSaveArea->savedPc<- rPC
8706c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    testl       $ACC_NATIVE, offMethod_accessFlags(%eax) # check for native call
8707c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, offStackSaveArea_method(%edx) # newSaveArea->method<- method to call
8708c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         .LinvokeNative          # handle native call
8709c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8710c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8711c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * Update "glue" values for the new method
8712c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFp
8713c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8714c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8715c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offMethod_clazz(%eax), %edx # %edx<- method->clazz
8716c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
8717c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex
8718c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, offGlue_method(%ecx) # glue->method<- methodToCall
8719c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, offGlue_methodClassDex(%ecx) # glue->methodClassDex<- method->clazz->pDvmDex
8720c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offMethod_insns(%eax), rPC # rPC<- methodToCall->insns
8721c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%ecx), %eax # %eax<- glue->self
8722c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
8723c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- newFP
8724c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    FETCH_INST()
8725c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GOTO_NEXT                           # jump to methodToCall->insns
8726c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8727c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8728c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * Prep for the native call
8729c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFP, %edx=newSaveArea
8730c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8731c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8732c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNative:
8733c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
8734c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
8735c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%ecx), %ecx        # %ecx<- glue->self
8736d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        offThread_jniLocal_topCookie(%ecx), %eax # %eax<- self->localRef->...
8737d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        %eax, offStackSaveArea_localRefCookie(%edx) # newSaveArea->localRefCookie<- top
8738c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, OUT_ARG4(%esp)    # save newSaveArea
8739c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %edx # %edx<- newFP
8740c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, offThread_curFrame(%ecx)  # glue->self->curFrame<- newFP
8741c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG3(%esp)    # save glue->self
8742c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG2(%esp)    # push parameter glue->self
8743c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
8744c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG1(%esp), %eax    # %eax<- methodToCall
8745c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         offGlue_retval(%ecx), %ecx # %ecx<- &retval
8746c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG0(%esp)    # push parameter pMterpGlue
8747c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    push        %edx                    # push parameter newFP
8748c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8749c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    call        *offMethod_nativeFunc(%eax) # call methodToCall->nativeFunc
8750c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%esp), %esp
8751c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG4(%esp), %ecx    # %ecx<- newSaveArea
8752c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG3(%esp), %eax    # %eax<- glue->self
8753d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        offStackSaveArea_localRefCookie(%ecx), %edx # %edx<- old top
8754c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $0, offThread_exception(%eax) # check for exception
8755c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- rFP
8756d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
8757c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    UNSPILL(rPC)
8758c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         common_exceptionThrown  # handle exception
8759c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    FETCH_INST_WORD(3)
8760c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    ADVANCE_PC(3)
8761c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GOTO_NEXT                           # jump to next instruction
8762c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
87636ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow:    # eax=methodToCall
87646ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
8765c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%eax)                      # %eax<- pMterpGlue
8766c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%eax), %eax # %eax<- glue->self
8767c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, OUT_ARG0(%esp)    # push parameter self
87686ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    call        dvmHandleStackOverflow  # call: (Thread* self, Method* meth)
8769c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    UNSPILL(rPC)                        # return: void
8770c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp         common_exceptionThrown  # handle exception
8771c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8772c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common invoke code (old-style).
8775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING:  Rewrite along lines of new armv5 code?
8776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   eax = Method* methodToCall
8779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ecx = bool methodCallRange
8780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   rINST trashed, must reload
8781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeOld:
8783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)     # arg1<- methodCallRange
8784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  (rPC),rINST_FULL         # recover rINST
8786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG2(%esp)     # arg2<- method
8787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   4(rPC),%eax             # eax<- GFED or CCCC
8788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
8789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
8790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
8791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,OUT_ARG3(%esp)# arg3<- AA
8792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)     # arg0<- GLUE
8793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG4(%esp)     # arg4<- GFED/CCCC
8794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmMterp_invokeMethod
8795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_resumeAfterGlueCall
8796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Do we need the thread to be suspended or have debugger/profiling activity?
8800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ebx  -> PC adjustment in 16-bit words (must be preserved)
8803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ecx  -> GLUE pointer
8804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: A call will normally kill %eax, rPC/%edx and %ecx.  To
8806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       streamline the normal case, this routine will preserve rPC and
8807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       %ecx in addition to the normal caller save regs.  The save/restore
8808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       is a bit ugly, but will happen in the relatively uncommon path.
8809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING: Might be worthwhile to inline this.
8810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: Basic-block style Jit will need a hook here as well.  Fold it into
8811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       the suspendCount check so we can get both in 1 shot.
8812c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * TODO: to match the other intepreters, this should handle suspension
8813c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *       and then check for debugger/profiling after dvmCheckSuspendPending
8814c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *       returns.
8815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks:
8817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_pSelfSuspendCount(%ecx),%eax    # eax <- &suspendCount
8818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $0,(%eax)
8819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     1f
8820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
8822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER)
8823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   offGlue_pDebuggerActive(%ecx),%eax      # eax <- &DebuggerActive
8824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_PROFILER)
8826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   offGlue_pActiveProfilers(%ecx),%ecx     # ecx <- &ActiveProfilers
8827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) && defined(WITH_PROFILER)
8829c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    # TODO: check for NULL before load
8830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
8831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    (%ecx),%eax             # eax <- debuggerActive || activeProfilers
8832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_DEBUGGER)
8833c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    # TODO: check for NULL before load
8834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
8835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_PROFILER)
8836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx),%eax             # eax <= activeProfilers
8837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)                 # restore rGLUE
8839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  %eax,%eax
8840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3f                      # one or both active - switch interp
8841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret
8844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Check for suspend */
8846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
8847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*  At this point, the return pointer to the caller of
8848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  common_periodicChecks is on the top of stack.  We need to preserve
8849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC(edx) and GLUE(ecx).  We'll spill rPC, and reload GLUE.
8850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  The outgoing profile is:
8851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      bool dvmCheckSuspendPending(Thread* self)
8852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  Because we reached here via a call, go ahead and build a new frame.
8853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
885499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         # need for precise GC
8855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%eax      # eax<- glue->self
8856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                      # save edx
8857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebp
8858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,%ebp
8859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl    $24,%esp
8860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmCheckSuspendPending
8862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl    $24,%esp
8863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebp
8864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret
8867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Switch interpreters */
8869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Note: %ebx contains the 16-bit word offset to be applied to rPC to
8870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "complete" the interpretation of backwards branches.  In effect, we
8871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * are completing the interpretation of the branch instruction here,
8872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and the new interpreter will resume interpretation at the branch
8873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * target. However, a switch request recognized during the handling
8874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * of a return from method instruction results in an immediate abort,
8875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and the new interpreter will resume by re-interpreting the return
8876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction.
8877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
8879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ebx,2),rPC       # adjust pc to show target
8880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)                 # bail expect GLUE already loaded
8881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $1,rINST_FULL         # set changeInterp to true
8882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_gotoBail
8883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction
8887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod:
8889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set entry mode in case we bail */
8891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    $kInterpEntryReturn,offGlue_entryPoint(%ecx)
8892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    rINST_FULL,rINST_FULL   # zero offset in case we switch interps
8893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    common_periodicChecks   # Note: expects %ecx to be preserved
8894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(%eax,rFP)                    # eax<- saveArea (old)
8896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offStackSaveArea_prevFrame(%eax),rFP  # rFP<- prevFrame
8897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST_FULL
8898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $0,rINST_FULL                        # break?
8899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_gotoBail    # break frame, bail out completely
8900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offStackSaveArea_savedPc(%eax),rPC    # pc<- saveArea->savedPC
8902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%eax               # eax<- self
8903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,offGlue_method(%ecx)  # glue->method = newSave->meethod
8904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rFP,offThread_curFrame(%eax)     # self->curFrame = fp
8905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rINST_FULL),%eax # eax<- method->clazz
8906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
8907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_pDvmDex(%eax),%eax # eax<- method->clazz->pDvmDex
8908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
8909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_methodClassDex(%ecx)
8910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* not bailing - restore entry mode to default */
8911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    $kInterpEntryInstr,offGlue_entryPoint(%ecx)
8912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Prepare to strip the current frame and "longjump" back to caller of
8916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dvmMterpStdRun.
8917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on entry:
8919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    rINST_FULL holds changeInterp
8920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    ecx holds glue pointer
8921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected profile: dvmMterpStdBail(MterpGlue *glue, bool changeInterp)
8923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail:
8925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)                # export state to glue
8926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
8927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,OUT_ARG0(%esp)           # glue in arg0
8928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   rINST_FULL,OUT_ARG1(%esp)     # changeInterp in arg1
8929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmMterpStdBail              # bail out....
8930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated values
8934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and start executing at the next instruction.
8935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project common_resumeAfterGlueCall:
8937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
8938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     LOAD_PC_FROM_GLUE(%ecx)
8939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     LOAD_FP_FROM_GLUE(%ecx)
8940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     FETCH_INST()
8941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GOTO_NEXT
8942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero
8945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero:
8947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrArithmeticException,%eax
8949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrDivideByZero,%eax
8951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
8956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
8959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize:
8961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrNegativeArraySizeException,%eax
8963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
8965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
8970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
8973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod:
8975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrNoSuchMethodError,%eax
8978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
8980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
8985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Hit a null object when we weren't expecting one.  Export the PC, throw a
8988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NullPointerException and goto the exception processing code.
8989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject:
8991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrNullPointerException,%eax
8993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
8995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
9000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array index exceeds max.
9003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex:
9005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrArrayIndexException,%eax
9007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
9008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
9009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
9010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
9011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
9012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
9013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
9014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value.
9016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore:
9018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrArrayStoreException,%eax
9020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
9021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
9022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
9023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
9024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
9025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
9026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
9027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception.  Handle it.
9030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling
9032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
9033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be.
9034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
9036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown:
9038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
9039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
9040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
9041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
9042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmMterp_exceptionThrown
9043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_resumeAfterGlueCall
9044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort:
9046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0xdeadf00d,%eax
9047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     *%eax
9048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings
9052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section     .rodata
9055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException:
9056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz    "Ljava/lang/NullPointerException;"
9057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException:
9058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArithmeticException;"
9059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero:
9060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "divide by zero"
9061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException:
9062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
9063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException:
9064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayStoreException;"
9065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException:
9066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NegativeArraySizeException;"
9067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError:
9068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InstantiationError;"
9069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException:
9070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ClassCastException;"
9071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError:
9072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NoSuchMethodError;"
9073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError:
9074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InternalError;"
9075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl:
9076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "filled-new-array only implemented for 'int'"
9077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9079