InterpAsm-x86.S revision 3d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952
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    .global dvmAsmInstructionStart
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmInstructionStart, %function
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOP: /* 0x00 */
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NOP.S */
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE: /* 0x01 */
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE.S */
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb   $0xf,%al             # eax<- A
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_FROM16.S */
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%eax            # eax <= AA
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     2(rPC),rINST             # rINST <= BBBB
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG (%ecx,rINST_FULL)        # ecx<- fp[BBBB]
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG (%ecx,%eax)              # fp[AA]<- ecx]
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_16.S */
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx              # ecx<- BBBB
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- AAAA
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_WIDE.S */
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide vA, vB */
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                # ecx <- BA
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL              # rinst_FULL<- B
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[B+0]
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[B+1]
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%cl                    # ecx <- A
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rINST_FULL,%ecx,1)       # v[A+1]<- rINST_FULL
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)             # v[A+0]<- eax
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_WIDE_FROM16.S */
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/from16 vAA, vBBBB */
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx              # ecx<- BBBB
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax            # eax<- AAAA
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0)   # rINST_FULL<- v[BBBB+0]
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[BBBB+1]
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rINST_FULL,%eax,0)   # v[AAAA+0]<- rINST_FULL
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,%eax,1)         # v[AAAA+1]<- eax
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_WIDE_16.S */
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/16 vAAAA, vBBBB */
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx            # ecx<- BBBB
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax            # eax<- AAAA
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0) # rINST_WORD<- v[BBBB+0]
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)       # ecx<- v[BBBB+1]
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rINST_FULL,%eax,0) # v[AAAA+0]<- rINST_FULL
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,%eax,1)       # v[AAAA+1]<- ecx
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_OBJECT.S */
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE.S */
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb   $0xf,%al             # eax<- A
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_OBJECT_FROM16.S */
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_FROM16.S */
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%eax            # eax <= AA
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     2(rPC),rINST             # rINST <= BBBB
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG (%ecx,rINST_FULL)        # ecx<- fp[BBBB]
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG (%ecx,%eax)              # fp[AA]<- ecx]
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_OBJECT_16.S */
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_16.S */
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx              # ecx<- BBBB
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- AAAA
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_RESULT.S */
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)                         # eax<- rGLUE
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx                 # ecx<- AA
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_retval(%eax),%eax     # eax<- glue->retval.l
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG (%eax,%ecx)                   # fp[AA]<- retval.l
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_RESULT_WIDE.S */
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-result-wide vAA */
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_retval(%ecx),%eax
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    4+offGlue_retval(%ecx),%ecx
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)    # v[AA+0] <- eax
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)    # v[AA+1] <- ecx
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_RESULT_OBJECT.S */
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_RESULT.S */
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)                         # eax<- rGLUE
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx                 # ecx<- AA
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_retval(%eax),%eax     # eax<- glue->retval.l
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG (%eax,%ecx)                   # fp[AA]<- retval.l
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE_EXCEPTION.S */
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-exception vAA */
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%ecx    # ecx<- glue->self
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offThread_exception(%ecx),%eax # eax<- dvmGetException bypass
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)          # fp[AA]<- exception object
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,offThread_exception(%ecx) # dvmClearException bypass
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN_VOID.S */
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_returnFromMethod
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN: /* 0x0f */
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN.S */
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)   # retval.i <- AA
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_returnFromMethod
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_WIDE: /* 0x10 */
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN_WIDE.S */
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 64-bit value.  Copies the return value into the "glue"
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* return-wide vAA */
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL            # rINST_FULL<- AA
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[AA+0]
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[AA+1]
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,4+offGlue_retval(%ecx)
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_returnFromMethod
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN_OBJECT.S */
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RETURN.S */
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)   # retval.i <- AA
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_returnFromMethod
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_4: /* 0x12 */
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_4.S */
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/4 vA, #+B */
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsx   rINST_HI,%eax              # eax<-ssssssBx
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0xf,%ecx
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl    %eax,%ecx                  # ecx<- A
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%eax
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_16: /* 0x13 */
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_16.S */
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/16 vAA, #+BBBB */
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl  2(rPC),%ecx                # ecx<- ssssBBBB
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%eax              # eax<- AA
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)                # vAA<- ssssBBBB
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST: /* 0x14 */
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST.S */
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const vAA, #+BBBBbbbb */
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- AA
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      2(rPC),%eax               # grab all 32 bits at once
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                 # vAA<- eax
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_HIGH16.S */
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/high16 vAA, #+BBBB0000 */
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                # eax<- 0000BBBB
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl     rINST_HI,%ecx              # ecx<- AA
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall       $16,%eax                  # eax<- BBBB0000
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                   # vAA<- eax
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_16: /* 0x16 */
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_WIDE_16.S */
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/16 vAA, #+BBBB */
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl    2(rPC),%eax               # eax<- ssssBBBB
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- AA
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd                                # rPC:eax<- ssssssssssssBBBB
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)           # store msw
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_WIDE_32.S */
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/32 vAA, #+BBBBbbbb */
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     2(rPC),%eax               # eax<- BBBBbbbb
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- AA
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd                                # rPC:eax<- ssssssssssssBBBB
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)           # store msw
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_WIDE.S */
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      2(rPC),%eax         # eax<- lsw
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx       # ecx <- AA
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      6(rPC),rINST_FULL   # rINST_FULL<- msw
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%ecx,4),%ecx   # dst addr
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,4(%ecx)
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(5)
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(%ecx)
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(5)
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_WIDE_HIGH16.S */
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/high16 vAA, #+BBBB000000000000 */
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                # eax<- 0000BBBB
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl     rINST_HI,%ecx              # ecx<- AA
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall       $16,%eax                  # eax<- BBBB0000
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,1)            # v[AA+1]<- eax
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl       %eax,%eax
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)            # v[AA+0]<- eax
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_STRING.S */
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBB */
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # resolved yet?
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CONST_STRING_resolve
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_STRING_JUMBO.S */
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBBBBBB */
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      2(rPC),%eax              # eax<- BBBBBBBB
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # resolved yet?
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CONST_STRING_JUMBO_resolve
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CONST_CLASS.S */
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/class vAA, Class@BBBB */
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- dvmDex->pResClasses
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- rResClasses[BBBB]
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # resolved yet?
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CONST_CLASS_resolve
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                # vAA<- rResClasses[BBBB]
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MONITOR_ENTER.S */
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Synchronize on an object.
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-enter vAA */
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # null object?
67899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         # need for precise GC, MONITOR_TRACKING
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_MONITOR_ENTER_continue
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errNullObject
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MONITOR_EXIT.S */
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlock an object.
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exceptions that occur when unlocking a monitor need to appear as
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if they happened at the following instruction.  See the Dalvik
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction spec.
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-exit vAA */
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # null object?
699668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    je      .LOP_MONITOR_EXIT_errNullObject   # go if so
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_MONITOR_EXIT_continue
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CHECK_CAST.S */
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if a cast from one class to another is allowed.
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* check-cast vAA, class@BBBB */
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA (object)
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # is oject null?
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CHECK_CAST_okay          # null obj, cast always succeeds
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved class
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # have we resolved this before?
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_CHECK_CAST_resolve       # no, go do it now
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolved:
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      %eax,%ecx                 # same class (trivial success)?
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_CHECK_CAST_fullcheck     # no, do full check
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_okay:
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INSTANCE_OF.S */
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if an object reference is an instance of a class.
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Most common situation is a non-null object, being compared against
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an already-resolved class.
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* instance-of vA, vB, class@CCCC */
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%eax               # eax<- BA
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%eax                    # eax<- B
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # object null?
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      .LOP_INSTANCE_OF_store           # null obj, not instance, store it
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rPC                  # rPC<- CCCC
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%ecx,rPC,4),%ecx           # ecx<- resolved class
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                   # have we resolved this before?
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      .LOP_INSTANCE_OF_resolve         # not resolved, do it now
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolved:  # eax<- obj->clazz, ecx<- resolved class
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    %eax,%ecx                   # same class (trivial success)?
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      .LOP_INSTANCE_OF_trivial         # yes, trivial finish
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_INSTANCE_OF_fullcheck       # no, do full check
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ARRAY_LENGTH.S */
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the length of an array.
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   movzbl   rINST_HI,%eax              # eax<- BA
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   sarl     $12,rINST_FULL            # rINST_FULL<- B
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   GET_VREG(%ecx,rINST_FULL)           # ecx<- vB (object ref)
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   andb     $0xf,%al                  # eax<- A
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   testl    %ecx,%ecx                  # is null?
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   je       common_errNullObject
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   FETCH_INST_WORD(1)
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   movl     offArrayObject_length(%ecx),%ecx
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   ADVANCE_PC(1)
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   SET_VREG(%ecx,%eax)
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   GOTO_NEXT
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEW_INSTANCE.S */
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new instance of a class.
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-instance vAA, class@BBBB */
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved class
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # resolved?
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_NEW_INSTANCE_resolve       # no, go do it
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolved:  # on entry, ecx<- class
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb      $CLASS_INITIALIZED,offClassObject_status(%ecx)
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_NEW_INSTANCE_initialized
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_NEW_INSTANCE_needinit
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEW_ARRAY.S */
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Allocate an array of objects, specified with the array class
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and a count.
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The verifier guarantees that this is an array class, so we don't
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * check for it here.
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-array vA, vB, class@CCCC */
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                       # eax<- CCCC
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResClasses(%ecx),%ecx  # ecx<- pDvmDex->pResClasses
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%ecx,%eax,4),%ecx                # ecx<- resolved class
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%eax
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%eax                          # eax<- B
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                       # eax<- vB (array length)
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                    # rINST_FULL<- A
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js      common_errNegativeArraySize       # bail
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                         # already resolved?
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_NEW_ARRAY_finish                # yes, fast path
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_NEW_ARRAY_resolve               # resolve now
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FILLED_NEW_ARRAY.S */
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL               # rINST_FULL<- AA or BA
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%eax),%eax # eax<- pDvmDex
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                       # ecx<- BBBB
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax                # eax<- resolved class
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # already resolved?
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_FILLED_NEW_ARRAY_continue              # yes, continue
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # less frequent path, so we'll redo some work
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)                # arg2<- false
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%eax),%eax         # eax<- glue->method
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_FILLED_NEW_ARRAY_more
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FILLED_NEW_ARRAY_RANGE.S */
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FILLED_NEW_ARRAY.S */
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL               # rINST_FULL<- AA or BA
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%eax),%eax # eax<- pDvmDex
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                       # ecx<- BBBB
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax                # eax<- resolved class
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # already resolved?
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_FILLED_NEW_ARRAY_RANGE_continue              # yes, continue
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # less frequent path, so we'll redo some work
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)                # arg2<- false
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%eax),%eax         # eax<- glue->method
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_FILLED_NEW_ARRAY_RANGE_more
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FILL_ARRAY_DATA.S */
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fill-array-data vAA, +BBBBBBBB */
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    2(rPC),%ecx                # ecx<- BBBBbbbb
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ecx,2),%ecx          # ecx<- PC + BBBBbbbb*2
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInterpHandleFillArrayData
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # exception thrown?
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_THROW: /* 0x27 */
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_THROW.S */
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception object in the current thread.
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* throw vAA */
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
9238ba2708ea118381f2df5ca55b9bad2ae4c050504Andy McFadden    EXPORT_PC()
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL       # rINST_FULL<- AA
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)          # eax<- exception object
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_self(%ecx),%ecx   # ecx<- glue->self
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # null object?
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errNullObject
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,offThread_exception(%ecx) # thread->exception<- obj
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO: /* 0x28 */
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_GOTO.S */
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 8-bit offset.
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto +AA */
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl  rINST_HI,rINST_FULL         # ebx<- ssssssAA
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rINST_FULL,rINST_FULL       # test for <0
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js      common_backwardBranch
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_GOTO_16.S */
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 16-bit offset.
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/16 +AAAA */
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl  2(rPC),rINST_FULL           # rINST_FULL<- ssssAAAA
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rINST_FULL,rINST_FULL       # test for <0
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js      common_backwardBranch
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_GOTO_32.S */
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 32-bit offset.
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset.
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most opcodes, this one is allowed to branch to itself, so
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * our "backward branch" test must be "<=0" instead of "<0".
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/32 AAAAAAAA */
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    2(rPC),rINST_FULL           # rINST_FULL<- AAAAAAAA
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $0,rINST_FULL              # test for <= 0
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle     common_backwardBranch
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_PACKED_SWITCH.S */
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInterpHandlePackedSwitch
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,rINST_FULL             # set up word offset
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle     common_backwardBranch       # check on special actions
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPARSE_SWITCH.S */
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_PACKED_SWITCH.S */
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInterpHandleSparseSwitch
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,rINST_FULL             # set up word offset
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle     common_backwardBranch       # check on special actions
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPL_FLOAT.S */
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %ecx,%ecx
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%eax
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_CMPL_FLOAT_isNaN
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_CMPL_FLOAT_finish
1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl     %ecx,%ecx
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb       .LOP_CMPL_FLOAT_finish
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    incl     %ecx
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_finish:
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */
1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_FLOAT.S */
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %ecx,%ecx
1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%eax
1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_CMPG_FLOAT_isNaN
1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_CMPG_FLOAT_finish
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl     %ecx,%ecx
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb       .LOP_CMPG_FLOAT_finish
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    incl     %ecx
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_finish:
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPL_DOUBLE.S */
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)
1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)
1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %ecx,%ecx
1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%eax
1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_CMPL_DOUBLE_isNaN
1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_CMPL_DOUBLE_finish
1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl     %ecx,%ecx
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb       .LOP_CMPL_DOUBLE_finish
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    incl     %ecx
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_finish:
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)
1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)
1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)
1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)
1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %ecx,%ecx
1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%eax
1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_CMPG_DOUBLE_isNaN
1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_CMPG_DOUBLE_finish
1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl     %ecx,%ecx
1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb       .LOP_CMPG_DOUBLE_finish
1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    incl     %ecx
1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_finish:
1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */
1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_CMP_LONG.S */
1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * register based on the results of the comparison.
1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* cmp-long vAA, vBB, vCC */
1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),rPC               # rPC<- CC
1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,1)         # eax<- v[BB+1]
1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,0)         # ecx<- v[BB+0]
1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      4(rFP,rPC,4),%eax
1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jl        .LOP_CMP_LONG_smaller
1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jg        .LOP_CMP_LONG_bigger
1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub       (rFP,rPC,4),%ecx
1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ja        .LOP_CMP_LONG_bigger
1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb        .LOP_CMP_LONG_smaller
1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMP_LONG_finish
1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */
1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_EQ.S */
1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne   1f
1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NE: /* 0x33 */
1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_NE.S */
1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je   1f
1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LT: /* 0x34 */
1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_LT.S */
1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jge   1f
1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GE: /* 0x35 */
1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_GE.S */
1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jl   1f
1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GT: /* 0x36 */
1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_GT.S */
1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle   1f
1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LE: /* 0x37 */
1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_LE.S */
1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bincmp.S */
1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                   # assume not taken
1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jg   1f
1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */
1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_EQZ.S */
1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne   1f
1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */
1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_NEZ.S */
1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je   1f
1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LTZ: /* 0x3a */
1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_LTZ.S */
1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jge   1f
1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GEZ: /* 0x3b */
1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_GEZ.S */
1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jl   1f
1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */
1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_GTZ.S */
1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jle   1f
1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */
1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IF_LEZ.S */
1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/zcmp.S */
1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jg   1f
1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rINST_FULL,rINST_FULL
1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    js       common_backwardBranch
1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%eax
1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_INDEXED(%eax)
1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */
1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_3E.S */
1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */
1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_3F.S */
1566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */
1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_40.S */
1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */
1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_41.S */
1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */
1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_42.S */
1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */
1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_43.S */
1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET: /* 0x44 */
1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offArrayObject_contents(%eax,%ecx,4),%eax
1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */
1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_WIDE.S */
1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 64 bits.  vAA <- vBB[vCC].
1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb        .LOP_AGET_WIDE_finish        # index < length, OK
1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errArrayIndex      # index >= length, bail
1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */
1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_OBJECT.S */
1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offArrayObject_contents(%eax,%ecx,4),%eax
1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */
1679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_BOOLEAN.S */
1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl     offArrayObject_contents(%eax,%ecx,1),%eax
1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */
1707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_BYTE.S */
1708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl     offArrayObject_contents(%eax,%ecx,1),%eax
1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */
1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_CHAR.S */
1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     offArrayObject_contents(%eax,%ecx,2),%eax
1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */
1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET_SHORT.S */
1764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AGET.S */
1765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl     offArrayObject_contents(%eax,%ecx,2),%eax
1781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,%ecx
1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
1784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT: /* 0x4b */
1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,4),%eax
1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,(%eax)
1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */
1817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_WIDE.S */
1818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 64 bits.  vBB[vCC]<-vAA.
1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb        .LOP_APUT_WIDE_finish        # index < length, OK
1832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errArrayIndex      # index >= length, bail
1833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */
1837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_OBJECT.S */
1838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA
1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jb        .LOP_APUT_OBJECT_continue
1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errArrayIndex      # index >= length, bail
1855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */
1859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_BOOLEAN.S */
1860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,1),%eax
1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     %cl,(%eax)
1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */
1887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_BYTE.S */
1888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,1),%eax
1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     %cl,(%eax)
1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */
1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_CHAR.S */
1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,2),%eax
1933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %cx,(%eax)
1936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */
1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT_SHORT.S */
1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_APUT.S */
1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null array object?
1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # bail if so
1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,2),%eax
1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
1962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %cx,(%eax)
1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
1966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET: /* 0x52 */
1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_finish                    # no, already resolved
1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_resolve
1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */
1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_WIDE.S */
1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit instance field get.
2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_WIDE_finish                    # no, already resolved
2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_WIDE_resolve
2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */
2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_OBJECT.S */
2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_OBJECT_finish                    # no, already resolved
2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_OBJECT_resolve
2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */
2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_BOOLEAN.S */
2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BOOLEAN_finish                    # no, already resolved
2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_BOOLEAN_resolve
2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */
2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_BYTE.S */
2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BYTE_finish                    # no, already resolved
2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_BYTE_resolve
2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */
2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_CHAR.S */
2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_CHAR_finish                    # no, already resolved
2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_CHAR_resolve
2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */
2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_SHORT.S */
2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET.S */
2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_SHORT_finish                    # no, already resolved
2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IGET_SHORT_resolve
2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT: /* 0x59 */
2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_finish                    # no, already resolved
2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_resolve
2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */
2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_WIDE.S */
2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit instance field put.
2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_WIDE_finish                    # no, already resolved
2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_WIDE_resolve
2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */
2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_OBJECT.S */
2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
22253d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * Object field put.
2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
22273d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: iput-object
2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_OBJECT_finish                    # no, already resolved
2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_OBJECT_resolve
2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */
2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_BOOLEAN.S */
2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BOOLEAN_finish                    # no, already resolved
2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_BOOLEAN_resolve
2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */
2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_BYTE.S */
2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BYTE_finish                    # no, already resolved
2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_BYTE_resolve
2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */
2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_CHAR.S */
2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_CHAR_finish                    # no, already resolved
2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_CHAR_resolve
2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */
2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_SHORT.S */
2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_SHORT_finish                    # no, already resolved
2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_SHORT_resolve
2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */
2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_resolve                # if not, make it so
2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish:     # field ptr in eax
2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */
2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_WIDE.S */
2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SGET handler.
2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sget-wide vAA, field@BBBB */
2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_WIDE_resolve                # if not, make it so
2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish:     # field ptr in eax
2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%ecx    # ecx<- lsw
2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4+offStaticField_value(%eax),%eax  # eax<- msw
2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL                # rINST_FULL<- AA
2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
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_OBJECT: /* 0x62 */
2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_OBJECT.S */
2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_OBJECT_resolve                # if not, make it so
2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish:     # field ptr in eax
2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */
2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_BOOLEAN.S */
2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_BOOLEAN_resolve                # if not, make it so
2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish:     # field ptr in eax
2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */
2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_BYTE.S */
2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_BYTE_resolve                # if not, make it so
2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish:     # field ptr in eax
2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */
2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_CHAR.S */
2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_CHAR_resolve                # if not, make it so
2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish:     # field ptr in eax
2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */
2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_SHORT.S */
2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_SHORT_resolve                # if not, make it so
2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish:     # field ptr in eax
2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */
2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
25603d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-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_SPUT_resolve                # if not, make it so
2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_finish:     # field ptr in eax
2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */
2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_WIDE.S */
2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_WIDE_resolve                # if not, make it so
2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_finish:     # field ptr in eax
2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0)             # rINST_FULL<- lsw
2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)                   # ecx<- msw
2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,offStaticField_value(%eax)
2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+offStaticField_value(%eax)
2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */
2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_OBJECT.S */
2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
26103d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * SPUT object handler.
2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
26173d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField
2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_OBJECT_resolve                # if not, make it so
2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_finish:     # field ptr in eax
2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
26233d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp       .LOP_SPUT_OBJECT_continue
2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */
2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_BOOLEAN.S */
2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
26333d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_BOOLEAN_resolve                # if not, make it so
2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish:     # field ptr in eax
2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */
2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_BYTE.S */
2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
26603d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_BYTE_resolve                # if not, make it so
2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish:     # field ptr in eax
2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */
2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_CHAR.S */
2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
26873d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_CHAR_resolve                # if not, make it so
2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish:     # field ptr in eax
2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */
2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_SHORT.S */
2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
27143d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_SHORT_resolve                # if not, make it so
2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish:     # field ptr in eax
2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */
2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL.S */
2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx                 # ecx<- BBBB
2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # already resolved?
2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_continue        # yes, continue
2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%eax),%eax   # eax<- glue->method
2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_VIRTUAL_more
2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */
2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER.S */
2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rINST_FULL)
2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(rINST_FULL),%eax # eax<- method
2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # null "this"?
2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yes, throw
2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # already resolved?
2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_SUPER_continue      # yes - go on
2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_SUPER_resolve
2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */
2792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT.S */
2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # already resolved?
2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_INVOKE_DIRECT_resolve      # not resolved, do it now
2819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish:
2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                # null "this"?
2822c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange  # no, continue on
2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errNullObject
2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */
2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_STATIC.S */
2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax
2843c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange
2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
2846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax
2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
2848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
2850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_STATIC_continue
2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */
2855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE.S */
2856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if        (!0)
2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl       $0xf,%eax               # eax<- C (or stays CCCC)
2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax                # null this?
2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_errNullObject     # yes, fail
2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
2873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_methodClassDex(%ecx),%eax   # eax<- methodClassDex
2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_method(%ecx),%ecx           # ecx<- method
2876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                         # eax<- BBBB
2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp        .LOP_INVOKE_INTERFACE_continue
2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */
2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_73.S */
2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_RANGE.S */
2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL.S */
2896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
2899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
2901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx                 # ecx<- BBBB
2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # already resolved?
2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # yes, continue
2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%eax),%eax   # eax<- glue->method
2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_VIRTUAL_RANGE_more
2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_RANGE.S */
2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER.S */
2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rINST_FULL)
2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
2936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(rINST_FULL),%eax # eax<- method
2938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # null "this"?
2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yes, throw
2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # already resolved?
2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_SUPER_RANGE_continue      # yes - go on
2948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_SUPER_RANGE_resolve
2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT_RANGE.S */
2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT.S */
2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
2963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
2965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # already resolved?
2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_INVOKE_DIRECT_RANGE_resolve      # not resolved, do it now
2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish:
2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                # null "this"?
2985c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange  # no, continue on
2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errNullObject
2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_STATIC_RANGE.S */
2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_STATIC.S */
2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/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    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
3007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax
3008c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange
3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
3010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax
3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_STATIC_RANGE_continue
3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE_RANGE.S */
3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE.S */
3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if        (!1)
3033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl       $0xf,%eax               # eax<- C (or stays CCCC)
3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
3036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
3037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax                # null this?
3038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_errNullObject     # yes, fail
3039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
3041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_methodClassDex(%ecx),%eax   # eax<- methodClassDex
3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_method(%ecx),%ecx           # ecx<- method
3043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
3044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                         # eax<- BBBB
3045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
3046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
3047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp        .LOP_INVOKE_INTERFACE_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_UNUSED_79: /* 0x79 */
3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_79.S */
3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */
3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_7A.S */
3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
3064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */
3070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_INT.S */
3071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
30837365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
30847365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    negl %eax
3086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */
3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NOT_INT.S */
3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
31067365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
31077365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    notl %eax
3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */
3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_LONG.S */
3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx            # ecx<- BA
3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                 # ecx<- B
3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO           # rINST_FULL<- A
3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    negl      %eax
3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl      $0,%ecx
3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    negl      %ecx
3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */
3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NOT_LONG.S */
3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx            # ecx<- BA
3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                 # ecx<- B
3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO           # rINST_FULL<- A
3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    notl      %eax
3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    notl      %ecx
3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */
3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_FLOAT.S */
3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,rINST_FULL,4)      # %st0<- vB
3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fchs
3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */
3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_DOUBLE.S */
3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fchs
3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */
3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_LONG.S */
3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* int to long vA, vB */
3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- +A
3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # will step on edx later
3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd                                # edx:eax<- sssssssBBBBBBBB
3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)          # v[A+1]<- edx/rPC
3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # v[A+0]<- %eax
3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */
3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_FLOAT.S */
3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
32257365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */
3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_DOUBLE.S */
3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
32457365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */
3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_LONG_TO_INT.S */
3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */
3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE.S */
3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb   $0xf,%al             # eax<- A
3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */
3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_LONG_TO_FLOAT.S */
3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
32837365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_LONG_TO_DOUBLE.S */
3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
33037365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */
3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FLOAT_TO_INT.S */
3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_FLOAT_TO_INT_continue
3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */
3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FLOAT_TO_LONG.S */
3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_FLOAT_TO_LONG_continue
3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FLOAT_TO_DOUBLE.S */
3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop 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    flds    (rFP,rINST_FULL,4)      # %st0<- vB
3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
33977365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */
3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DOUBLE_TO_INT.S */
3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DOUBLE_TO_INT_continue
3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DOUBLE_TO_LONG.S */
3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DOUBLE_TO_LONG_continue
3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DOUBLE_TO_FLOAT.S */
3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop 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    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
34917365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */
3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_BYTE.S */
3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
35127365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
35137365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl %al,%eax
3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */
3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_CHAR.S */
3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
35357365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
35367365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl %ax,%eax
3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */
3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_SHORT.S */
3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
35587365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
35597365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl %ax,%eax
3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */
3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT.S */
3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */
3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_INT.S */
3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */
3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT.S */
3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary multiplication.
3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul vAA, vBB, vCC */
3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull    (rFP,%ecx,4),%eax      # trashes rPC/edx
3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # ecx<- AA
3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */
3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT.S */
3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv.S */
3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_continue_div
3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_continue_div
3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_finish_div
3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */
3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT.S */
3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv.S */
3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_continue_div
3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_continue_div
3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_finish_div
3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */
3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT.S */
3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */
3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT.S */
3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */
3746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT.S */
3747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */
3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_INT.S */
3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop1.S */
3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall    %cl,%eax                          # ex: addl    %ecx,%eax
3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */
3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_INT.S */
3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop1.S */
3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    %cl,%eax                          # ex: addl    %ecx,%eax
3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */
3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_INT.S */
3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop1.S */
3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl    %cl,%eax                          # ex: addl    %ecx,%eax
3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */
3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_LONG.S */
3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */
3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_LONG.S */
3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */
3890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_LONG.S */
3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply.
3893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We could definately use more free registers for
3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this code.  We must spill rPC (edx) because it
3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is used by imul.  We'll also spill rINST (ebx),
3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * giving us eax, ebc, ecx and edx as computational
3898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * temps.  On top of that, we'll spill rIBASE (edi)
3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for use as the vB pointer and rFP (esi) for use
3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as the vC pointer.  Yuck.
3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long vAA, vBB, vCC */
3903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- B
3904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx              # ecx<- C
3905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)
3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)
3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rINST_FULL)
3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[B]
3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%ecx,4),rFP         # rFP<- &v[C]
3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rIBASE),%ecx      # ecx<- Bmsw
3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rFP),%ecx          # ecx<- (Bmsw*Clsw)
3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rFP),%eax         # eax<- Cmsw
3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rIBASE),%eax       # eax<- (Cmsw*Blsw)
3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl      %eax,%ecx           # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (rFP),%eax          # eax<- Clsw
3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mull      (rIBASE)            # eax<- (Clsw*Alsw)
3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rINST_FULL)
3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_MUL_LONG_continue
3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */
3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG.S */
3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div vAA, vBB, vCC */
3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax              # eax<- CC
3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_check_zero
3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_check_neg1
3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_notSpecial:
3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_notSpecial1:
3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_continue
3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */
3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_LONG.S */
3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG.S */
3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div vAA, vBB, vCC */
3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax              # eax<- CC
3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_check_zero
3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_check_neg1
3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_notSpecial:
3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_notSpecial1:
3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_continue
3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */
3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_LONG.S */
3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
3989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
3990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
3993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */
4001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_LONG.S */
4002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
4003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
4012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
4013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
4014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */
4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_LONG.S */
4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
4043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */
4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_LONG.S */
4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
4059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * case specially.
4061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long vAA, vBB, vCC */
4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # spill edx
4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # ecx<- v[BB+1]
4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shldl     %eax,%edx
4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall      %cl,%eax
4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,%edx
4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %eax,%eax
4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- %edx
4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHL_LONG_finish
4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */
4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_LONG.S */
4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * case specially.
4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # spill edx
4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      %cl,%edx
4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $31,%edx
4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- edx
4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHR_LONG_finish
4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */
4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_LONG.S */
4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * case specially.
4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # spill edx
4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      %cl,%edx
4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %edx,%edx
4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[BB+1]<- edx
4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_USHR_LONG_finish
4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */
4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_FLOAT.S */
4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fadds   (rFP,%ecx,4)           # ex: faddp
4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */
4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_FLOAT.S */
4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubs   (rFP,%ecx,4)           # ex: faddp
4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */
4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_FLOAT.S */
4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmuls   (rFP,%ecx,4)           # ex: faddp
4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */
4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_FLOAT.S */
4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivs   (rFP,%ecx,4)           # ex: faddp
4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */
4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_FLOAT.S */
4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float vAA, vBB, vCC */
4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)           # vCC to fp stack
4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)           # vCC to fp stack
4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)           # %st to vAA
4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */
4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_DOUBLE.S */
4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    faddl   (rFP,%ecx,4)           # ex: faddp
4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */
4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_DOUBLE.S */
4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubl   (rFP,%ecx,4)           # ex: faddp
4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */
4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_DOUBLE.S */
4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmull   (rFP,%ecx,4)           # ex: faddp
4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */
4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_DOUBLE.S */
4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivl   (rFP,%ecx,4)           # ex: faddp
4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
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_REM_DOUBLE: /* 0xaf */
4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_DOUBLE.S */
4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float vAA, vBB, vCC */
4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)           # vCC to fp stack
4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)           # vCC to fp stack
4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # ecx<- AA
4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
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    .balign 64
4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */
4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT_2ADDR.S */
4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */
4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_INT_2ADDR.S */
4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */
4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT_2ADDR.S */
4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul vA, vB */
4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull   (rFP,%ecx,4),%eax
4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */
4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT_2ADDR.S */
4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv2addr.S */
4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/2addr vA, vB */
4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_2ADDR_continue_div2addr
4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_2ADDR_continue_div2addr
4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_2ADDR_finish_div2addr
4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */
4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT_2ADDR.S */
4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv2addr.S */
4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/2addr vA, vB */
4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_2ADDR_continue_div2addr
4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_2ADDR_continue_div2addr
4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_2ADDR_finish_div2addr
4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */
4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT_2ADDR.S */
4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */
4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT_2ADDR.S */
4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */
4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT_2ADDR.S */
4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */
4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_INT_2ADDR.S */
4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/shop2addr.S */
4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shift/2addr vA, vB */
4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall    %cl,%eax                          # ex: sarl %cl,%eax
4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */
4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_INT_2ADDR.S */
4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/shop2addr.S */
4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shift/2addr vA, vB */
4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    %cl,%eax                          # ex: sarl %cl,%eax
4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */
4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_INT_2ADDR.S */
4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/shop2addr.S */
4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shift/2addr vA, vB */
4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl    %cl,%eax                          # ex: sarl %cl,%eax
4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */
4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_LONG_2ADDR.S */
4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */
4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_LONG_2ADDR.S */
4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */
4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_LONG_2ADDR.S */
4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply, 2-addr version
4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We could definately use more free registers for
4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this code.  We must spill rPC (edx) because it
4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is used by imul.  We'll also spill rINST (ebx),
4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * giving us eax, ebc, ecx and edx as computational
4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * temps.  On top of that, we'll spill rIBASE (edi)
4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for use as the vA pointer and rFP (esi) for use
4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as the vB pointer.  Yuck.
4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long/2addr vA, vB */
4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax            # eax<- BA
4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%al                # eax<- A
4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL          # rINST_FULL<- B
4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)
4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)
4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[A]
4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,rINST_FULL,4),rFP   # rFP<- &v[B]
4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rIBASE),%ecx      # ecx<- Amsw
4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rFP),%ecx          # ecx<- (Amsw*Blsw)
4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rFP),%eax         # eax<- Bmsw
4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rIBASE),%eax       # eax<- (Bmsw*Alsw)
4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl      %eax,%ecx           # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (rFP),%eax          # eax<- Blsw
4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mull      (rIBASE)            # eax<- (Blsw*Alsw)
4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_MUL_LONG_2ADDR_continue
4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */
4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG_2ADDR.S */
4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/2addr vA, vB */
4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax
4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      $4,%eax                  # eax<- B
4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_2ADDR_check_zero
4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_2ADDR_check_neg1
4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_notSpecial:
4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_notSpecial1:
4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_2ADDR_continue
4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */
4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_LONG_2ADDR.S */
4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG_2ADDR.S */
4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/2addr vA, vB */
4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax
4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      $4,%eax                  # eax<- B
4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_2ADDR_check_zero
4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_2ADDR_check_neg1
4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_notSpecial:
4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_notSpecial1:
4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_2ADDR_continue
4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */
4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_LONG_2ADDR.S */
4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */
4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_LONG_2ADDR.S */
4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_LONG_2ADDR.S */
4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_LONG_2ADDR.S */
4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shldl     %eax,%edx
4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall      %cl,%eax
4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,%edx
4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %eax,%eax
4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHL_LONG_2ADDR_finish
4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_LONG_2ADDR.S */
4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      %cl,%edx
4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $31,%edx
4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
4911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHR_LONG_2ADDR_finish
4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_LONG_2ADDR.S */
4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      %cl,%edx
4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %edx,%edx
4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_USHR_LONG_2ADDR_finish
4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_FLOAT_2ADDR.S */
4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fadds   (rFP,rINST_FULL,4)           # ex: faddp
4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_FLOAT_2ADDR.S */
4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubs   (rFP,rINST_FULL,4)           # ex: faddp
4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_FLOAT_2ADDR.S */
4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmuls   (rFP,rINST_FULL,4)           # ex: faddp
5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_FLOAT_2ADDR.S */
5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivs   (rFP,rINST_FULL,4)           # ex: faddp
5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */
5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_FLOAT_2ADDR.S */
5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float/2addr vA, vB */
5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)         # vBB to fp stack
5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)               # vAA to fp stack
5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)               # %st to vA
5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_DOUBLE_2ADDR.S */
5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    faddl   (rFP,rINST_FULL,4)           # ex: faddp
5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
5084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_DOUBLE_2ADDR.S */
5085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubl   (rFP,rINST_FULL,4)           # ex: faddp
5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_DOUBLE_2ADDR.S */
5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmull   (rFP,rINST_FULL,4)           # ex: faddp
5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_DOUBLE_2ADDR.S */
5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivl   (rFP,rINST_FULL,4)           # ex: faddp
5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_DOUBLE_2ADDR.S */
5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float/2addr vA, vB */
5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)         # vBB to fp stack
5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)               # vAA to fp stack
5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)               # %st to vA
5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */
5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT_LIT16.S */
5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl %ecx,%eax                              # for example: addl %ecx, %eax
5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
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_RSUB_INT: /* 0xd1 */
5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RSUB_INT.S */
5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl %eax,%ecx                              # for example: addl %ecx, %eax
5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,rINST_FULL)
5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */
5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT_LIT16.S */
5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul/lit16 vA, vB, #+CCCC */
5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     %ecx,%eax                 # trashes rPC
5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
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    .balign 64
5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */
5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT_LIT16.S */
5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit16.S */
5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit16 vA, vB, #+CCCC */
5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT16_continue_div
5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT16_continue_div
5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_LIT16_finish_div
5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
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_REM_INT_LIT16: /* 0xd4 */
5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT_LIT16.S */
5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit16.S */
5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit16 vA, vB, #+CCCC */
5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT16_continue_div
5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT16_continue_div
5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_LIT16_finish_div
5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */
5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT_LIT16.S */
5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %ecx,%eax                              # for example: addl %ecx, %eax
5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */
5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT_LIT16.S */
5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl     %ecx,%eax                              # for example: addl %ecx, %eax
5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */
5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT_LIT16.S */
5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xor    %ecx,%eax                              # for example: addl %ecx, %eax
5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */
5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT_LIT8.S */
5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl %ecx,%eax                             # ex: addl %ecx,%eax
5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */
5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RSUB_INT_LIT8.S */
5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl  %eax,%ecx                             # ex: addl %ecx,%eax
5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%ecx,rINST_FULL)
5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */
5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT_LIT8.S */
5447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul/lit8 vAA, vBB, #+CC */
5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     %ecx,%eax                # trashes rPC
5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */
5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT_LIT8.S */
5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit8.S */
5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit div/rem "lit8" binary operation.  Handles special case of
5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op0=minint & op1=-1
5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit8 vAA, vBB, #+CC */
5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT8_continue_div
5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT8_continue_div
5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_LIT8_finish_div
5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */
5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT_LIT8.S */
5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit8.S */
5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit div/rem "lit8" binary operation.  Handles special case of
5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op0=minint & op1=-1
5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit8 vAA, vBB, #+CC */
5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT8_continue_div
5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT8_continue_div
5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
5508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_LIT8_finish_div
5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */
5515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT_LIT8.S */
5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %ecx,%eax                             # ex: addl %ecx,%eax
5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */
5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT_LIT8.S */
5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl     %ecx,%eax                             # ex: addl %ecx,%eax
5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */
5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT_LIT8.S */
5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xor    %ecx,%eax                             # ex: addl %ecx,%eax
5587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */
5596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_INT_LIT8.S */
5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall  %cl,%eax                             # ex: addl %ecx,%eax
5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */
5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_INT_LIT8.S */
5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    %cl,%eax                             # ex: addl %ecx,%eax
5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */
5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_INT_LIT8.S */
5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl     %cl,%eax                             # ex: addl %ecx,%eax
5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5676c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_VOLATILE: /* 0xe3 */
56773d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_IGET_VOLATILE.S */
56783d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_IGET.S */
56793d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
56803d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * General 32-bit instance field get.
56813d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *
56823d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
56833d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
56843d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* op vA, vB, field@CCCC */
5685c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_GLUE(%ecx)
56863d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rIBASE)                                 # need another reg
56873d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
56883d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
56893d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl  rINST_HI,%ecx                         # ecx<- BA
56903d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    sarl    $4,%ecx                              # ecx<- B
56913d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
56923d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
56933d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    andb    $0xf,rINST_LO                        # rINST_FULL<- A
56943d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
56953d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    (%eax,rIBASE,4),%eax                  # resolved entry
56963d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %eax,%eax                             # is resolved entry null?
56973d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne     .LOP_IGET_VOLATILE_finish                    # no, already resolved
56983d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
56993d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(rIBASE)
57003d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp     .LOP_IGET_VOLATILE_resolve
57013d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
57023d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5705c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_VOLATILE: /* 0xe4 */
57063d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_IPUT_VOLATILE.S */
57073d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_IPUT.S */
57083d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
57093d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
57103d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * General 32-bit instance field put.
57113d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *
57123d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
57133d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
57143d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* op vA, vB, field@CCCC */
5715c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_GLUE(%ecx)
57163d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rIBASE)                                 # need another reg
57173d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
57183d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
57193d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl  rINST_HI,%ecx                         # ecx<- BA
57203d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    sarl    $4,%ecx                              # ecx<- B
57213d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
57223d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
57233d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    andb    $0xf,rINST_LO                        # rINST_FULL<- A
57243d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
57253d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    (%eax,rIBASE,4),%eax                  # resolved entry
57263d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %eax,%eax                             # is resolved entry null?
57273d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne     .LOP_IPUT_VOLATILE_finish                    # no, already resolved
57283d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rIBASE,OUT_ARG1(%esp)
57293d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(rIBASE)
57303d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp     .LOP_IPUT_VOLATILE_resolve
57313d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
57323d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
5733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5735c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_VOLATILE: /* 0xe5 */
57363d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_SGET_VOLATILE.S */
57373d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_SGET.S */
57383d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
57393d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * General 32-bit SGET handler.
57403d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *
57413d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
57423d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
57433d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* op vAA, field@BBBB */
5744c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_GLUE(%ecx)
57453d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
57463d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
57473d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
57483d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
57493d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl     %eax,%eax                          # resolved entry null?
57503d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je        .LOP_SGET_VOLATILE_resolve                # if not, make it so
57513d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SGET_VOLATILE_finish:     # field ptr in eax
57523d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offStaticField_value(%eax),%eax
57533d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl    rINST_HI,%ecx                      # ecx<- AA
57543d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
57553d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
57563d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SET_VREG(%eax,%ecx)
5757c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_NEXT
57583d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
57593d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
5760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5762c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_VOLATILE: /* 0xe6 */
57633d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_SPUT_VOLATILE.S */
57643d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_SPUT.S */
57653d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
57663d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * General 32-bit SPUT handler.
57673d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *
57683d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
57693d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
57703d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* op vAA, field@BBBB */
5771c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_GLUE(%ecx)
57723d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
57733d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
57743d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
57753d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
57763d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl     %eax,%eax                          # resolved entry null?
57773d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je        .LOP_SPUT_VOLATILE_resolve                # if not, make it so
57783d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SPUT_VOLATILE_finish:     # field ptr in eax
57793d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl    rINST_HI,%ecx                      # ecx<- AA
57803d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_VREG(%ecx,%ecx)
57813d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
57823d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      %ecx,offStaticField_value(%eax)
57833d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
5784c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_NEXT
57853d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
57863d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
5787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5789c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
57903d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_IGET_OBJECT_VOLATILE.S */
57913d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_IGET.S */
57923d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
57933d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * General 32-bit instance field get.
57943d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *
57953d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
57963d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
57973d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* op vA, vB, field@CCCC */
5798c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_GLUE(%ecx)
57993d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rIBASE)                                 # need another reg
58003d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
58013d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
58023d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl  rINST_HI,%ecx                         # ecx<- BA
58033d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    sarl    $4,%ecx                              # ecx<- B
58043d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
58053d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
58063d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    andb    $0xf,rINST_LO                        # rINST_FULL<- A
58073d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
58083d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    (%eax,rIBASE,4),%eax                  # resolved entry
58093d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %eax,%eax                             # is resolved entry null?
58103d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne     .LOP_IGET_OBJECT_VOLATILE_finish                    # no, already resolved
58113d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
58123d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(rIBASE)
58133d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp     .LOP_IGET_OBJECT_VOLATILE_resolve
58143d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
58153d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
5816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
58185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
58195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
58205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
58225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
58235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
58245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_IGET_WIDE_VOLATILE     # do the real work
58255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
58275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
58285387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
58295387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
58325387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
58335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
58345387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58355387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
58365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
58375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
58385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_IPUT_WIDE_VOLATILE     # do the real work
58395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58405387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
58415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
58425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
58435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
58465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
58475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
58485387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58495387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
58505387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
58515387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
58525387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_SGET_WIDE_VOLATILE     # do the real work
58535387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58545387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
58555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
58565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
58575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
58605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
58615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
58625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
58645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
58655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
58665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_SPUT_WIDE_VOLATILE     # do the real work
58675387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
58685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
58695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
58705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
58715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
587496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */
587596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: x86/OP_BREAKPOINT.S */
5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
58823a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
5883be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee/* File: x86/OP_THROW_VERIFICATION_ERROR.S */
5884be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    /*
5885be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     * Handle a throw-verification-error instruction.  This throws an
5886be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     * exception for an error discovered during verification.  The
5887be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     * exception is indicated by AA, with some detail provided by BBBB.
5888be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     */
5889be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    /* op AA, ref@BBBB */
5890b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    GET_GLUE(%ecx)
5891be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movzwl   2(rPC),%eax                     # eax<- BBBB
5892be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     offGlue_method(%ecx),%ecx       # ecx<- glue->method
5893be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    EXPORT_PC()
5894be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movzbl   rINST_HI,rINST_FULL             # rINST_FULL<- AA
5895be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     %eax,OUT_ARG2(%esp)             # arg2<- BBBB
5896be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     rINST_FULL,OUT_ARG1(%esp)       # arg1<- AA
5897be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     %ecx,OUT_ARG0(%esp)             # arg0<- method
5898be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    SPILL(rPC)
5899be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    call     dvmThrowVerificationError       # call(method, kind, ref)
5900be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    UNSPILL(rPC)
5901be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    jmp      common_exceptionThrown          # handle exception
5902be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee
5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */
5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_EXECUTE_INLINE.S */
5907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Execute a "native inline" instruction.
5909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We will be calling through a function table:
5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (*gDvmInlineOpsTable[opIndex].func)(arg0, arg1, arg2, arg3, pResult)
5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
5917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offGlue_retval(%ecx),%ecx # ecx<- & glue->retval
5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG4(%esp)
5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL           # rINST_FULL<- arg count (0-4)
5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      .LOP_EXECUTE_INLINE_continue      # make call; will return after
5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # successful?
5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_exceptionThrown    # no, handle exception
5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5933b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
5934b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /* (stub) */
5935b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_GLUE(%ecx)
5936b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
5937b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
5938b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
5939b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    call      dvmMterp_OP_EXECUTE_INLINE_RANGE     # do the real work
5940b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_GLUE(%ecx)
5941b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
5942b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
5943b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH_INST()
5944b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GOTO_NEXT
5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */
5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT_EMPTY.S */
5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * invoke-direct-empty is a no-op in a "standard" interpreter.
5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
5954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */
5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_F1.S */
5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */
5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_QUICK.S */
5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,1),%eax
5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%cl                 # rINST_FULL<- A
5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,%ecx)               # fp[A]<- result
5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_WIDE_QUICK.S */
5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-wide-quick */
5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%eax,1),%eax        # eax<- address of 64-bit source
5997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax),%ecx               # ecx<- lsw
5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(%eax),%eax               # eax<- msw
5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)    # v[A+0]<- lsw
6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[A+1]<- msw
6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_OBJECT_QUICK.S */
6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_QUICK.S */
6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,1),%eax
6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%cl                 # rINST_FULL<- A
6025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,%ecx)               # fp[A]<- result
6026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */
6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_QUICK.S */
60333d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* For: iput-quick */
6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                  # is object null?
6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,(%ecx,%eax,1)
6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
6052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_WIDE_QUICK.S */
6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-wide-quick */
6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %ecx,%ecx                # is object null?
6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%eax,1),%ecx        # ecx<- Address of 64-bit target
6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- lsw
6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- msw
6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(%ecx)
6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,4(%ecx)
6068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_OBJECT_QUICK.S */
60763d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* For: iput-object-quick */
6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
6080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
60853d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl     %ecx,%ecx                 # is object null?
6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,(%ecx,%eax,1)
60883d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%eax)
60893d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp       .LOP_IPUT_OBJECT_QUICK_finish
6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
6097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx               # ecx<- BBBB
6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- C (or stays CCCC)
6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null?
6109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yep, throw exception
6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         # might throw later - get ready
6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
6114c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
6115c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx               # ecx<- BBBB
6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- C (or stays CCCC)
6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null?
6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yep, throw exception
6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         # might throw later - get ready
6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
6140c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
6141c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK.S */
6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- GFED or CCCC
6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- current method
6157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- D (or stays CCCC)
6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null "this"?
6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # "this" is null, throw exception
6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
6169c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK_RANGE.S */
6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK.S */
6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- GFED or CCCC
6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- current method
6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- D (or stays CCCC)
6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null "this"?
6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # "this" is null, throw exception
6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
6198c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6203c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
62043d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_IPUT_OBJECT_VOLATILE.S */
62053d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_IPUT_OBJECT.S */
62063d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
62073d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * Object field put.
62083d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *
62093d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: iput-object
62103d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
62113d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* op vA, vB, field@CCCC */
6212c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_GLUE(%ecx)
62133d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rIBASE)                                 # need another reg
62143d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
62153d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
62163d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl  rINST_HI,%ecx                         # ecx<- BA
62173d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    sarl    $4,%ecx                              # ecx<- B
62183d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
62193d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
62203d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    andb    $0xf,rINST_LO                        # rINST_FULL<- A
62213d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
62223d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    (%eax,rIBASE,4),%eax                  # resolved entry
62233d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %eax,%eax                             # is resolved entry null?
62243d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne     .LOP_IPUT_OBJECT_VOLATILE_finish                    # no, already resolved
62253d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rIBASE,OUT_ARG1(%esp)
62263d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(rIBASE)
62273d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp     .LOP_IPUT_OBJECT_VOLATILE_resolve
62283d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
62293d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6232c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
62333d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_SGET_OBJECT_VOLATILE.S */
62343d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_SGET.S */
62353d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
62363d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * General 32-bit SGET handler.
62373d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *
62383d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
62393d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
62403d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* op vAA, field@BBBB */
6241c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_GLUE(%ecx)
62423d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
62433d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
62443d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
62453d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
62463d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl     %eax,%eax                          # resolved entry null?
62473d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je        .LOP_SGET_OBJECT_VOLATILE_resolve                # if not, make it so
62483d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SGET_OBJECT_VOLATILE_finish:     # field ptr in eax
62493d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offStaticField_value(%eax),%eax
62503d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl    rINST_HI,%ecx                      # ecx<- AA
62513d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
62523d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
62533d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SET_VREG(%eax,%ecx)
6254c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_NEXT
62553d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
62563d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
6257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6259c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
62603d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_SPUT_OBJECT_VOLATILE.S */
62613d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* File: x86/OP_SPUT_OBJECT.S */
62623d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
62633d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * SPUT object handler.
62643d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
62653d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /* op vAA, field@BBBB */
6266c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_GLUE(%ecx)
62673d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
62683d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
62693d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
62703d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField
62713d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl     %eax,%eax                          # resolved entry null?
62723d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je        .LOP_SPUT_OBJECT_VOLATILE_resolve                # if not, make it so
62733d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SPUT_OBJECT_VOLATILE_finish:     # field ptr in eax
62743d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzbl    rINST_HI,%ecx                      # ecx<- AA
62753d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_VREG(%ecx,%ecx)
62763d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp       .LOP_SPUT_OBJECT_VOLATILE_continue
62773d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
62783d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */
6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_FF.S */
6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionEnd
6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionEnd:
6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Sister implementations
6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterStart
6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmSisterStart, %function
6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 4
6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterStart:
6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING */
6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* This is the less common path, so we'll redo some work
6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   here rather than force spills on the common path */
6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_resolve:
6309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
6311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
6313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%ecx               # ecx<- BBBB
6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveString          # go resolve
6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # failed?
6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown
6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */
6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* This is the less common path, so we'll redo some work
6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   here rather than force spills on the common path */
6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve:
6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     2(rPC),%ecx               # ecx<- BBBBBBBB
6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveString          # go resolve
6342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # failed?
6344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown
6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_CLASS */
6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* This is the less common path, so we'll redo some work
6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   here rather than force spills on the common path */
6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_CLASS_resolve:
6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $1,OUT_ARG2(%esp)        # true
6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%ecx               # ecx<- BBBB
6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveClass           # go resolve
6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # failed?
6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown
6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MONITOR_ENTER */
6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MONITOR_ENTER_continue:
6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # have to - caller save
6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmLockObject               # dvmLockObject(self,object)
6381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION
6383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlueSelf(%ecx),%ecx      # ecx<- glue->self
6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offThread_exception(%ecx),%eax
6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     common_exceptionThrown
6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
6390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MONITOR_EXIT */
6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MONITOR_EXIT_continue:
6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmUnlockObject             # unlock(self,obj)
6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # success?
6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
6400668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    je      common_exceptionThrown      # no, exception pending
6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6402668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee.LOP_MONITOR_EXIT_errNullObject:
6403668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    ADVANCE_PC(1)                       # advance before throw
6404668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    jmp     common_errNullObject
6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CHECK_CAST */
6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds obj->clazz
6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds class resolved from BBBB
6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_FULL holds object
6413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_fullcheck:
6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInstanceofNonTrivial     # eax<- boolean result
6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # failed?
6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_CHECK_CAST_okay            # no, success
6422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # A cast has failed.  We need to throw a ClassCastException with the
6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # class of the object that failed to be cast.
6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrClassCastException,%eax
6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%ecx),%ecx
6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)     # arg0<- message
6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)     # arg1<- obj->clazz->descriptor
6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowExceptionWithClassMessage
6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path, and we're
6438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * going to have to recreate some data.
6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_FULL holds object
6441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolve:
6443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                # eax<- BBBB
6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)        # arg1<- BBBB
6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx # ecx<- metho->clazz
6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)         # arg2<- false
6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)        # arg0<- method->clazz
6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass            # eax<- resolved ClassObject ptr
6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                  # got null?
6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown     # yes, handle exception
6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_CHECK_CAST_resolved       # pick up where we left off
6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INSTANCE_OF */
6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds obj->clazz
6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class resolved from BBBB
6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_HI has BA
6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC already spilled
6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_fullcheck:
6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)
6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInstanceofNonTrivial     # eax<- boolean result
6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # fall through to OP_INSTANCE_OF_store
6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax holds boolean result
6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * rINST_HI holds BA
6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_store:
6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- BA
6481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecl<- A
6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                 # vA<- eax
6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test succeeded, save and bail.
6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_trivial:
6492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- BA
6494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecl<- A
6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $1,%eax
6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                  # vA<- true
6499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC holds BBBB
6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_HI holds BA
6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolve:
6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG1(%esp)          # arg1<- BBBB
6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx
6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $1,OUT_ARG2(%esp)          # arg2<- true
6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # arg0<- method->clazz
6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass             # eax<- resolved ClassObject ptr
6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # success?
6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown      # no, handle exception
6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Now, we need to sync up with fast path.  We need eax to
6521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * hold the obj->clazz, and ecx to hold the resolved class
6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved class
6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%eax               # eax<- BA
6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%eax                    # eax<- B
6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_INSTANCE_OF_resolved
6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_INSTANCE */
6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized:  # on entry, ecx<- class
6533b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    /* TODO: remove test for interface/abstract, now done in verifier */
6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     $(ACC_INTERFACE|ACC_ABSTRACT),offClassObject_accessFlags(%ecx)
6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $ALLOC_DONT_TRACK,OUT_ARG1(%esp)
6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_NEW_INSTANCE_abstract
6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_finish: # ecx=class
6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmAllocObject             # eax<- new object
6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%ecx
6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                  # success?
6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown     # no, bail out
6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class initialization required.
6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class object
6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_needinit:
6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                     # save object
6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInitClass                # initialize class
6558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)                   # restore object
6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # success?
6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_NEW_INSTANCE_initialized     # success, continue
6561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)                        # failed, restore PC
6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # go deal with init exception
6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolve:
6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax
6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx   # ecx<- glue->method
6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)
6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass             # call(clazz,off,flags)
6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved ClassObject ptr
6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                   # success?
6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_NEW_INSTANCE_resolved        # good to go
6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # no, handle exception
6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6584b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden     * TODO: remove this
6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We can't instantiate an abstract class or interface, so throw an
6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * InstantiationError with the class descriptor as the message.
6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class object
6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_abstract:
6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%ecx),%eax
6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrInstantiationError,OUT_ARG0(%esp)
6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowExceptionWithClassMessage
6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_ARRAY */
6599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolve class.  (This is an uncommon case.)
6602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class (null here)
6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds array length (vB)
6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_resolve:
6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%eax)                    # save array length
6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                # eax<- CCCC
6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)
6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass            # eax<- call(clazz,ref,flag)
6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx
6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%eax)
6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                  # successful resolution?
6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown     # no, bail.
6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# fall through to OP_NEW_ARRAY_finish
6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finish allocation
6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx holds class
6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax holds array length (vB)
6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_finish:
6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)
6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass    # eax<- call(clazz,length,flags)
6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax               # failed?
6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown  # yup - go handle
6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%ecx
6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */
6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_more:
6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # null?
6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown            # yes, handle it
6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project       # note: fall through to .LOP_FILLED_NEW_ARRAY_continue
6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    eax holds array class [r0]
6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rINST_FULL holds AA or BB [r10]
6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    ecx is scratch
6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rPC is valid, but has been spilled
6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue:
6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
66683d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%eax)
6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'I',%cl                             # supported?
6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'L',%cl
6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'[',%cl
6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_FILLED_NEW_ARRAY_notimpl                  # no, not handled yet
6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
66763d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    %ecx,offGlue_retval+4(%eax)           # save type
6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if      (!0)
6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,rINST_FULL
6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass                  # eax<- call(arrayClass, length, flags)
6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # alloc successful?
6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown                # no, handle exception
6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* at this point:
6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     eax is pointer to tgt
6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rINST_FULL is length
6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     ecx is FEDC or CCCC
6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     TMP_SPILL is BA
6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rPC is valid, but spilled
6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  We now need to copy values from registers into the array
6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # set up src pointer
6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)     # esi
6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)   # edi
6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%edi         # set up dst ptr
6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rFP,%ecx,4),%esi # set up src ptr
6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%ecx   # load count register
6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rep
6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsd
67103d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
67123d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_retval+4(%ecx),%eax      # eax<- type
6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  rINST_FULL,rINST_FULL
6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     4f
6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(rPC)
6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   $0x0f,rPC            # rPC<- 0000000A
6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall   $16,rPC              # rPC<- 000A0000
6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    %ecx,rPC              # rpc<- 000AFEDC
6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   $0xf,%ecx
6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   rPC,%ecx           # ecx<- next reg to load
6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $4,rPC
6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal   4(%eax),%eax
6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,-4(%eax)
6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub    $1,rINST_FULL
6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3b
6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:
67313d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
67333d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_retval+4(%ecx),%eax      # eax<- type
6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67373d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    cmpb    $'I',%al                        # Int array?
67383d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je      5f                               # skip card mark if so
67393d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_retval(%ecx),%eax        # eax<- object head
67403d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_cardTable(%ecx),%ecx     # card table base
67413d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    shrl    $GC_CARD_SHIFT,%eax             # convert to card num
67423d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movb    %cl,(%ecx,%eax)                  # mark card
67433d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee5:
6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl:
6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrInternalError,%eax
6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrFilledNewArrayNotImpl,%eax
6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_more:
6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # null?
6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown            # yes, handle it
6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project       # note: fall through to .LOP_FILLED_NEW_ARRAY_RANGE_continue
6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    eax holds array class [r0]
6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rINST_FULL holds AA or BB [r10]
6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    ecx is scratch
6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rPC is valid, but has been spilled
6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue:
6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
67853d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%eax)
6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'I',%cl                             # supported?
6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'L',%cl
6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'[',%cl
6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_FILLED_NEW_ARRAY_RANGE_notimpl                  # no, not handled yet
6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
67933d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    %ecx,offGlue_retval+4(%eax)           # save type
6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if      (!1)
6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,rINST_FULL
6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass                  # eax<- call(arrayClass, length, flags)
6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # alloc successful?
6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown                # no, handle exception
6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* at this point:
6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     eax is pointer to tgt
6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rINST_FULL is length
6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     ecx is FEDC or CCCC
6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     TMP_SPILL is BA
6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rPC is valid, but spilled
6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  We now need to copy values from registers into the array
6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # set up src pointer
6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)     # esi
6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)   # edi
6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%edi         # set up dst ptr
6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rFP,%ecx,4),%esi # set up src ptr
6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%ecx   # load count register
6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rep
6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsd
68273d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
68293d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_retval+4(%ecx),%eax      # eax<- type
6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  rINST_FULL,rINST_FULL
6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     4f
6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(rPC)
6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   $0x0f,rPC            # rPC<- 0000000A
6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall   $16,rPC              # rPC<- 000A0000
6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    %ecx,rPC              # rpc<- 000AFEDC
6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   $0xf,%ecx
6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   rPC,%ecx           # ecx<- next reg to load
6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $4,rPC
6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal   4(%eax),%eax
6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,-4(%eax)
6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub    $1,rINST_FULL
6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3b
6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:
68483d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
68503d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_retval+4(%ecx),%eax      # eax<- type
6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68543d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    cmpb    $'I',%al                        # Int array?
68553d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je      5f                               # skip card mark if so
68563d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_retval(%ecx),%eax        # eax<- object head
68573d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_cardTable(%ecx),%ecx     # card table base
68583d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    shrl    $GC_CARD_SHIFT,%eax             # convert to card num
68593d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movb    %cl,(%ecx,%eax)                  # mark card
68603d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee5:
6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
6867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
6868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrInternalError,%eax
6871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
6872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrFilledNewArrayNotImpl,%eax
6873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
6875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_FLOAT */
6879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_isNaN:
6881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $-1,%ecx
6882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPL_FLOAT_finish
6883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_FLOAT */
6885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_isNaN:
6887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $1,%ecx
6888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPG_FLOAT_finish
6889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */
6891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_isNaN:
6893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $-1,%ecx
6894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPL_DOUBLE_finish
6895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */
6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_isNaN:
6899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $1,%ecx
6900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPG_DOUBLE_finish
6901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMP_LONG */
6903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_bigger:
6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $1,%ecx
6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMP_LONG_finish
6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_smaller:
6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $-1,%ecx
6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_finish:
6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,rINST_FULL)
6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_AGET_WIDE */
6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_AGET_WIDE_finish:
6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,8),%eax
6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax),%ecx
6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(%eax),%eax
6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_WIDE */
6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_WIDE_finish:
6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,8),%eax
6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,0)
6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)
6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,4(%eax)
6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,(%eax)
6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_OBJECT */
6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* On entry:
6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax<- array object
6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx<- index
6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL<- vAA
6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_continue:
6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,4),%ecx
6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # storing null reference?
6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_APUT_OBJECT_skip_check
6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)
6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- arrayObj->clazz
6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)
6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)
6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmCanPutArrayElement     # test object type vs. array type
6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax
69623d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%eax)
6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errArrayStore
69643d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offGlue_cardTable(%eax),%eax   # get card table base
69653d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      rINST_FULL,(%ecx)
69663d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
69673d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    shrl      $GC_CARD_SHIFT,%ecx           # convert addr to card number
69683d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movb      %al,(%eax,%ecx)                # mark card
69693d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
69703d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GOTO_NEXT
6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_skip_check:
6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,(%ecx)
6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
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/* continuation for OP_IGET */
6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_resolve:
6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_finish
6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_finish:
6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_WIDE */
7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_resolve:
7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_WIDE_finish
7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_finish:
7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax),%ecx                          # ecx<- lsw
7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    4(%eax),%eax                         # eax<- msw
7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
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/* continuation for OP_IGET_OBJECT */
7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_resolve:
7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_OBJECT_finish
7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_finish:
7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */
7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_resolve:
7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BOOLEAN_finish
7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_finish:
7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BYTE */
7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_resolve:
7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BYTE_finish
7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_finish:
7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_CHAR */
7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_resolve:
7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_CHAR_finish
7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_finish:
7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_SHORT */
7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_resolve:
7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_SHORT_finish
7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_finish:
7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT */
7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_resolve:
7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_finish
7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_finish:
7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_WIDE */
7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_resolve:
7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_WIDE_finish
7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_finish:
7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,0)             # ecx<- lsw
7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)       # rINST_FULL<- msw
7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,4(%eax)
7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,(%eax)
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_OBJECT */
7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_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_OBJECT_finish
7330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_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
73453d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rINST_FULL,(%ecx,%eax)          # obj.field <- v[A](8/16/32 bits)
73463d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%eax)
73473d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   rINST_FULL,rINST_FULL                # stored a NULL?
73483d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_cardTable(%eax),%eax         # get card table base
7349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
73503d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je      1f                                   # skip card mark if null store
73513d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    shrl    $GC_CARD_SHIFT,%ecx                 # object head to card number
73523d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movb    %al,(%eax,%ecx)                      # mark card
73533d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee1:
7354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */
7358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_resolve:
7361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BOOLEAN_finish
7373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_finish:
7376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BYTE */
7394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_resolve:
7397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BYTE_finish
7409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_finish:
7412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_CHAR */
7430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_resolve:
7433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_CHAR_finish
7445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_finish:
7448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_SHORT */
7466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_resolve:
7469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_SHORT_finish
7481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_finish:
7484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET */
7502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_resolve:
7507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_finish                 # success, continue
7519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_WIDE */
7522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_resolve:
7527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_WIDE_finish                 # success, continue
7539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_OBJECT */
7542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_resolve:
7547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_OBJECT_finish                 # success, continue
7559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */
7562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_resolve:
7567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_BOOLEAN_finish                 # success, continue
7579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BYTE */
7582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_resolve:
7587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_BYTE_finish                 # success, continue
7599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_CHAR */
7602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_resolve:
7607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_CHAR_finish                 # success, continue
7619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_SHORT */
7622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_resolve:
7627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_SHORT_finish                 # success, continue
7639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT */
7642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_resolve:
7647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_finish                 # success, continue
7659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_WIDE */
7662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_resolve:
7667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_WIDE_finish                 # success, continue
7679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_OBJECT */
7682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76833d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
76843d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SPUT_OBJECT_continue:
76853d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      %ecx,offStaticField_value(%eax)
76863d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl     %ecx,%ecx
76873d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
76883d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
76893d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je        1f
76903d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offGlue_cardTable(%ecx),%ecx       # get card table base
76913d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    shrl      $GC_CARD_SHIFT,%eax               # head to card number
76923d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movb      %cl,(%ecx,%eax)                    # mark card
76933d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee1:
76943d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
76953d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GOTO_NEXT
76963d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
7697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_resolve:
7698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_OBJECT_finish                 # success, continue
7710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */
7713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve:
7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_BOOLEAN_finish                 # success, continue
7730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BYTE */
7733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_resolve:
7738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_BYTE_finish                 # success, continue
7750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_CHAR */
7753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_resolve:
7758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_CHAR_finish                 # success, continue
7770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_SHORT */
7773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_resolve:
7778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_SHORT_finish                 # success, continue
7790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */
7793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_more:
7796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
7797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
7800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # got null?
7802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_continue        # no, continue
7803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown      # yes, handle exception
7804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax = resolved base method
7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx = scratch
7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue:
7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
7811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
7813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # null this?
7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # go if so
7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
7821c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER */
7824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method [r0]
7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax = method->clazz [r9]
7829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_continue:
7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
7834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae     .LOP_INVOKE_SUPER_nsm           # method not present in superclass
7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
7837c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp     common_invokeMethodNoRange
7838c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
7839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx = null (needs to be resolved base method)
7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax = method->clazz
7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_resolve:
7845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%eax)                     # method->clazz
7846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                 # ecx<- BBBB
7848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
7852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # got null?
7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved base method
7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%eax)                   # restore method->clazz
7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_INVOKE_SUPER_continue        # good to go - continue
7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # handle exception
7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method
7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_nsm:
7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_name(%ecx),%eax
7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     %eax,OUT_ARG1(%esp)
7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errNoSuchMethod
7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */
7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
7872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   TMP_SPILL  <- "this" register
7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Things a bit ugly on this path, but it's the less
7874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * frequent one.  We'll have to do some reloading.
7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_resolve:
7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     SPILL_TMP(%ecx)
7878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     $METHOD_DIRECT,OUT_ARG2(%esp)
7884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %eax,OUT_ARG1(%esp)
7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %ecx,OUT_ARG0(%esp)
7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     call     dvmResolveMethod # eax<- call(clazz, ref, flags)
7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL_TMP(%ecx)
7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     testl    %eax,%eax
7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jne      .LOP_INVOKE_DIRECT_finish
7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jmp      common_exceptionThrown
7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_STATIC */
7894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_STATIC_continue:
7896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_STATIC,%eax
7897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
7898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod          # call(clazz,ref,flags)
7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # got null?
7902c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange
7903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown
7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_INTERFACE */
7906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_INTERFACE_continue:
7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax
7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_exceptionThrown
7912c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp        common_invokeMethodNoRange
7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL_RANGE */
7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_more:
7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
7921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # got null?
7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # no, continue
7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown      # yes, handle exception
7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax = resolved base method
7929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx = scratch
7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_continue:
7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
7934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # null this?
7939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # go if so
7940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
7941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
7942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
7943c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
7944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */
7946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
7949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method [r0]
7950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax = method->clazz [r9]
7951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue:
7953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
7954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
7955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
7956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae     .LOP_INVOKE_SUPER_RANGE_nsm           # method not present in superclass
7957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
7958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
7959c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp     common_invokeMethodRange
7960c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
7961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx = null (needs to be resolved base method)
7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax = method->clazz
7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve:
7967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%eax)                     # method->clazz
7968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
7969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                 # ecx<- BBBB
7970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
7971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
7972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
7974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # got null?
7976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved base method
7977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%eax)                   # restore method->clazz
7978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_INVOKE_SUPER_RANGE_continue        # good to go - continue
7979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # handle exception
7980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
7983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method
7984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm:
7986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_name(%ecx),%eax
7987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     %eax,OUT_ARG1(%esp)
7988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errNoSuchMethod
7989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */
7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
7994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   TMP_SPILL  <- "this" register
7995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Things a bit ugly on this path, but it's the less
7996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * frequent one.  We'll have to do some reloading.
7997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve:
7999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     SPILL_TMP(%ecx)
8000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
8001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
8002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
8003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
8004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
8005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     $METHOD_DIRECT,OUT_ARG2(%esp)
8006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %eax,OUT_ARG1(%esp)
8007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %ecx,OUT_ARG0(%esp)
8008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     call     dvmResolveMethod # eax<- call(clazz, ref, flags)
8009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL_TMP(%ecx)
8010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     testl    %eax,%eax
8011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jne      .LOP_INVOKE_DIRECT_RANGE_finish
8012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
8013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jmp      common_exceptionThrown
8014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_STATIC_RANGE */
8016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_STATIC_RANGE_continue:
8018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_STATIC,%eax
8019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
8020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod          # call(clazz,ref,flags)
8022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # got null?
8024c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange
8025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown
8026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_INTERFACE_RANGE */
8028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_INTERFACE_RANGE_continue:
8030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
8031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax
8033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_exceptionThrown
8034c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp        common_invokeMethodRange
8035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_INT */
8037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_continue:
8040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
8041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
8042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
8043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
8044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
8046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_FLOAT_TO_INT_special_case # fix up result
8048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_finish:
8050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_special_case:
8054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
8055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
8056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_FLOAT_TO_INT_isNaN
8057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
8058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
8059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
8060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_FLOAT_TO_INT_finish
8062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_isNaN:
8063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
8064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
8065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
8066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_FLOAT_TO_INT_finish
8068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */
8070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_continue:
8073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
8074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
8075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
8076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
8077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
8079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_FLOAT_TO_LONG_special_case # fix up result
8081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_finish:
8083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_special_case:
8087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
8088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
8089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_FLOAT_TO_LONG_isNaN
8090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
8091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
8092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
8093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_FLOAT_TO_LONG_finish
8095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_isNaN:
8096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
8097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
8098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
8099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_FLOAT_TO_LONG_finish
8101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_INT */
8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_continue:
8106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
8107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
8108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
8109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
8110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
8112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DOUBLE_TO_INT_special_case # fix up result
8114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_finish:
8116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_special_case:
8120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
8121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_DOUBLE_TO_INT_isNaN
8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
8124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
8126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_DOUBLE_TO_INT_finish
8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_isNaN:
8129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
8130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
8131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
8132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_DOUBLE_TO_INT_finish
8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */
8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_continue:
8139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
8140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
8141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
8142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
8145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DOUBLE_TO_LONG_special_case # fix up result
8147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_finish:
8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_special_case:
8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
8155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_DOUBLE_TO_LONG_isNaN
8156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
8158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
8159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_DOUBLE_TO_LONG_finish
8161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_isNaN:
8162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
8165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_DOUBLE_TO_LONG_finish
8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT */
8169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_continue_div:
8170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_finish_div:
8173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecl<- AA
8174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT */
8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_continue_div:
8182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_finish_div:
8185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecl<- AA
8186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,%ecx)
8187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG */
8193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_continue:
8195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx       # ecx<- A
8197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,4(rFP,%ecx,4)  # v[B+1]<- %edx
8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)                  # restore rPC/%edx
8199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
8201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(rFP,%ecx,4)   # v[B]<- %eax
8202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_LONG */
8206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_continue:
8208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __divdi3
8209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_finish:
8210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx
8211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_check_zero:
8219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_notSpecial
8221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_check_neg1:
8224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_notSpecial
8226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
8227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
8228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_notSpecial1
8230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_notSpecial1
8232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%edx
8235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_finish
8236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_LONG */
8238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_continue:
8240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __moddi3
8241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_finish:
8242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx
8243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_check_zero:
8251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_notSpecial
8253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_check_neg1:
8256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_notSpecial
8258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
8260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_notSpecial1
8262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_notSpecial1
8264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
8267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_finish
8268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG */
8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_finish:
8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- %eax
8273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG */
8277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_finish:
8280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- eax
8281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG */
8285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_finish:
8288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)        # v[BB+0]<- eax
8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT_2ADDR */
8294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_2ADDR_continue_div2addr:
8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_2ADDR_finish_div2addr:
8298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
8299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT_2ADDR */
8305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_2ADDR_continue_div2addr:
8306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_2ADDR_finish_div2addr:
8309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
8310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG_2ADDR */
8316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_2ADDR_continue:
8318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
8319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,4(rIBASE)      # v[A+1]<- %edx
8320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)                  # restore rPC/%edx
8321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(rIBASE)       # v[A]<- %eax
8323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
8324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
8325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_LONG_2ADDR */
8329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_continue:
8331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
8332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
8333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
8334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __divdi3
8335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_finish:
8336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%ecx
8337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_check_zero:
8345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_2ADDR_notSpecial
8347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_check_neg1:
8350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_2ADDR_notSpecial
8352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
8353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
8354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_2ADDR_notSpecial1
8356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_2ADDR_notSpecial1
8358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%edx
8361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_2ADDR_finish
8362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_LONG_2ADDR */
8364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_continue:
8366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
8367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
8368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
8369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __moddi3
8370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_finish:
8371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%ecx
8372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_check_zero:
8380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_2ADDR_notSpecial
8382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_check_neg1:
8385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_2ADDR_notSpecial
8387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
8388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
8389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_2ADDR_notSpecial1
8391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_2ADDR_notSpecial1
8393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
8396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_2ADDR_finish
8397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */
8399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish:
8402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
8403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */
8408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish:
8411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
8412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */
8417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish:
8420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[AA+0]<- eax
8421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT_LIT16 */
8426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT16_continue_div:
8427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT16_finish_div:
8430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
8431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT_LIT16 */
8437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT16_continue_div:
8438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT16_finish_div:
8441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
8442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT_LIT8 */
8448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT8_continue_div:
8449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT8_finish_div:
8452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
8453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT_LIT8 */
8459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT8_continue_div:
8460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT8_finish_div:
8463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
8464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84693d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* continuation for OP_IGET_VOLATILE */
84703d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
84713d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
84723d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_IGET_VOLATILE_resolve:
84733d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    EXPORT_PC()
84743d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rPC)
84753d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
84763d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rIBASE)
84773d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
84783d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL_TMP(%ecx)                               # save object pointer across call
84793d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
84803d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    call    dvmResolveInstField                   #  ... to dvmResolveInstField
84813d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL_TMP(%ecx)
84823d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rPC)
84833d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %eax,%eax                             #  ... which returns InstrField ptr
84843d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne     .LOP_IGET_VOLATILE_finish
84853d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp     common_exceptionThrown
84863d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
84873d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_IGET_VOLATILE_finish:
84883d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
84893d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * Currently:
84903d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   eax holds resolved field
84913d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   ecx holds object
84923d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   rIBASE is scratch, but needs to be unspilled
84933d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   rINST_FULL holds A
84943d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
84953d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
84963d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rIBASE)
84973d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %ecx,%ecx                            # object null?
84983d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je      common_errNullObject                 # object was null
84993d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
85003d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rINST_FULL,%eax                      # eax<- A
85013d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
85023d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SET_VREG(%ecx,%eax)
85033d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
85043d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GOTO_NEXT
85053d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85063d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* continuation for OP_IPUT_VOLATILE */
85073d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85083d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85093d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_IPUT_VOLATILE_resolve:
85103d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    EXPORT_PC()
85113d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rPC)
85123d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
85133d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rIBASE)
85143d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
85153d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL_TMP(%ecx)                               # save object pointer across call
85163d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
85173d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    call    dvmResolveInstField                   #  ... to dvmResolveInstField
85183d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL_TMP(%ecx)
85193d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rPC)
85203d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %eax,%eax                             #  ... which returns InstrField ptr
85213d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne     .LOP_IPUT_VOLATILE_finish
85223d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp     common_exceptionThrown
85233d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85243d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_IPUT_VOLATILE_finish:
85253d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
85263d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * Currently:
85273d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   eax holds resolved field
85283d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   ecx holds object
85293d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   rIBASE is scratch, but needs to be unspilled
85303d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   rINST_FULL holds A
85313d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
85323d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
85333d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
85343d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rIBASE)
85353d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %ecx,%ecx                            # object null?
85363d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je      common_errNullObject                 # object was null
85373d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
85383d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
85393d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
85403d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GOTO_NEXT
85413d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85423d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* continuation for OP_SGET_VOLATILE */
85433d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85443d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
85453d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * Go resolve the field
85463d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
85473d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SGET_VOLATILE_resolve:
85483d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
85493d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
85503d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
85513d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    EXPORT_PC()                                 # could throw, need to export
85523d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
85533d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rPC)
85543d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     %eax,OUT_ARG1(%esp)
85553d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     %ecx,OUT_ARG0(%esp)
85563d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
85573d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rPC)
85583d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl    %eax,%eax
85593d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne      .LOP_SGET_VOLATILE_finish                 # success, continue
85603d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp      common_exceptionThrown             # no, handle exception
85613d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85623d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* continuation for OP_SPUT_VOLATILE */
85633d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85643d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
85653d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * Go resolve the field
85663d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
85673d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SPUT_VOLATILE_resolve:
85683d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
85693d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
85703d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
85713d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    EXPORT_PC()                                 # could throw, need to export
85723d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
85733d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rPC)
85743d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     %eax,OUT_ARG1(%esp)
85753d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     %ecx,OUT_ARG0(%esp)
85763d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
85773d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rPC)
85783d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl    %eax,%eax
85793d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne      .LOP_SPUT_VOLATILE_finish                 # success, continue
85803d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp      common_exceptionThrown             # no, handle exception
85813d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85823d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* continuation for OP_IGET_OBJECT_VOLATILE */
85833d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85843d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
85853d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_IGET_OBJECT_VOLATILE_resolve:
85863d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    EXPORT_PC()
85873d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rPC)
85883d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
85893d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rIBASE)
85903d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
85913d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL_TMP(%ecx)                               # save object pointer across call
85923d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
85933d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    call    dvmResolveInstField                   #  ... to dvmResolveInstField
85943d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL_TMP(%ecx)
85953d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rPC)
85963d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %eax,%eax                             #  ... which returns InstrField ptr
85973d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne     .LOP_IGET_OBJECT_VOLATILE_finish
85983d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp     common_exceptionThrown
85993d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
86003d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_IGET_OBJECT_VOLATILE_finish:
86013d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
86023d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * Currently:
86033d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   eax holds resolved field
86043d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   ecx holds object
86053d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   rIBASE is scratch, but needs to be unspilled
86063d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   rINST_FULL holds A
86073d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
86083d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
86093d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rIBASE)
86103d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %ecx,%ecx                            # object null?
86113d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je      common_errNullObject                 # object was null
86123d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
86133d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rINST_FULL,%eax                      # eax<- A
86143d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
86153d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SET_VREG(%ecx,%eax)
86163d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
86173d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GOTO_NEXT
86183d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
8619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */
8620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_continue:
8622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Extract args, call function.
8624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = #of args (0-4)
8625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax = call index
8626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  @esp = return addr
8627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  esp is -4 from normal
8628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  Go ahead and load all 4 args, even if not used.
8630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rPC
8632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG0(%esp)
8638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG1(%esp)
8644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG2(%esp)
8650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG3(%esp)
8656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall      $4,%eax      # index *= sizeof(table entry)
8658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       *gDvmInlineOpsTable(%eax)
8659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # will return to caller of .LOP_EXECUTE_INLINE_continue
8660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
86613d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* continuation for OP_IPUT_OBJECT_QUICK */
86623d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
86633d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_IPUT_OBJECT_QUICK_finish:
86643d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl     rINST_FULL,rINST_FULL         # did we store null?
86653d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
86663d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offGlue_cardTable(%eax),%eax  # get card table base
86673d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je        1f                            # skip card mark if null store
86683d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    shrl      $GC_CARD_SHIFT,%ecx          # object head to card number
86693d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movb      %al,(%eax,%ecx)               # mark card
86703d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee1:
86713d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
86723d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GOTO_NEXT
86733d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
86743d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* continuation for OP_IPUT_OBJECT_VOLATILE */
86753d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
86763d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
86773d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_IPUT_OBJECT_VOLATILE_resolve:
86783d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    EXPORT_PC()
86793d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rPC)
86803d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
86813d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rIBASE)
86823d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
86833d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL_TMP(%ecx)                               # save object pointer across call
86843d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
86853d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    call    dvmResolveInstField                   #  ... to dvmResolveInstField
86863d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL_TMP(%ecx)
86873d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rPC)
86883d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %eax,%eax                             #  ... which returns InstrField ptr
86893d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne     .LOP_IPUT_OBJECT_VOLATILE_finish
86903d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp     common_exceptionThrown
86913d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
86923d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_IPUT_OBJECT_VOLATILE_finish:
86933d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
86943d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * Currently:
86953d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   eax holds resolved field
86963d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   ecx holds object
86973d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   rIBASE is scratch, but needs to be unspilled
86983d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     *   rINST_FULL holds A
86993d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
87003d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
87013d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
87023d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rIBASE)
87033d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   %ecx,%ecx                            # object null?
87043d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je      common_errNullObject                 # object was null
87053d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    rINST_FULL,(%ecx,%eax)          # obj.field <- v[A](8/16/32 bits)
87063d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%eax)
87073d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl   rINST_FULL,rINST_FULL                # stored a NULL?
87083d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl    offGlue_cardTable(%eax),%eax         # get card table base
87093d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
87103d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je      1f                                   # skip card mark if null store
87113d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    shrl    $GC_CARD_SHIFT,%ecx                 # object head to card number
87123d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movb    %al,(%eax,%ecx)                      # mark card
87133d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee1:
87143d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
87153d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GOTO_NEXT
87163d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
87173d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* continuation for OP_SGET_OBJECT_VOLATILE */
87183d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
87193d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    /*
87203d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     * Go resolve the field
87213d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee     */
87223d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SGET_OBJECT_VOLATILE_resolve:
87233d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
87243d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
87253d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
87263d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    EXPORT_PC()                                 # could throw, need to export
87273d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
87283d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rPC)
87293d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     %eax,OUT_ARG1(%esp)
87303d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     %ecx,OUT_ARG0(%esp)
87313d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
87323d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rPC)
87333d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl    %eax,%eax
87343d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne      .LOP_SGET_OBJECT_VOLATILE_finish                 # success, continue
87353d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp      common_exceptionThrown             # no, handle exception
87363d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
87373d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee/* continuation for OP_SPUT_OBJECT_VOLATILE */
87383d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
87393d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
87403d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SPUT_OBJECT_VOLATILE_continue:
87413d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      %ecx,offStaticField_value(%eax)
87423d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl     %ecx,%ecx
87433d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
87443d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    FETCH_INST_WORD(2)
87453d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    je        1f
87463d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl      offGlue_cardTable(%ecx),%ecx       # get card table base
87473d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    shrl      $GC_CARD_SHIFT,%eax               # head to card number
87483d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movb      %cl,(%ecx,%eax)                    # mark card
87493d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee1:
87503d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    ADVANCE_PC(2)
87513d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GOTO_NEXT
87523d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
87533d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee.LOP_SPUT_OBJECT_VOLATILE_resolve:
87543d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    GET_GLUE(%ecx)
87553d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
87563d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
87573d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    EXPORT_PC()                                 # could throw, need to export
87583d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
87593d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    SPILL(rPC)
87603d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     %eax,OUT_ARG1(%esp)
87613d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    movl     %ecx,OUT_ARG0(%esp)
87623d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
87633d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    UNSPILL(rPC)
87643d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    testl    %eax,%eax
87653d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jne      .LOP_SPUT_OBJECT_VOLATILE_finish                 # success, continue
87663d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee    jmp      common_exceptionThrown             # no, handle exception
87673d95064ad1d8e6da4f9a523b2c2f11cf1f1ea952buzbee
8768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
8769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterEnd
8770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterEnd:
8771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/entry.S */
8773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
8775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
8777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
8778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
8779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
8781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
8783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
8784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
8786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
8787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
8791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdRun
8792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdRun, %function
8793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * bool dvmMterpStdRun(MterpGlue* glue)
8795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point.  Returns changeInterp.
8797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun:
8800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebp
8801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,%ebp
8802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %edi
8803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %esi
8804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebx
8805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* at this point, stack is misaligned by 1 word
8807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   We're allocating spill space for 6 words, plus
8808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   outgoing argument (5 words) and local variables
8809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   (4 words) - 15 words or 60 bytes total. See
8810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   diagram in header.S
8811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
8812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl   $60,%esp
8813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Set up "named" registers */
8815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    IN_ARG0(%ebp),%ecx
8816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,rGLUE_SPILL(%ebp)
8817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FROM_GLUE(%ecx)
8818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_FP_FROM_GLUE(%ecx)
8819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $dvmAsmInstructionStart,rIBASE
8820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Remember %esp for future "longjmp" */
8822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,offGlue_bailPtr(%ecx)
8823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* How to start? */
8825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    offGlue_entryPoint(%ecx),%al
8826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Normal start? */
8828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $kInterpEntryInstr,%al
8829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .Lnot_instr
8830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   /* Normal case: start executing the instruction at rPC */
8832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
8833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_instr:
8836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Reset to normal case */
8837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb   $kInterpEntryInstr,offGlue_entryPoint(%ecx)
8838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb   $kInterpEntryReturn,%al
8839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     common_returnFromMethod
8840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb   $kInterpEntryThrow,%al
8841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     common_exceptionThrown
8842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx  %al,%eax
8843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %eax,OUT_ARG1(%esp)
8844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   $.LstrBadEntryPoint,OUT_ARG0(%esp)
8845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call   printf
8846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call   dvmAbort
8847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Not reached */
8848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdBail
8851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdBail, %function
8852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * void dvmMterpStdBail(MterpGlue* glue, bool changeInterp)
8854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
8856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
8857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
8858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We're not going to build a standard frame here, so the arg accesses will
8860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * look a little strange.
8861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  esp+4 (arg0)  MterpGlue* glue
8864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  esp+8 (arg1)  bool changeInterp
8865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail:
8867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    4(%esp),%ecx                 # grab glue
8868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    8(%esp),%eax                 # changeInterp to return reg
8869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_bailPtr(%ecx),%esp   # Stack back to normal
8870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl    $60,%esp                    # Strip dvmMterpStdRun's frame
8871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebx
8872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %esi
8873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %edi
8874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebp
8875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret                                  # return to dvmMterpStdRun's caller
8876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings
8880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section    .rodata
8882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint:
8883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Bad entry point %d\n"
8884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/footer.S */
8886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
8888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
8890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
8891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
8892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
8894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
8896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
8897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
8899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
8900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common subroutines and data.
8903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backwards branch is taken
8907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ebx (a.k.a. rINST_FULL) -> PC adjustment in 16-bit words
8910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch:
8912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8913c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    call   common_periodicChecks  # Note: expects rPC to be preserved
8914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
8915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
8916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8918c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8919c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8920c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch/*
8921c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch * Common code for method invocation with range.
8922c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *
8923c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch * On entry:
8924c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *   eax = Method* methodToCall
8925c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *   rINST trashed, must reload
8926c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch */
8927c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8928c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birchcommon_invokeMethodRange:
8929c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNewRange:
8930c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8931c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8932c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * prepare to copy args to "outs" area of current frame
8933c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8934c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8935c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- AA
8936c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      4(rPC), %ecx            # %ecx<- CCCC
8937c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SPILL(rPC)
8938c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
8939c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    test        rINST_FULL, rINST_FULL
8940c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- AA
8941c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jz          .LinvokeArgsDone        # no args; jump to args done
8942c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8943c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8944c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8945c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, %ecx=CCCC, LOCAL0_OFFSET(%ebp)=count, %edx=&outs (&stackSaveArea)
8946c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * (very few methods have > 10 args; could unroll for common cases)
8947c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8948c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8949c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ebx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- save %ebx
8950c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         (rFP, %ecx, 4), %ecx    # %ecx<- &vCCCC
8951c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shll        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
8952c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        LOCAL0_OFFSET(%ebp), %edx       # %edx<- update &outs
8953c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shrl        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
8954c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch1:
8955c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (%ecx), %ebx            # %ebx<- vCCCC
8956c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%ecx), %ecx           # %ecx<- &vCCCC++
8957c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        $1, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET<- LOCAL0_OFFSET--
8958c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ebx, (%edx)            # *outs<- vCCCC
8959c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%edx), %edx           # outs++
8960c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         1b                      # loop if count (LOCAL0_OFFSET(%ebp)) not zero
8961c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ebx       # %ebx<- restore %ebx
8962c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp         .LinvokeArgsDone        # continue
8963c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8964c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8965c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax is "Method* methodToCall", the method we're trying to call
8966c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * prepare to copy args to "outs" area of current frame
8967c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8968c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8969c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birchcommon_invokeMethodNoRange:
8970c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNewNoRange:
8971c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- BA
8972c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SPILL(rPC)
8973c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BA
8974c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shrl        $4, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- B
8975c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          .LinvokeArgsDone        # no args; jump to args done
8976c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      4(rPC), %ecx            # %ecx<- GFED
8977c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
8978c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8979c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8980c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, %ecx=GFED, LOCAL0_OFFSET(%ebp)=count, %edx=outs
8981c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8982c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8983c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNonRange:
8984c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $2, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 2
8985c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- GFED
8986c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          1f                      # handle 1 arg
8987c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          2f                      # handle 2 args
8988c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $4, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 4
8989c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          3f                      # handle 3 args
8990c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          4f                      # handle 4 args
8991c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch5:
8992c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    andl        $15, rINST_FULL        # rINST<- A
8993c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8994c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, rINST_FULL, 4), %ecx # %ecx<- vA
8995c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vA
8996c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8997c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch4:
8998c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $12, %ecx              # %ecx<- G
8999c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
9000c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vG
9001c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vG
9002c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
9003c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch3:
9004c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x0f00, %ecx          # %ecx<- 0F00
9005c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $8, %ecx               # %ecx<- F
9006c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
9007c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vF
9008c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vF
9009c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
9010c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch2:
9011c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x00f0, %ecx          # %ecx<- 00E0
9012c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $4, %ecx               # %ecx<- E
9013c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
9014c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vE
9015c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vE
9016c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
9017c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch1:
9018c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x000f, %ecx          # %ecx<- 000D
9019c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vD
9020c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, -4(%edx)          # *--outs<- vD
9021c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch0:
9022c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9023c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
9024c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax is "Method* methodToCall", the method we're trying to call
9025c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * find space for the new stack frame, check for overflow
9026c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
9027c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9028c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeArgsDone:
9029c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      offMethod_registersSize(%eax), %edx # %edx<- methodToCall->regsSize
9030c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      offMethod_outsSize(%eax), %ecx # %ecx<- methodToCall->outsSize
9031c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, LOCAL0_OFFSET(%ebp)       # LOCAL0_OFFSET<- methodToCall
9032c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shl         $2, %edx               # %edx<- update offset
9033c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%eax,rFP)          # %eax<- &StackSaveArea
9034c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        %edx, %eax              # %eax<- newFP; (old savearea - regsSize)
9035c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%edx)                      # %edx<- pMterpGlue
9036c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- &outs
9037c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        $sizeofStackSaveArea, %eax # %eax<- newSaveArea (stack save area using newFP)
9038c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_interpStackEnd(%edx), %edx # %edx<- glue->interpStackEnd
9039c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, LOCAL2_OFFSET(%ebp)       # LOCAL2_OFFSET<- glue->interpStackEnd
9040c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shl         $2, %ecx               # %ecx<- update offset for outsSize
9041c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, %edx              # %edx<- newSaveArea
9042c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    sub         %ecx, %eax              # %eax<- bottom; (newSaveArea - outsSize)
9043c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         LOCAL2_OFFSET(%ebp), %eax       # compare interpStackEnd and bottom
9044c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL0_OFFSET(%ebp), %eax       # %eax<- restore methodToCall
9045c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          .LstackOverflow         # handle frame overflow
9046c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9047c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
9048c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * set up newSaveArea
9049c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
9050c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9051c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch#ifdef EASY_GDB
9052c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%ecx,rFP)          # %ecx<- &StackSaveArea
9053c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, offStackSaveArea_prevSave(%edx) # newSaveArea->prevSave<- &outs
9054c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch#endif
9055c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offStackSaveArea_prevFrame(%edx) # newSaveArea->prevFrame<- rFP
9056c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rPC_SPILL(%ebp), %ecx
9057c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, offStackSaveArea_savedPc(%edx) # newSaveArea->savedPc<- rPC
9058c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    testl       $ACC_NATIVE, offMethod_accessFlags(%eax) # check for native call
9059c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, offStackSaveArea_method(%edx) # newSaveArea->method<- method to call
9060c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         .LinvokeNative          # handle native call
9061c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9062c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
9063c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * Update "glue" values for the new method
9064c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFp
9065c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
9066c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9067c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offMethod_clazz(%eax), %edx # %edx<- method->clazz
9068c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
9069c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex
9070c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, offGlue_method(%ecx) # glue->method<- methodToCall
9071c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, offGlue_methodClassDex(%ecx) # glue->methodClassDex<- method->clazz->pDvmDex
9072c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offMethod_insns(%eax), rPC # rPC<- methodToCall->insns
9073c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%ecx), %eax # %eax<- glue->self
9074c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
9075c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- newFP
9076c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    FETCH_INST()
9077c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GOTO_NEXT                           # jump to methodToCall->insns
9078c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9079c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
9080c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * Prep for the native call
9081c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFP, %edx=newSaveArea
9082c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
9083c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9084c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNative:
9085c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
9086c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
9087c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%ecx), %ecx        # %ecx<- glue->self
9088d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        offThread_jniLocal_topCookie(%ecx), %eax # %eax<- self->localRef->...
9089d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        %eax, offStackSaveArea_localRefCookie(%edx) # newSaveArea->localRefCookie<- top
9090c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, OUT_ARG4(%esp)    # save newSaveArea
9091c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %edx # %edx<- newFP
9092c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, offThread_curFrame(%ecx)  # glue->self->curFrame<- newFP
9093c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG3(%esp)    # save glue->self
9094c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG2(%esp)    # push parameter glue->self
9095c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
9096c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG1(%esp), %eax    # %eax<- methodToCall
9097c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         offGlue_retval(%ecx), %ecx # %ecx<- &retval
9098c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG0(%esp)    # push parameter pMterpGlue
9099c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    push        %edx                    # push parameter newFP
9100c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9101c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    call        *offMethod_nativeFunc(%eax) # call methodToCall->nativeFunc
9102c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%esp), %esp
9103c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG4(%esp), %ecx    # %ecx<- newSaveArea
9104c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG3(%esp), %eax    # %eax<- glue->self
9105d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        offStackSaveArea_localRefCookie(%ecx), %edx # %edx<- old top
9106c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $0, offThread_exception(%eax) # check for exception
9107c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- rFP
9108d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
9109c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    UNSPILL(rPC)
9110c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         common_exceptionThrown  # handle exception
9111c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    FETCH_INST_WORD(3)
9112c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    ADVANCE_PC(3)
9113c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GOTO_NEXT                           # jump to next instruction
9114c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
91156ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow:    # eax=methodToCall
91166ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
9117c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%eax)                      # %eax<- pMterpGlue
9118c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%eax), %eax # %eax<- glue->self
9119c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, OUT_ARG0(%esp)    # push parameter self
91206ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    call        dvmHandleStackOverflow  # call: (Thread* self, Method* meth)
9121c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    UNSPILL(rPC)                        # return: void
9122c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp         common_exceptionThrown  # handle exception
9123c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9124c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
9125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common invoke code (old-style).
9127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING:  Rewrite along lines of new armv5 code?
9128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
9130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   eax = Method* methodToCall
9131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ecx = bool methodCallRange
9132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   rINST trashed, must reload
9133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeOld:
9135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)     # arg1<- methodCallRange
9136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
9137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  (rPC),rINST_FULL         # recover rINST
9138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG2(%esp)     # arg2<- method
9139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   4(rPC),%eax             # eax<- GFED or CCCC
9140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
9141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
9142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
9143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,OUT_ARG3(%esp)# arg3<- AA
9144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)     # arg0<- GLUE
9145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG4(%esp)     # arg4<- GFED/CCCC
9146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmMterp_invokeMethod
9147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_resumeAfterGlueCall
9148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Do we need the thread to be suspended or have debugger/profiling activity?
9152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
9154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ebx  -> PC adjustment in 16-bit words (must be preserved)
9155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ecx  -> GLUE pointer
9156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: A call will normally kill %eax, rPC/%edx and %ecx.  To
9158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       streamline the normal case, this routine will preserve rPC and
9159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       %ecx in addition to the normal caller save regs.  The save/restore
9160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       is a bit ugly, but will happen in the relatively uncommon path.
9161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING: Might be worthwhile to inline this.
9162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: Basic-block style Jit will need a hook here as well.  Fold it into
9163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       the suspendCount check so we can get both in 1 shot.
9164c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * TODO: to match the other intepreters, this should handle suspension
9165c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *       and then check for debugger/profiling after dvmCheckSuspendPending
9166c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *       returns.
9167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks:
9169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_pSelfSuspendCount(%ecx),%eax    # eax <- &suspendCount
9170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $0,(%eax)
9171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     1f
9172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
9174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER)
9175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   offGlue_pDebuggerActive(%ecx),%eax      # eax <- &DebuggerActive
9176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_PROFILER)
9178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   offGlue_pActiveProfilers(%ecx),%ecx     # ecx <- &ActiveProfilers
9179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) && defined(WITH_PROFILER)
9181c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    # TODO: check for NULL before load
9182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
9183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    (%ecx),%eax             # eax <- debuggerActive || activeProfilers
9184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_DEBUGGER)
9185c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    # TODO: check for NULL before load
9186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
9187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_PROFILER)
9188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx),%eax             # eax <= activeProfilers
9189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)                 # restore rGLUE
9191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  %eax,%eax
9192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3f                      # one or both active - switch interp
9193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret
9196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Check for suspend */
9198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
9199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*  At this point, the return pointer to the caller of
9200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  common_periodicChecks is on the top of stack.  We need to preserve
9201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC(edx) and GLUE(ecx).  We'll spill rPC, and reload GLUE.
9202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  The outgoing profile is:
9203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      bool dvmCheckSuspendPending(Thread* self)
9204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  Because we reached here via a call, go ahead and build a new frame.
9205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
920699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         # need for precise GC
9207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%eax      # eax<- glue->self
9208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                      # save edx
9209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebp
9210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,%ebp
9211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl    $24,%esp
9212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
9213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmCheckSuspendPending
9214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl    $24,%esp
9215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebp
9216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
9217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
9218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret
9219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Switch interpreters */
9221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Note: %ebx contains the 16-bit word offset to be applied to rPC to
9222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "complete" the interpretation of backwards branches.  In effect, we
9223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * are completing the interpretation of the branch instruction here,
9224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and the new interpreter will resume interpretation at the branch
9225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * target. However, a switch request recognized during the handling
9226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * of a return from method instruction results in an immediate abort,
9227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and the new interpreter will resume by re-interpreting the return
9228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction.
9229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
9231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ebx,2),rPC       # adjust pc to show target
9232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)                 # bail expect GLUE already loaded
9233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $1,rINST_FULL         # set changeInterp to true
9234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_gotoBail
9235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction
9239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod:
9241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
9242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set entry mode in case we bail */
9243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    $kInterpEntryReturn,offGlue_entryPoint(%ecx)
9244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    rINST_FULL,rINST_FULL   # zero offset in case we switch interps
9245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    common_periodicChecks   # Note: expects %ecx to be preserved
9246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(%eax,rFP)                    # eax<- saveArea (old)
9248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offStackSaveArea_prevFrame(%eax),rFP  # rFP<- prevFrame
9249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST_FULL
9250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $0,rINST_FULL                        # break?
9251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_gotoBail    # break frame, bail out completely
9252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offStackSaveArea_savedPc(%eax),rPC    # pc<- saveArea->savedPC
9254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%eax               # eax<- self
9255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,offGlue_method(%ecx)  # glue->method = newSave->meethod
9256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rFP,offThread_curFrame(%eax)     # self->curFrame = fp
9257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rINST_FULL),%eax # eax<- method->clazz
9258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
9259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_pDvmDex(%eax),%eax # eax<- method->clazz->pDvmDex
9260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
9261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_methodClassDex(%ecx)
9262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* not bailing - restore entry mode to default */
9263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    $kInterpEntryInstr,offGlue_entryPoint(%ecx)
9264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
9265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Prepare to strip the current frame and "longjump" back to caller of
9268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dvmMterpStdRun.
9269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on entry:
9271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    rINST_FULL holds changeInterp
9272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    ecx holds glue pointer
9273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected profile: dvmMterpStdBail(MterpGlue *glue, bool changeInterp)
9275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail:
9277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)                # export state to glue
9278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
9279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,OUT_ARG0(%esp)           # glue in arg0
9280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   rINST_FULL,OUT_ARG1(%esp)     # changeInterp in arg1
9281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmMterpStdBail              # bail out....
9282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated values
9286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and start executing at the next instruction.
9287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project common_resumeAfterGlueCall:
9289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
9290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     LOAD_PC_FROM_GLUE(%ecx)
9291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     LOAD_FP_FROM_GLUE(%ecx)
9292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     FETCH_INST()
9293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GOTO_NEXT
9294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero
9297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero:
9299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrArithmeticException,%eax
9301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
9302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrDivideByZero,%eax
9303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
9304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
9305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
9306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
9307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
9308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
9311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize:
9313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrNegativeArraySizeException,%eax
9315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
9316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
9317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
9318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
9319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
9320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
9321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
9322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
9325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod:
9327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrNoSuchMethodError,%eax
9330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
9331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
9332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
9333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
9334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
9335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
9336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
9337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Hit a null object when we weren't expecting one.  Export the PC, throw a
9340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NullPointerException and goto the exception processing code.
9341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject:
9343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrNullPointerException,%eax
9345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
9346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
9347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
9348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
9349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
9350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
9351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
9352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array index exceeds max.
9355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex:
9357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrArrayIndexException,%eax
9359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
9360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
9361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
9362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
9363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
9364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
9365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
9366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value.
9368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore:
9370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrArrayStoreException,%eax
9372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
9373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
9374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
9375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
9376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
9377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
9378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
9379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception.  Handle it.
9382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling
9384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
9385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be.
9386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
9388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown:
9390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
9391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
9392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
9393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
9394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmMterp_exceptionThrown
9395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_resumeAfterGlueCall
9396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort:
9398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0xdeadf00d,%eax
9399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     *%eax
9400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings
9404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section     .rodata
9407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException:
9408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz    "Ljava/lang/NullPointerException;"
9409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException:
9410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArithmeticException;"
9411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero:
9412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "divide by zero"
9413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException:
9414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
9415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException:
9416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayStoreException;"
9417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException:
9418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NegativeArraySizeException;"
9419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError:
9420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InstantiationError;"
9421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException:
9422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ClassCastException;"
9423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError:
9424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NoSuchMethodError;"
9425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError:
9426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InternalError;"
9427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl:
9428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "filled-new-array only implemented for 'int'"
9429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9430