InterpAsm-x86.S revision 7365493ad8d360c1dcf9cd8b6eee62747af01cae
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/* File: x86/OP_IPUT.S */
2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_OBJECT_finish                    # no, already resolved
2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_OBJECT_resolve
2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */
2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_BOOLEAN.S */
2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BOOLEAN_finish                    # no, already resolved
2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_BOOLEAN_resolve
2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */
2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_BYTE.S */
2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BYTE_finish                    # no, already resolved
2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_BYTE_resolve
2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */
2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_CHAR.S */
2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_CHAR_finish                    # no, already resolved
2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_CHAR_resolve
2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */
2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_SHORT.S */
2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT.S */
2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_SHORT_finish                    # no, already resolved
2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rIBASE)
2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_IPUT_SHORT_resolve
2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */
2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_resolve                # if not, make it so
2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish:     # field ptr in eax
2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */
2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_WIDE.S */
2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SGET handler.
2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sget-wide vAA, field@BBBB */
2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_WIDE_resolve                # if not, make it so
2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish:     # field ptr in eax
2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%ecx    # ecx<- lsw
2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4+offStaticField_value(%eax),%eax  # eax<- msw
2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL                # rINST_FULL<- AA
2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
2416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */
2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_OBJECT.S */
2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_OBJECT_resolve                # if not, make it so
2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish:     # field ptr in eax
2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */
2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_BOOLEAN.S */
2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_BOOLEAN_resolve                # if not, make it so
2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish:     # field ptr in eax
2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */
2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_BYTE.S */
2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_BYTE_resolve                # if not, make it so
2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish:     # field ptr in eax
2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */
2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_CHAR.S */
2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_CHAR_resolve                # if not, make it so
2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish:     # field ptr in eax
2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */
2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET_SHORT.S */
2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SGET.S */
2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SGET_SHORT_resolve                # if not, make it so
2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish:     # field ptr in eax
2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offStaticField_value(%eax),%eax
2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */
2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_resolve                # if not, make it so
2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_finish:     # field ptr in eax
2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */
2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_WIDE.S */
2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_WIDE_resolve                # if not, make it so
2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_finish:     # field ptr in eax
2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0)             # rINST_FULL<- lsw
2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)                   # ecx<- msw
2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,offStaticField_value(%eax)
2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+offStaticField_value(%eax)
2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */
2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_OBJECT.S */
2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_OBJECT_resolve                # if not, make it so
2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_finish:     # field ptr in eax
2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */
2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_BOOLEAN.S */
2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_BOOLEAN_resolve                # if not, make it so
2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish:     # field ptr in eax
2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */
2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_BYTE.S */
2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_BYTE_resolve                # if not, make it so
2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish:     # field ptr in eax
2681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */
2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_CHAR.S */
2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_CHAR_resolve                # if not, make it so
2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish:     # field ptr in eax
2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */
2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT_SHORT.S */
2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SPUT.S */
2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_SPUT_SHORT_resolve                # if not, make it so
2734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish:     # field ptr in eax
2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */
2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL.S */
2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx                 # ecx<- BBBB
2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # already resolved?
2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_continue        # yes, continue
2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%eax),%eax   # eax<- glue->method
2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_VIRTUAL_more
2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */
2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER.S */
2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rINST_FULL)
2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(rINST_FULL),%eax # eax<- method
2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
2792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # null "this"?
2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yes, throw
2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # already resolved?
2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_SUPER_continue      # yes - go on
2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_SUPER_resolve
2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */
2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT.S */
2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
2822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # already resolved?
2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_INVOKE_DIRECT_resolve      # not resolved, do it now
2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish:
2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                # null "this"?
2832c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange  # no, continue on
2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errNullObject
2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */
2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_STATIC.S */
2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
2843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
2848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
2852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax
2853c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange
2854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
2856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax
2857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
2859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_STATIC_continue
2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */
2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE.S */
2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if        (!0)
2876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl       $0xf,%eax               # eax<- C (or stays CCCC)
2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax                # null this?
2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_errNullObject     # yes, fail
2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_methodClassDex(%ecx),%eax   # eax<- methodClassDex
2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_method(%ecx),%ecx           # ecx<- method
2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                         # eax<- BBBB
2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp        .LOP_INVOKE_INTERFACE_continue
2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */
2896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_73.S */
2897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
2898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
2899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_RANGE.S */
2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL.S */
2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx                 # ecx<- BBBB
2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # already resolved?
2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # yes, continue
2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%eax),%eax   # eax<- glue->method
2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_VIRTUAL_RANGE_more
2927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_RANGE.S */
2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER.S */
2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
2936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
2938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(rINST_FULL)
2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(rINST_FULL),%eax # eax<- method
2948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # null "this"?
2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yes, throw
2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # already resolved?
2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_SUPER_RANGE_continue      # yes - go on
2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_SUPER_RANGE_resolve
2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT_RANGE.S */
2965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT.S */
2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                # already resolved?
2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_INVOKE_DIRECT_RANGE_resolve      # not resolved, do it now
2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish:
2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                # null "this"?
2995c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange  # no, continue on
2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_errNullObject
2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_STATIC_RANGE.S */
3003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_STATIC.S */
3004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax
3018c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange
3019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
3021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax
3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_INVOKE_STATIC_RANGE_continue
3026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE_RANGE.S */
3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE.S */
3033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
3041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if        (!1)
3043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl       $0xf,%eax               # eax<- C (or stays CCCC)
3044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
3046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
3047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax                # null this?
3048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_errNullObject     # yes, fail
3049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
3050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
3051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_methodClassDex(%ecx),%eax   # eax<- methodClassDex
3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       offGlue_method(%ecx),%ecx           # ecx<- method
3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl     2(rPC),%eax                         # eax<- BBBB
3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp        .LOP_INVOKE_INTERFACE_RANGE_continue
3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */
3064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_79.S */
3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
3066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
3067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */
3072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_7A.S */
3073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
3074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
3075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */
3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_INT.S */
3081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
30937365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
30947365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    negl %eax
3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */
3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NOT_INT.S */
3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
31167365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
31177365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    notl %eax
3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */
3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_LONG.S */
3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx            # ecx<- BA
3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                 # ecx<- B
3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO           # rINST_FULL<- A
3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    negl      %eax
3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl      $0,%ecx
3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    negl      %ecx
3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */
3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NOT_LONG.S */
3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx            # ecx<- BA
3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                 # ecx<- B
3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO           # rINST_FULL<- A
3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    notl      %eax
3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    notl      %ecx
3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */
3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_FLOAT.S */
3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,rINST_FULL,4)      # %st0<- vB
3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fchs
3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */
3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_NEG_DOUBLE.S */
3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fchs
3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */
3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_LONG.S */
3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* int to long vA, vB */
3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- +A
3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # will step on edx later
3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd                                # edx:eax<- sssssssBBBBBBBB
3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)          # v[A+1]<- edx/rPC
3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # v[A+0]<- %eax
3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */
3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_FLOAT.S */
3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
32357365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */
3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_DOUBLE.S */
3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
32557365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */
3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_LONG_TO_INT.S */
3264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */
3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MOVE.S */
3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb   $0xf,%al             # eax<- A
3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */
3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_LONG_TO_FLOAT.S */
3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
32937365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_LONG_TO_DOUBLE.S */
3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
33137365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */
3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FLOAT_TO_INT.S */
3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_FLOAT_TO_INT_continue
3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */
3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FLOAT_TO_LONG.S */
3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_FLOAT_TO_LONG_continue
3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_FLOAT_TO_DOUBLE.S */
3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,rINST_FULL,4)      # %st0<- vB
3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
34077365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */
3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DOUBLE_TO_INT.S */
3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DOUBLE_TO_INT_continue
3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DOUBLE_TO_LONG.S */
3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/cvtfp_int.S */
3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that
3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games.
3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* float/double to int/long vA, vB */
3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ftst
3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb     $0xc,%ah
3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DOUBLE_TO_LONG_continue
3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DOUBLE_TO_FLOAT.S */
3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/fpcvt.S */
3491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit FP conversion operation.
3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
35017365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */
3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_BYTE.S */
3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
35227365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
35237365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl %al,%eax
3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */
3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_CHAR.S */
3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
35457365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
35467365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl %ax,%eax
3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */
3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INT_TO_SHORT.S */
3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unop.S */
3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op eax".
3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
35687365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
35697365493ad8d360c1dcf9cd8b6eee62747af01caeCarl Shapiro
3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl %ax,%eax
3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */
3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT.S */
3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */
3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_INT.S */
3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */
3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT.S */
3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary multiplication.
3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul vAA, vBB, vCC */
3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull    (rFP,%ecx,4),%eax      # trashes rPC/edx
3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # ecx<- AA
3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */
3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT.S */
3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv.S */
3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_continue_div
3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_continue_div
3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_finish_div
3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */
3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT.S */
3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv.S */
3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_continue_div
3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_continue_div
3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_finish_div
3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */
3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT.S */
3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */
3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT.S */
3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */
3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT.S */
3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop.S */
3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */
3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_INT.S */
3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop1.S */
3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall    %cl,%eax                          # ex: addl    %ecx,%eax
3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */
3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_INT.S */
3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop1.S */
3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    %cl,%eax                          # ex: addl    %ecx,%eax
3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */
3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_INT.S */
3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop1.S */
3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl    %cl,%eax                          # ex: addl    %ecx,%eax
3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */
3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_LONG.S */
3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */
3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_LONG.S */
3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
3889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
3890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
3892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
3893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
3894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */
3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_LONG.S */
3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply.
3903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We could definately use more free registers for
3905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this code.  We must spill rPC (edx) because it
3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is used by imul.  We'll also spill rINST (ebx),
3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * giving us eax, ebc, ecx and edx as computational
3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * temps.  On top of that, we'll spill rIBASE (edi)
3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for use as the vB pointer and rFP (esi) for use
3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as the vC pointer.  Yuck.
3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long vAA, vBB, vCC */
3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- B
3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx              # ecx<- C
3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)
3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)
3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rINST_FULL)
3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[B]
3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%ecx,4),rFP         # rFP<- &v[C]
3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rIBASE),%ecx      # ecx<- Bmsw
3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rFP),%ecx          # ecx<- (Bmsw*Clsw)
3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rFP),%eax         # eax<- Cmsw
3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rIBASE),%eax       # eax<- (Cmsw*Blsw)
3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl      %eax,%ecx           # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (rFP),%eax          # eax<- Clsw
3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mull      (rIBASE)            # eax<- (Clsw*Alsw)
3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rINST_FULL)
3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_MUL_LONG_continue
3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */
3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG.S */
3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div vAA, vBB, vCC */
3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax              # eax<- CC
3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_check_zero
3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_check_neg1
3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_notSpecial:
3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_notSpecial1:
3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_continue
3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */
3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_LONG.S */
3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG.S */
3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div vAA, vBB, vCC */
3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%eax              # eax<- CC
3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_check_zero
3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_check_neg1
3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_notSpecial:
3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_notSpecial1:
3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_continue
3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */
3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_LONG.S */
3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
3989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
3993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
3994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
3996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
3997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
3998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
3999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
4000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
4001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
4003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */
4011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_LONG.S */
4012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
4013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
4025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
4026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */
4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_LONG.S */
4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide.S */
4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
4048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
4049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
4050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
4051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
4052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
4055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */
4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_LONG.S */
4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * case specially.
4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long vAA, vBB, vCC */
4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # spill edx
4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # ecx<- v[BB+1]
4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shldl     %eax,%edx
4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall      %cl,%eax
4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,%edx
4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %eax,%eax
4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- %edx
4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHL_LONG_finish
4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */
4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_LONG.S */
4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * case specially.
4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # spill edx
4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      %cl,%edx
4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $31,%edx
4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- edx
4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHR_LONG_finish
4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */
4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_LONG.S */
4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * case specially.
4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # spill edx
4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      %cl,%edx
4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %edx,%edx
4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[BB+1]<- edx
4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_USHR_LONG_finish
4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */
4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_FLOAT.S */
4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fadds   (rFP,%ecx,4)           # ex: faddp
4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */
4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_FLOAT.S */
4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubs   (rFP,%ecx,4)           # ex: faddp
4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */
4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_FLOAT.S */
4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmuls   (rFP,%ecx,4)           # ex: faddp
4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */
4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_FLOAT.S */
4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivs   (rFP,%ecx,4)           # ex: faddp
4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */
4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_FLOAT.S */
4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float vAA, vBB, vCC */
4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)           # vCC to fp stack
4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%eax,4)           # vCC to fp stack
4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)           # %st to vAA
4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */
4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_DOUBLE.S */
4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    faddl   (rFP,%ecx,4)           # ex: faddp
4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */
4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_DOUBLE.S */
4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubl   (rFP,%ecx,4)           # ex: faddp
4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */
4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_DOUBLE.S */
4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmull   (rFP,%ecx,4)           # ex: faddp
4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */
4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_DOUBLE.S */
4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop.S */
4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
4353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivl   (rFP,%ecx,4)           # ex: faddp
4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */
4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_DOUBLE.S */
4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float vAA, vBB, vCC */
4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
4368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)           # vCC to fp stack
4369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%eax,4)           # vCC to fp stack
4370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx          # ecx<- AA
4371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
4372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
4373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)           # %st to vAA
4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */
4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT_2ADDR.S */
4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */
4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_INT_2ADDR.S */
4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */
4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT_2ADDR.S */
4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul vA, vB */
4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull   (rFP,%ecx,4),%eax
4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */
4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT_2ADDR.S */
4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv2addr.S */
4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/2addr vA, vB */
4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_2ADDR_continue_div2addr
4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_2ADDR_continue_div2addr
4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_2ADDR_finish_div2addr
4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */
4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT_2ADDR.S */
4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindiv2addr.S */
4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/2addr vA, vB */
4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_2ADDR_continue_div2addr
4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_2ADDR_continue_div2addr
4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_2ADDR_finish_div2addr
4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */
4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT_2ADDR.S */
4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */
4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT_2ADDR.S */
4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */
4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT_2ADDR.S */
4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binop2addr.S */
4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */
4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_INT_2ADDR.S */
4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/shop2addr.S */
4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shift/2addr vA, vB */
4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall    %cl,%eax                          # ex: sarl %cl,%eax
4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */
4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_INT_2ADDR.S */
4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/shop2addr.S */
4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shift/2addr vA, vB */
4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    %cl,%eax                          # ex: sarl %cl,%eax
4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */
4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_INT_2ADDR.S */
4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/shop2addr.S */
4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shift/2addr vA, vB */
4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl    %cl,%eax                          # ex: sarl %cl,%eax
4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */
4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_LONG_2ADDR.S */
4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */
4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_LONG_2ADDR.S */
4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbbl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */
4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_LONG_2ADDR.S */
4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply, 2-addr version
4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We could definately use more free registers for
4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this code.  We must spill rPC (edx) because it
4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is used by imul.  We'll also spill rINST (ebx),
4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * giving us eax, ebc, ecx and edx as computational
4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * temps.  On top of that, we'll spill rIBASE (edi)
4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for use as the vA pointer and rFP (esi) for use
4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as the vB pointer.  Yuck.
4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long/2addr vA, vB */
4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax            # eax<- BA
4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%al                # eax<- A
4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL          # rINST_FULL<- B
4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)
4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)
4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[A]
4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (rFP,rINST_FULL,4),rFP   # rFP<- &v[B]
4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rIBASE),%ecx      # ecx<- Amsw
4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rFP),%ecx          # ecx<- (Amsw*Blsw)
4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(rFP),%eax         # eax<- Bmsw
4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     (rIBASE),%eax       # eax<- (Bmsw*Alsw)
4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl      %eax,%ecx           # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (rFP),%eax          # eax<- Blsw
4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mull      (rIBASE)            # eax<- (Blsw*Alsw)
4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_MUL_LONG_2ADDR_continue
4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */
4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG_2ADDR.S */
4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/2addr vA, vB */
4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax
4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      $4,%eax                  # eax<- B
4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_2ADDR_check_zero
4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DIV_LONG_2ADDR_check_neg1
4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_notSpecial:
4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_notSpecial1:
4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_2ADDR_continue
4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */
4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_LONG_2ADDR.S */
4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_LONG_2ADDR.S */
4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/2addr vA, vB */
4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%eax
4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      $4,%eax                  # eax<- B
4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_2ADDR_check_zero
4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%eax
4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_REM_LONG_2ADDR_check_neg1
4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_notSpecial:
4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_notSpecial1:
4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_2ADDR_continue
4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */
4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_LONG_2ADDR.S */
4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */
4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_LONG_2ADDR.S */
4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_LONG_2ADDR.S */
4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopWide2addr.S */
4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.
4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_LONG_2ADDR.S */
4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shldl     %eax,%edx
4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall      %cl,%eax
4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,%edx
4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %eax,%eax
4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHL_LONG_2ADDR_finish
4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_LONG_2ADDR.S */
4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
4912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      %cl,%edx
4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $31,%edx
4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_SHR_LONG_2ADDR_finish
4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_LONG_2ADDR.S */
4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ecx gets shift count */
4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need to spill edx */
4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rINST gets AA */
4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrdl     %edx,%eax
4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl      %cl,%edx
4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testb     $32,%cl
4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        2f
4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,%eax
4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl      %edx,%edx
4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_USHR_LONG_2ADDR_finish
4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_FLOAT_2ADDR.S */
4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fadds   (rFP,rINST_FULL,4)           # ex: faddp
4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_FLOAT_2ADDR.S */
4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubs   (rFP,rINST_FULL,4)           # ex: faddp
4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_FLOAT_2ADDR.S */
5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmuls   (rFP,rINST_FULL,4)           # ex: faddp
5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_FLOAT_2ADDR.S */
5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivs   (rFP,rINST_FULL,4)           # ex: faddp
5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */
5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_FLOAT_2ADDR.S */
5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float/2addr vA, vB */
5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,rINST_FULL,4)         # vBB to fp stack
5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    flds     (rFP,%ecx,4)               # vAA to fp stack
5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstps    (rFP,%ecx,4)               # %st to vA
5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_DOUBLE_2ADDR.S */
5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    faddl   (rFP,rINST_FULL,4)           # ex: faddp
5085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SUB_DOUBLE_2ADDR.S */
5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fsubl   (rFP,rINST_FULL,4)           # ex: faddp
5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_DOUBLE_2ADDR.S */
5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fmull   (rFP,rINST_FULL,4)           # ex: faddp
5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_DOUBLE_2ADDR.S */
5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binflop2addr.S */
5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary float operation.
5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fdivl   (rFP,rINST_FULL,4)           # ex: faddp
5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_DOUBLE_2ADDR.S */
5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* rem_float/2addr vA, vB */
5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,rINST_FULL,4)         # vBB to fp stack
5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fldl     (rFP,%ecx,4)               # vAA to fp stack
5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fprem
5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstsw     %ax
5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp        1b
5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstp      %st(1)
5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fstpl    (rFP,%ecx,4)               # %st to vA
5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */
5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT_LIT16.S */
5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl %ecx,%eax                              # for example: addl %ecx, %eax
5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT: /* 0xd1 */
5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RSUB_INT.S */
5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl %eax,%ecx                              # for example: addl %ecx, %eax
5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,rINST_FULL)
5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */
5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT_LIT16.S */
5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul/lit16 vA, vB, #+CCCC */
5242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
5243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     %ecx,%eax                 # trashes rPC
5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */
5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT_LIT16.S */
5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit16.S */
5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit16 vA, vB, #+CCCC */
5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT16_continue_div
5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT16_continue_div
5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_LIT16_finish_div
5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */
5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT_LIT16.S */
5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit16.S */
5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op1=-1.
5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit16 vA, vB, #+CCCC */
5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT16_continue_div
5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT16_continue_div
5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_LIT16_finish_div
5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */
5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT_LIT16.S */
5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %ecx,%eax                              # for example: addl %ecx, %eax
5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */
5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT_LIT16.S */
5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl     %ecx,%eax                              # for example: addl %ecx, %eax
5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */
5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT_LIT16.S */
5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit16.S */
5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int,
5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl     $4,%eax                   # eax<- B
5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xor    %ecx,%eax                              # for example: addl %ecx, %eax
5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */
5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_ADD_INT_LIT8.S */
5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl %ecx,%eax                             # ex: addl %ecx,%eax
5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */
5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_RSUB_INT_LIT8.S */
5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl  %eax,%ecx                             # ex: addl %ecx,%eax
5447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%ecx,rINST_FULL)
5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */
5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_MUL_INT_LIT8.S */
5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul/lit8 vAA, vBB, #+CC */
5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    imull     %ecx,%eax                # trashes rPC
5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */
5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_DIV_INT_LIT8.S */
5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit8.S */
5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit div/rem "lit8" binary operation.  Handles special case of
5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op0=minint & op1=-1
5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit8 vAA, vBB, #+CC */
5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT8_continue_div
5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_INT_LIT8_continue_div
5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_INT_LIT8_finish_div
5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */
5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_REM_INT_LIT8.S */
5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/bindivLit8.S */
5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit div/rem "lit8" binary operation.  Handles special case of
5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * op0=minint & op1=-1
5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* div/rem/lit8 vAA, vBB, #+CC */
5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0,%ecx
5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_errDivideByZero
5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%eax
5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT8_continue_div
5515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $-1,%ecx
5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_INT_LIT8_continue_div
5517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_INT_LIT8_finish_div
5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */
5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_AND_INT_LIT8.S */
5526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl %ecx,%eax                             # ex: addl %ecx,%eax
5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */
5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_OR_INT_LIT8.S */
5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl     %ecx,%eax                             # ex: addl %ecx,%eax
5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */
5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_XOR_INT_LIT8.S */
5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xor    %ecx,%eax                             # ex: addl %ecx,%eax
5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */
5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHL_INT_LIT8.S */
5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall  %cl,%eax                             # ex: addl %ecx,%eax
5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */
5633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_SHR_INT_LIT8.S */
5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    %cl,%eax                             # ex: addl %ecx,%eax
5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */
5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_USHR_INT_LIT8.S */
5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/binopLit8.S */
5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
5666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
5673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
5675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
5676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
5677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl     %cl,%eax                             # ex: addl %ecx,%eax
5678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
5679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E3: /* 0xe3 */
5687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E3.S */
5688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E4: /* 0xe4 */
5695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E4.S */
5696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E5: /* 0xe5 */
5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E5.S */
5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E6: /* 0xe6 */
5711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E6.S */
5712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E7: /* 0xe7 */
5719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_E7.S */
5720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
57265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
57275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
57285387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57295387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
57305387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
57315387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
57325387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_IGET_WIDE_VOLATILE     # do the real work
57335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57345387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
57355387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
57365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
57375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
57405387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
57415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
57425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
57445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
57455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
57465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_IPUT_WIDE_VOLATILE     # do the real work
57475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57485387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
57495387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
57505387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
57515387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
57545387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
57555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
57565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
57585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
57595387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
57605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_SGET_WIDE_VOLATILE     # do the real work
57615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
57635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
57645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
57655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
57685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
57695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* (stub) */
57705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
57725387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
57735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
57745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    call      dvmMterp_OP_SPUT_WIDE_VOLATILE     # do the real work
57755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_GLUE(%ecx)
57765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
57775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
57785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_INST()
57795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_NEXT
5780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
578296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */
578396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: x86/OP_BREAKPOINT.S */
5784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
57903a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
5791be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee/* File: x86/OP_THROW_VERIFICATION_ERROR.S */
5792be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    /*
5793be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     * Handle a throw-verification-error instruction.  This throws an
5794be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     * exception for an error discovered during verification.  The
5795be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     * exception is indicated by AA, with some detail provided by BBBB.
5796be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee     */
5797be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    /* op AA, ref@BBBB */
5798b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    GET_GLUE(%ecx)
5799be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movzwl   2(rPC),%eax                     # eax<- BBBB
5800be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     offGlue_method(%ecx),%ecx       # ecx<- glue->method
5801be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    EXPORT_PC()
5802be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movzbl   rINST_HI,rINST_FULL             # rINST_FULL<- AA
5803be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     %eax,OUT_ARG2(%esp)             # arg2<- BBBB
5804be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     rINST_FULL,OUT_ARG1(%esp)       # arg1<- AA
5805be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    movl     %ecx,OUT_ARG0(%esp)             # arg0<- method
5806be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    SPILL(rPC)
5807be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    call     dvmThrowVerificationError       # call(method, kind, ref)
5808be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    UNSPILL(rPC)
5809be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee    jmp      common_exceptionThrown          # handle exception
5810be74aeb457df67355ce7c16721ecc436c8fd770aBill Buzbee
5811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */
5814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_EXECUTE_INLINE.S */
5815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Execute a "native inline" instruction.
5817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We will be calling through a function table:
5819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (*gDvmInlineOpsTable[opIndex].func)(arg0, arg1, arg2, arg3, pResult)
5821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
5824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
5825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
5826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
5827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offGlue_retval(%ecx),%ecx # ecx<- & glue->retval
5828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG4(%esp)
5829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $12,rINST_FULL           # rINST_FULL<- arg count (0-4)
5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
5831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      .LOP_EXECUTE_INLINE_continue      # make call; will return after
5832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
5833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # successful?
5834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
5835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_exceptionThrown    # no, handle exception
5836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
5837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5841b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
5842b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /* (stub) */
5843b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_GLUE(%ecx)
5844b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
5845b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
5846b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
5847b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    call      dvmMterp_OP_EXECUTE_INLINE_RANGE     # do the real work
5848b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_GLUE(%ecx)
5849b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
5850b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
5851b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH_INST()
5852b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GOTO_NEXT
5853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */
5856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT_EMPTY.S */
5857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * invoke-direct-empty is a no-op in a "standard" interpreter.
5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
5861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
5862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */
5867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_F1.S */
5868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
5869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
5870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */
5875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_QUICK.S */
5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
5877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
5883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,1),%eax
5885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
5886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%cl                 # rINST_FULL<- A
5889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,%ecx)               # fp[A]<- result
5890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
5895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_WIDE_QUICK.S */
5896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-wide-quick */
5897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%eax,1),%eax        # eax<- address of 64-bit source
5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax),%ecx               # ecx<- lsw
5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(%eax),%eax               # eax<- msw
5907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
5909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)    # v[A+0]<- lsw
5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[A+1]<- msw
5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_OBJECT_QUICK.S */
5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IGET_QUICK.S */
5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,1),%eax
5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx
5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,%cl                 # rINST_FULL<- A
5933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG  (%eax,%ecx)               # fp[A]<- result
5934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */
5940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_QUICK.S */
5941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
5942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                  # is object null?
5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,(%ecx,%eax,1)
5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_WIDE_QUICK.S */
5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-wide-quick */
5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %ecx,%ecx                # is object null?
5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%eax,1),%ecx        # ecx<- Address of 64-bit target
5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- lsw
5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- msw
5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(%ecx)
5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,4(%ecx)
5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_OBJECT_QUICK.S */
5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_IPUT_QUICK.S */
5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
5994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                  # is object null?
5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject
5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,(%ecx,%eax,1)
5997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx               # ecx<- BBBB
6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- C (or stays CCCC)
6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null?
6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yep, throw exception
6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         # might throw later - get ready
6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
6025c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
6026c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%ecx               # ecx<- BBBB
6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- C (or stays CCCC)
6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null?
6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # yep, throw exception
6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         # might throw later - get ready
6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
6051c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
6052c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK.S */
6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- GFED or CCCC
6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- current method
6068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
6069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- D (or stays CCCC)
6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null "this"?
6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # "this" is null, throw exception
6076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
6080c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
6085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK_RANGE.S */
6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK.S */
6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
6089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- GFED or CCCC
6096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- current method
6097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%eax                # eax<- D (or stays CCCC)
6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # null "this"?
6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # "this" is null, throw exception
6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
6109c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FC: /* 0xfc */
6115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_FC.S */
6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FD: /* 0xfd */
6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_FD.S */
6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FE: /* 0xfe */
6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_FE.S */
6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */
6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/OP_UNUSED_FF.S */
6140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/unused.S */
6141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_abort
6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionEnd
6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionEnd:
6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Sister implementations
6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterStart
6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmSisterStart, %function
6157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 4
6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterStart:
6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING */
6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* This is the less common path, so we'll redo some work
6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   here rather than force spills on the common path */
6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_resolve:
6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%ecx               # ecx<- BBBB
6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveString          # go resolve
6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # failed?
6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown
6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */
6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* This is the less common path, so we'll redo some work
6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   here rather than force spills on the common path */
6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve:
6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     2(rPC),%ecx               # ecx<- BBBBBBBB
6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
6198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveString          # go resolve
6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # failed?
6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown
6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
6203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
6205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_CLASS */
6208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* This is the less common path, so we'll redo some work
6210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   here rather than force spills on the common path */
6211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_CLASS_resolve:
6212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%eax)
6213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
6214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
6216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $1,OUT_ARG2(%esp)        # true
6217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%ecx               # ecx<- BBBB
6218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
6219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
6221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
6222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveClass           # go resolve
6223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                 # failed?
6225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown
6226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
6227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MONITOR_ENTER */
6232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MONITOR_ENTER_continue:
6234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                          # have to - caller save
6235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmLockObject               # dvmLockObject(self,object)
6238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION
6240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlueSelf(%ecx),%ecx      # ecx<- glue->self
6242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offThread_exception(%ecx),%eax
6243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax
6244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     common_exceptionThrown
6245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
6246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
6247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MONITOR_EXIT */
6250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MONITOR_EXIT_continue:
6252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmUnlockObject             # unlock(self,obj)
6253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
6255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # success?
6256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
6257668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    je      common_exceptionThrown      # no, exception pending
6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6259668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee.LOP_MONITOR_EXIT_errNullObject:
6260668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    ADVANCE_PC(1)                       # advance before throw
6261668628abe05cb30f86bd02c824f7219a7e20b82cBill Buzbee    jmp     common_errNullObject
6262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CHECK_CAST */
6264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
6267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds obj->clazz
6268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds class resolved from BBBB
6269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_FULL holds object
6270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_fullcheck:
6272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInstanceofNonTrivial     # eax<- boolean result
6276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # failed?
6278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_CHECK_CAST_okay            # no, success
6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # A cast has failed.  We need to throw a ClassCastException with the
6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # class of the object that failed to be cast.
6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrClassCastException,%eax
6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%ecx),%ecx
6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)     # arg0<- message
6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)     # arg1<- obj->clazz->descriptor
6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowExceptionWithClassMessage
6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path, and we're
6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * going to have to recreate some data.
6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_FULL holds object
6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolve:
6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                # eax<- BBBB
6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)        # arg1<- BBBB
6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx # ecx<- metho->clazz
6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)         # arg2<- false
6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)        # arg0<- method->clazz
6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass            # eax<- resolved ClassObject ptr
6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                  # got null?
6312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown     # yes, handle exception
6313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_CHECK_CAST_resolved       # pick up where we left off
6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INSTANCE_OF */
6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds obj->clazz
6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class resolved from BBBB
6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_HI has BA
6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC already spilled
6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_fullcheck:
6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)
6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInstanceofNonTrivial     # eax<- boolean result
6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # fall through to OP_INSTANCE_OF_store
6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax holds boolean result
6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * rINST_HI holds BA
6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_store:
6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- BA
6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecl<- A
6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                 # vA<- eax
6342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test succeeded, save and bail.
6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_trivial:
6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- BA
6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb    $0xf,%cl                   # ecl<- A
6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $1,%eax
6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)                  # vA<- true
6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC holds BBBB
6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rINST_HI holds BA
6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolve:
6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG1(%esp)          # arg1<- BBBB
6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx
6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $1,OUT_ARG2(%esp)          # arg2<- true
6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # arg0<- method->clazz
6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass             # eax<- resolved ClassObject ptr
6374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # success?
6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown      # no, handle exception
6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Now, we need to sync up with fast path.  We need eax to
6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * hold the obj->clazz, and ecx to hold the resolved class
6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved class
6381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  rINST_HI,%eax               # eax<- BA
6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,%eax                    # eax<- B
6383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     .LOP_INSTANCE_OF_resolved
6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_INSTANCE */
6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized:  # on entry, ecx<- class
6390b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    /* TODO: remove test for interface/abstract, now done in verifier */
6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     $(ACC_INTERFACE|ACC_ABSTRACT),offClassObject_accessFlags(%ecx)
6392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $ALLOC_DONT_TRACK,OUT_ARG1(%esp)
6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_NEW_INSTANCE_abstract
6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_finish: # ecx=class
6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmAllocObject             # eax<- new object
6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%ecx
6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax                  # success?
6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       common_exceptionThrown     # no, bail out
6402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
6403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class initialization required.
6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class object
6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_needinit:
6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                     # save object
6413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmInitClass                # initialize class
6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)                   # restore object
6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # success?
6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_NEW_INSTANCE_initialized     # success, continue
6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)                        # failed, restore PC
6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # go deal with init exception
6420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolve:
6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax
6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx   # ecx<- glue->method
6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)
6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass             # call(clazz,off,flags)
6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved ClassObject ptr
6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                   # success?
6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_NEW_INSTANCE_resolved        # good to go
6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # no, handle exception
6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6441b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden     * TODO: remove this
6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We can't instantiate an abstract class or interface, so throw an
6443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * InstantiationError with the class descriptor as the message.
6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class object
6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_abstract:
6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%ecx),%eax
6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrInstantiationError,OUT_ARG0(%esp)
6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowExceptionWithClassMessage
6452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_ARRAY */
6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolve class.  (This is an uncommon case.)
6459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx holds class (null here)
6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax holds array length (vB)
6461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_resolve:
6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%eax)                    # save array length
6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%eax                # eax<- CCCC
6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0,OUT_ARG2(%esp)
6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass            # eax<- call(clazz,ref,flag)
6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx
6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%eax)
6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                  # successful resolution?
6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown     # no, bail.
6478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# fall through to OP_NEW_ARRAY_finish
6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finish allocation
6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx holds class
6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax holds array length (vB)
6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_finish:
6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)
6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass    # eax<- call(clazz,length,flags)
6492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax               # failed?
6494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown  # yup - go handle
6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%ecx
6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */
6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_more:
6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # null?
6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown            # yes, handle it
6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project       # note: fall through to .LOP_FILLED_NEW_ARRAY_continue
6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    eax holds array class [r0]
6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rINST_FULL holds AA or BB [r10]
6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    ecx is scratch
6518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rPC is valid, but has been spilled
6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue:
6521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'I',%cl                             # supported?
6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'L',%cl
6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'[',%cl
6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_FILLED_NEW_ARRAY_notimpl                  # no, not handled yet
6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if      (!0)
6533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,rINST_FULL
6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass                  # eax<- call(arrayClass, length, flags)
6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # alloc successful?
6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown                # no, handle exception
6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* at this point:
6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     eax is pointer to tgt
6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rINST_FULL is length
6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     ecx is FEDC or CCCC
6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     TMP_SPILL is BA
6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rPC is valid, but spilled
6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  We now need to copy values from registers into the array
6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # set up src pointer
6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)     # esi
6558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)   # edi
6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%edi         # set up dst ptr
6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rFP,%ecx,4),%esi # set up src ptr
6561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%ecx   # load count register
6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rep
6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsd
6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  rINST_FULL,rINST_FULL
6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     4f
6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(rPC)
6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   $0x0f,rPC            # rPC<- 0000000A
6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall   $16,rPC              # rPC<- 000A0000
6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    %ecx,rPC              # rpc<- 000AFEDC
6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   $0xf,%ecx
6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   rPC,%ecx           # ecx<- next reg to load
6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $4,rPC
6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal   4(%eax),%eax
6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,-4(%eax)
6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub    $1,rINST_FULL
6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3b
6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:
6584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl:
6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrInternalError,%eax
6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
6599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrFilledNewArrayNotImpl,%eax
6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
6602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_more:
6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                         # null?
6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown            # yes, handle it
6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project       # note: fall through to .LOP_FILLED_NEW_ARRAY_RANGE_continue
6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    eax holds array class [r0]
6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rINST_FULL holds AA or BB [r10]
6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    ecx is scratch
6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *    rPC is valid, but has been spilled
6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue:
6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'I',%cl                             # supported?
6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'L',%cl
6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      1f
6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $'[',%cl
6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_FILLED_NEW_ARRAY_RANGE_notimpl                  # no, not handled yet
6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if      (!1)
6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl    $4,rINST_FULL
6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmAllocArrayByClass                  # eax<- call(arrayClass, length, flags)
6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             # alloc successful?
6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_exceptionThrown                # no, handle exception
6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* at this point:
6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     eax is pointer to tgt
6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rINST_FULL is length
6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     ecx is FEDC or CCCC
6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     TMP_SPILL is BA
6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     rPC is valid, but spilled
6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  We now need to copy values from registers into the array
6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # set up src pointer
6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)     # esi
6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rIBASE)   # edi
6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%edi         # set up dst ptr
6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rFP,%ecx,4),%esi # set up src ptr
6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%ecx   # load count register
6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rep
6668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsd
6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  rINST_FULL,rINST_FULL
6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     4f
6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(rPC)
6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   $0x0f,rPC            # rPC<- 0000000A
6676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall   $16,rPC              # rPC<- 000A0000
6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    %ecx,rPC              # rpc<- 000AFEDC
6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   $0xf,%ecx
6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl   rPC,%ecx           # ecx<- next reg to load
6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    shrl   $4,rPC
6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal   4(%eax),%eax
6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,-4(%eax)
6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub    $1,rINST_FULL
6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3b
6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:
6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrInternalError,%eax
6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrFilledNewArrayNotImpl,%eax
6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_FLOAT */
6710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_isNaN:
6712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $-1,%ecx
6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPL_FLOAT_finish
6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_FLOAT */
6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_isNaN:
6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $1,%ecx
6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPG_FLOAT_finish
6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */
6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_isNaN:
6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $-1,%ecx
6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPL_DOUBLE_finish
6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */
6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_isNaN:
6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $1,%ecx
6731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMPG_DOUBLE_finish
6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMP_LONG */
6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_bigger:
6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $1,%ecx
6738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_CMP_LONG_finish
6739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_smaller:
6740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $-1,%ecx
6742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_finish:
6743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,rINST_FULL)
6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_AGET_WIDE */
6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_AGET_WIDE_finish:
6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,8),%eax
6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%eax),%ecx
6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      4(%eax),%eax
6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_WIDE */
6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_WIDE_finish:
6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,8),%eax
6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,0)
6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)
6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,4(%eax)
6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,(%eax)
6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_OBJECT */
6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* On entry:
6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax<- array object
6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx<- index
6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL<- vAA
6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_continue:
6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,4),%ecx
6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # storing null reference?
6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        .LOP_APUT_OBJECT_skip_check
6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)
6785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- arrayObj->clazz
6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)
6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)
6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmCanPutArrayElement     # test object type vs. array type
6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax
6793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errArrayStore
6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_skip_check:
6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      rINST_FULL,(%ecx)
6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET */
6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_resolve:
6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_finish
6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_finish:
6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_WIDE */
6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_resolve:
6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_WIDE_finish
6854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_finish:
6857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
6859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
6860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
6865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
6867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
6868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax),%ecx                          # ecx<- lsw
6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    4(%eax),%eax                         # eax<- msw
6871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
6872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
6873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_OBJECT */
6878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_resolve:
6881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_OBJECT_finish
6893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_finish:
6896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
6899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
6900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
6901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
6902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
6904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */
6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_resolve:
6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BOOLEAN_finish
6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_finish:
6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BYTE */
6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_resolve:
6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
6964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
6965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
6966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_BYTE_finish
6967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
6968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_finish:
6970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
6975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
6976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
6978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movsbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_CHAR */
6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_resolve:
6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_CHAR_finish
7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_finish:
7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_SHORT */
7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_resolve:
7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IGET_SHORT_finish
7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_finish:
7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movswl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%ecx,%eax)
7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT */
7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_resolve:
7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_finish
7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_finish:
7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_WIDE */
7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_resolve:
7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_WIDE_finish
7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_finish:
7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,0)             # ecx<- lsw
7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)       # rINST_FULL<- msw
7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,4(%eax)
7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,(%eax)
7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_OBJECT */
7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_resolve:
7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_OBJECT_finish
7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_finish:
7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */
7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_resolve:
7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BOOLEAN_finish
7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_finish:
7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BYTE */
7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_resolve:
7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_BYTE_finish
7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_finish:
7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_CHAR */
7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_resolve:
7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_CHAR_finish
7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_finish:
7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_SHORT */
7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_resolve:
7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%ecx)
7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_IPUT_SHORT_finish
7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_finish:
7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax holds resolved field
7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx holds object
7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   rINST_FULL holds A
7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %ecx,%ecx                            # object null?
7311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_errNullObject                 # object was null
7312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
7313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET */
7318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_resolve:
7323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_finish                 # success, continue
7335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_WIDE */
7338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_resolve:
7343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_WIDE_finish                 # success, continue
7355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_OBJECT */
7358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_resolve:
7363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_OBJECT_finish                 # success, continue
7375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */
7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_resolve:
7383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_BOOLEAN_finish                 # success, continue
7395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BYTE */
7398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_resolve:
7403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_BYTE_finish                 # success, continue
7415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_CHAR */
7418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_resolve:
7423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_CHAR_finish                 # success, continue
7435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_SHORT */
7438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_resolve:
7443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SGET_SHORT_finish                 # success, continue
7455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT */
7458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_resolve:
7463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_finish                 # success, continue
7475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_WIDE */
7478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_resolve:
7483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_WIDE_finish                 # success, continue
7495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_OBJECT */
7498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_resolve:
7503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_OBJECT_finish                 # success, continue
7515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */
7518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve:
7523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_BOOLEAN_finish                 # success, continue
7535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BYTE */
7538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_resolve:
7543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_BYTE_finish                 # success, continue
7555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_CHAR */
7558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_resolve:
7563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_CHAR_finish                 # success, continue
7575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_SHORT */
7578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Go resolve the field
7581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_resolve:
7583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
7584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
7585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
7586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
7587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
7588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
7590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
7591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
7592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    %eax,%eax
7594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_SPUT_SHORT_finish                 # success, continue
7595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
7596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */
7598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_more:
7601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
7602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
7603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
7604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
7605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # got null?
7607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_continue        # no, continue
7608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown      # yes, handle exception
7609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax = resolved base method
7612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx = scratch
7613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue:
7615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
7616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!0)
7617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
7618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
7620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
7621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # null this?
7622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # go if so
7623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
7624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
7625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
7626c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
7627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER */
7629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
7632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method [r0]
7633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax = method->clazz [r9]
7634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_continue:
7636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
7637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
7638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
7639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae     .LOP_INVOKE_SUPER_nsm           # method not present in superclass
7640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
7641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
7642c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp     common_invokeMethodNoRange
7643c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
7644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx = null (needs to be resolved base method)
7647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax = method->clazz
7648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
7649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_resolve:
7650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%eax)                     # method->clazz
7651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
7652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                 # ecx<- BBBB
7653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
7654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
7655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
7657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # got null?
7659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved base method
7660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%eax)                   # restore method->clazz
7661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_INVOKE_SUPER_continue        # good to go - continue
7662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # handle exception
7663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
7666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method
7667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_nsm:
7669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_name(%ecx),%eax
7670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     %eax,OUT_ARG1(%esp)
7671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errNoSuchMethod
7672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */
7674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
7677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   TMP_SPILL  <- "this" register
7678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Things a bit ugly on this path, but it's the less
7679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * frequent one.  We'll have to do some reloading.
7680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_resolve:
7682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     SPILL_TMP(%ecx)
7683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
7684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
7686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
7687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
7688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     $METHOD_DIRECT,OUT_ARG2(%esp)
7689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %eax,OUT_ARG1(%esp)
7690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %ecx,OUT_ARG0(%esp)
7691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     call     dvmResolveMethod # eax<- call(clazz, ref, flags)
7692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL_TMP(%ecx)
7693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     testl    %eax,%eax
7694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jne      .LOP_INVOKE_DIRECT_finish
7695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jmp      common_exceptionThrown
7697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_STATIC */
7699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_STATIC_continue:
7701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_STATIC,%eax
7702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
7703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod          # call(clazz,ref,flags)
7705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # got null?
7707c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange
7708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown
7709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_INTERFACE */
7711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_INTERFACE_continue:
7713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
7714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax
7716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_exceptionThrown
7717c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp        common_invokeMethodNoRange
7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL_RANGE */
7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_more:
7723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
7724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
7725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
7726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
7727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                   # got null?
7729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # no, continue
7730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown      # yes, handle exception
7731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   eax = resolved base method
7734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   ecx = scratch
7735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_continue:
7737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
7738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if       (!1)
7739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
7740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
7742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
7743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %ecx,%ecx                 # null this?
7744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je        common_errNullObject      # go if so
7745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
7746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
7747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
7748c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
7749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */
7751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
7754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method [r0]
7755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax = method->clazz [r9]
7756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue:
7758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
7759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
7760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
7761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jae     .LOP_INVOKE_SUPER_RANGE_nsm           # method not present in superclass
7762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
7764c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp     common_invokeMethodRange
7765c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* At this point:
7768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ecx = null (needs to be resolved base method)
7769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * eax = method->clazz
7770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
7771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve:
7772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL_TMP(%eax)                     # method->clazz
7773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
7774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  2(rPC),%ecx                 # ecx<- BBBB
7775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
7776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
7777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
7779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   %eax,%eax                   # got null?
7781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved base method
7782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL_TMP(%eax)                   # restore method->clazz
7783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_INVOKE_SUPER_RANGE_continue        # good to go - continue
7784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown      # handle exception
7785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
7788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = resolved base method
7789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm:
7791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_name(%ecx),%eax
7792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     %eax,OUT_ARG1(%esp)
7793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errNoSuchMethod
7794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */
7796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   TMP_SPILL  <- "this" register
7800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Things a bit ugly on this path, but it's the less
7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * frequent one.  We'll have to do some reloading.
7802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve:
7804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     SPILL_TMP(%ecx)
7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
7809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     $METHOD_DIRECT,OUT_ARG2(%esp)
7811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %eax,OUT_ARG1(%esp)
7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     movl     %ecx,OUT_ARG0(%esp)
7813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     call     dvmResolveMethod # eax<- call(clazz, ref, flags)
7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL_TMP(%ecx)
7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     testl    %eax,%eax
7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jne      .LOP_INVOKE_DIRECT_RANGE_finish
7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     UNSPILL(rPC)
7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     jmp      common_exceptionThrown
7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_STATIC_RANGE */
7821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_STATIC_RANGE_continue:
7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $METHOD_STATIC,%eax
7824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
7825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call      dvmResolveMethod          # call(clazz,ref,flags)
7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl     %eax,%eax                 # got null?
7829c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange
7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       common_exceptionThrown
7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_INTERFACE_RANGE */
7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_INTERFACE_RANGE_continue:
7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl      %eax,%eax
7838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je         common_exceptionThrown
7839c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp        common_invokeMethodRange
7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_INT */
7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_continue:
7845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
7848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
7851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_FLOAT_TO_INT_special_case # fix up result
7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_finish:
7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_special_case:
7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_FLOAT_TO_INT_isNaN
7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
7863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_FLOAT_TO_INT_finish
7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_INT_isNaN:
7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
7871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_FLOAT_TO_INT_finish
7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */
7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_continue:
7878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
7884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_FLOAT_TO_LONG_special_case # fix up result
7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_finish:
7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_special_case:
7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
7893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
7894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_FLOAT_TO_LONG_isNaN
7895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
7896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
7898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_FLOAT_TO_LONG_finish
7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FLOAT_TO_LONG_isNaN:
7901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
7902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_FLOAT_TO_LONG_finish
7906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_INT */
7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_continue:
7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
7916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DOUBLE_TO_INT_special_case # fix up result
7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_finish:
7921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_special_case:
7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
7927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_DOUBLE_TO_INT_isNaN
7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
7929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
7931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_DOUBLE_TO_INT_finish
7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_isNaN:
7934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_DOUBLE_TO_INT_finish
7939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */
7941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_continue:
7944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%eax
7946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
7947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl      (rFP,%ecx,4),%eax
7948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
7949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
7950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je       .LOP_DOUBLE_TO_LONG_special_case # fix up result
7952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_finish:
7954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
7955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_special_case:
7958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fnstsw   %ax
7959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sahf
7960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jp       .LOP_DOUBLE_TO_LONG_isNaN
7961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
7962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   jmp       .LOP_DOUBLE_TO_LONG_finish
7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_isNaN:
7967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,(rFP,%ecx,4)
7968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
7970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       .LOP_DOUBLE_TO_LONG_finish
7972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT */
7974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_continue_div:
7975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
7976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
7977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_finish_div:
7978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecl<- AA
7979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,%ecx)
7980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT */
7986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_continue_div:
7987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
7988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
7989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_finish_div:
7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecl<- AA
7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,%ecx)
7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
7994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
7995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
7996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG */
7998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_continue:
8000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
8001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl    rINST_HI,%ecx       # ecx<- A
8002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,4(rFP,%ecx,4)  # v[B+1]<- %edx
8003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)                  # restore rPC/%edx
8004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
8006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(rFP,%ecx,4)   # v[B]<- %eax
8007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_LONG */
8011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_continue:
8013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __divdi3
8014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_finish:
8015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx
8016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_check_zero:
8024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_notSpecial
8026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_check_neg1:
8029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_notSpecial
8031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
8032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
8033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_notSpecial1
8035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_notSpecial1
8037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%edx
8040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_finish
8041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_LONG */
8043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_continue:
8045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __moddi3
8046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_finish:
8047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,%ecx
8048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_check_zero:
8056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_notSpecial
8058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_check_neg1:
8061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_notSpecial
8063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
8064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
8065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_notSpecial1
8067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_notSpecial1
8069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
8072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_finish
8073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG */
8075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_finish:
8077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- %eax
8078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG */
8082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_finish:
8085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- eax
8086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG */
8090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_finish:
8093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)        # v[BB+0]<- eax
8094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT_2ADDR */
8099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_2ADDR_continue_div2addr:
8100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_2ADDR_finish_div2addr:
8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
8104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT_2ADDR */
8110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_2ADDR_continue_div2addr:
8111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_2ADDR_finish_div2addr:
8114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
8115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG_2ADDR */
8121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_2ADDR_continue:
8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
8124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %edx,4(rIBASE)      # v[A+1]<- %edx
8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)                  # restore rPC/%edx
8126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %eax,(rIBASE)       # v[A]<- %eax
8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
8129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rIBASE)
8130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_LONG_2ADDR */
8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_continue:
8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
8138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
8139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __divdi3
8140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_finish:
8141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%ecx
8142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_check_zero:
8150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_2ADDR_notSpecial
8152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_LONG_2ADDR_check_neg1:
8155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_DIV_LONG_2ADDR_notSpecial
8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
8158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
8159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_2ADDR_notSpecial1
8161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_DIV_LONG_2ADDR_notSpecial1
8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0x80000000,%edx
8166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_DIV_LONG_2ADDR_finish
8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_LONG_2ADDR */
8169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_continue:
8171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
8172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
8173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
8174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     __moddi3
8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_finish:
8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,%ecx
8177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
8180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_check_zero:
8185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,rPC
8186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_2ADDR_notSpecial
8187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_errDivideByZero
8189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_LONG_2ADDR_check_neg1:
8190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl   rPC,%eax
8191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .LOP_REM_LONG_2ADDR_notSpecial
8192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
8193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
8194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl    rPC,rPC
8195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_2ADDR_notSpecial1
8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl     $0x80000000,%ecx
8197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne      .LOP_REM_LONG_2ADDR_notSpecial1
8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
8199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl     %eax,%eax
8200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     $0,%edx
8201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      .LOP_REM_LONG_2ADDR_finish
8202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */
8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish:
8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
8208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */
8213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish:
8216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
8217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */
8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish:
8225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[AA+0]<- eax
8226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(1)
8227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(1)
8228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT_LIT16 */
8231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT16_continue_div:
8232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT16_finish_div:
8235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
8236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT_LIT16 */
8242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT16_continue_div:
8243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT16_finish_div:
8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
8247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DIV_INT_LIT8 */
8253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT8_continue_div:
8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DIV_INT_LIT8_finish_div:
8257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
8258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_REM_INT_LIT8 */
8264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT8_continue_div:
8265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cltd
8266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    idivl   %ecx
8267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_REM_INT_LIT8_finish_div:
8268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
8269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(2)
8271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(2)
8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */
8275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_continue:
8277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Extract args, call function.
8279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  ecx = #of args (0-4)
8280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  eax = call index
8281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  @esp = return addr
8282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  esp is -4 from normal
8283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  Go ahead and load all 4 args, even if not used.
8285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl    4(rPC),rPC
8287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG0(%esp)
8293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG1(%esp)
8299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG2(%esp)
8305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      $0xf,%ecx
8307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andl      rPC,%ecx
8308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(%ecx,%ecx)
8309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sarl      $4,rPC
8310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl      %ecx,4+OUT_ARG3(%esp)
8311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sall      $4,%eax      # index *= sizeof(table entry)
8313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp       *gDvmInlineOpsTable(%eax)
8314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    # will return to caller of .LOP_EXECUTE_INLINE_continue
8315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
8317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterEnd
8318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterEnd:
8319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/entry.S */
8321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
8323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
8325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
8326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
8327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
8329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
8331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
8332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
8334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
8335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
8339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdRun
8340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdRun, %function
8341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * bool dvmMterpStdRun(MterpGlue* glue)
8343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point.  Returns changeInterp.
8345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun:
8348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebp
8349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,%ebp
8350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %edi
8351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %esi
8352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebx
8353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* at this point, stack is misaligned by 1 word
8355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   We're allocating spill space for 6 words, plus
8356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   outgoing argument (5 words) and local variables
8357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   (4 words) - 15 words or 60 bytes total. See
8358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   diagram in header.S
8359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
8360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl   $60,%esp
8361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Set up "named" registers */
8363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    IN_ARG0(%ebp),%ecx
8364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,rGLUE_SPILL(%ebp)
8365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FROM_GLUE(%ecx)
8366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_FP_FROM_GLUE(%ecx)
8367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $dvmAsmInstructionStart,rIBASE
8368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Remember %esp for future "longjmp" */
8370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,offGlue_bailPtr(%ecx)
8371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* How to start? */
8373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    offGlue_entryPoint(%ecx),%al
8374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Normal start? */
8376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb    $kInterpEntryInstr,%al
8377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     .Lnot_instr
8378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   /* Normal case: start executing the instruction at rPC */
8380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
8381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_instr:
8384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Reset to normal case */
8385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb   $kInterpEntryInstr,offGlue_entryPoint(%ecx)
8386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb   $kInterpEntryReturn,%al
8387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     common_returnFromMethod
8388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpb   $kInterpEntryThrow,%al
8389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je     common_exceptionThrown
8390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzx  %al,%eax
8391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %eax,OUT_ARG1(%esp)
8392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   $.LstrBadEntryPoint,OUT_ARG0(%esp)
8393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call   printf
8394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call   dvmAbort
8395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Not reached */
8396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdBail
8399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdBail, %function
8400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * void dvmMterpStdBail(MterpGlue* glue, bool changeInterp)
8402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
8404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
8405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
8406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We're not going to build a standard frame here, so the arg accesses will
8408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * look a little strange.
8409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  esp+4 (arg0)  MterpGlue* glue
8412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  esp+8 (arg1)  bool changeInterp
8413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail:
8415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    4(%esp),%ecx                 # grab glue
8416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    8(%esp),%eax                 # changeInterp to return reg
8417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_bailPtr(%ecx),%esp   # Stack back to normal
8418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl    $60,%esp                    # Strip dvmMterpStdRun's frame
8419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebx
8420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %esi
8421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %edi
8422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebp
8423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret                                  # return to dvmMterpStdRun's caller
8424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings
8428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section    .rodata
8430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint:
8431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Bad entry point %d\n"
8432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: x86/footer.S */
8434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
8436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
8438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
8439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
8440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
8442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
8444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
8445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
8447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
8448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common subroutines and data.
8451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backwards branch is taken
8455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ebx (a.k.a. rINST_FULL) -> PC adjustment in 16-bit words
8458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch:
8460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8461c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    call   common_periodicChecks  # Note: expects rPC to be preserved
8462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
8463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()
8464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8466c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8467c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8468c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch/*
8469c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch * Common code for method invocation with range.
8470c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *
8471c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch * On entry:
8472c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *   eax = Method* methodToCall
8473c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *   rINST trashed, must reload
8474c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch */
8475c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8476c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birchcommon_invokeMethodRange:
8477c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNewRange:
8478c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8479c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8480c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * prepare to copy args to "outs" area of current frame
8481c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8482c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8483c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- AA
8484c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      4(rPC), %ecx            # %ecx<- CCCC
8485c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SPILL(rPC)
8486c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
8487c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    test        rINST_FULL, rINST_FULL
8488c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- AA
8489c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jz          .LinvokeArgsDone        # no args; jump to args done
8490c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8491c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8492c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8493c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, %ecx=CCCC, LOCAL0_OFFSET(%ebp)=count, %edx=&outs (&stackSaveArea)
8494c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * (very few methods have > 10 args; could unroll for common cases)
8495c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8496c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8497c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ebx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- save %ebx
8498c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         (rFP, %ecx, 4), %ecx    # %ecx<- &vCCCC
8499c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shll        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
8500c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        LOCAL0_OFFSET(%ebp), %edx       # %edx<- update &outs
8501c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shrl        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
8502c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch1:
8503c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (%ecx), %ebx            # %ebx<- vCCCC
8504c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%ecx), %ecx           # %ecx<- &vCCCC++
8505c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        $1, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET<- LOCAL0_OFFSET--
8506c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ebx, (%edx)            # *outs<- vCCCC
8507c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%edx), %edx           # outs++
8508c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         1b                      # loop if count (LOCAL0_OFFSET(%ebp)) not zero
8509c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ebx       # %ebx<- restore %ebx
8510c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp         .LinvokeArgsDone        # continue
8511c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8512c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8513c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax is "Method* methodToCall", the method we're trying to call
8514c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * prepare to copy args to "outs" area of current frame
8515c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8516c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8517c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birchcommon_invokeMethodNoRange:
8518c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNewNoRange:
8519c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- BA
8520c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SPILL(rPC)
8521c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BA
8522c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shrl        $4, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- B
8523c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          .LinvokeArgsDone        # no args; jump to args done
8524c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      4(rPC), %ecx            # %ecx<- GFED
8525c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
8526c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8527c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8528c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, %ecx=GFED, LOCAL0_OFFSET(%ebp)=count, %edx=outs
8529c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8530c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8531c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNonRange:
8532c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $2, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 2
8533c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- GFED
8534c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          1f                      # handle 1 arg
8535c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          2f                      # handle 2 args
8536c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $4, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 4
8537c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          3f                      # handle 3 args
8538c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          4f                      # handle 4 args
8539c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch5:
8540c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    andl        $15, rINST_FULL        # rINST<- A
8541c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8542c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, rINST_FULL, 4), %ecx # %ecx<- vA
8543c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vA
8544c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8545c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch4:
8546c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $12, %ecx              # %ecx<- G
8547c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8548c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vG
8549c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vG
8550c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8551c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch3:
8552c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x0f00, %ecx          # %ecx<- 0F00
8553c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $8, %ecx               # %ecx<- F
8554c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8555c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vF
8556c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vF
8557c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8558c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch2:
8559c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x00f0, %ecx          # %ecx<- 00E0
8560c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $4, %ecx               # %ecx<- E
8561c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8562c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vE
8563c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vE
8564c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8565c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch1:
8566c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x000f, %ecx          # %ecx<- 000D
8567c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vD
8568c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, -4(%edx)          # *--outs<- vD
8569c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch0:
8570c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8571c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8572c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax is "Method* methodToCall", the method we're trying to call
8573c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * find space for the new stack frame, check for overflow
8574c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8575c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8576c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeArgsDone:
8577c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      offMethod_registersSize(%eax), %edx # %edx<- methodToCall->regsSize
8578c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      offMethod_outsSize(%eax), %ecx # %ecx<- methodToCall->outsSize
8579c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, LOCAL0_OFFSET(%ebp)       # LOCAL0_OFFSET<- methodToCall
8580c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shl         $2, %edx               # %edx<- update offset
8581c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%eax,rFP)          # %eax<- &StackSaveArea
8582c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        %edx, %eax              # %eax<- newFP; (old savearea - regsSize)
8583c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%edx)                      # %edx<- pMterpGlue
8584c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- &outs
8585c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        $sizeofStackSaveArea, %eax # %eax<- newSaveArea (stack save area using newFP)
8586c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_interpStackEnd(%edx), %edx # %edx<- glue->interpStackEnd
8587c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, LOCAL2_OFFSET(%ebp)       # LOCAL2_OFFSET<- glue->interpStackEnd
8588c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shl         $2, %ecx               # %ecx<- update offset for outsSize
8589c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, %edx              # %edx<- newSaveArea
8590c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    sub         %ecx, %eax              # %eax<- bottom; (newSaveArea - outsSize)
8591c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         LOCAL2_OFFSET(%ebp), %eax       # compare interpStackEnd and bottom
8592c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL0_OFFSET(%ebp), %eax       # %eax<- restore methodToCall
8593c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          .LstackOverflow         # handle frame overflow
8594c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8595c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8596c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * set up newSaveArea
8597c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8598c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8599c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch#ifdef EASY_GDB
8600c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%ecx,rFP)          # %ecx<- &StackSaveArea
8601c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, offStackSaveArea_prevSave(%edx) # newSaveArea->prevSave<- &outs
8602c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch#endif
8603c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offStackSaveArea_prevFrame(%edx) # newSaveArea->prevFrame<- rFP
8604c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rPC_SPILL(%ebp), %ecx
8605c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, offStackSaveArea_savedPc(%edx) # newSaveArea->savedPc<- rPC
8606c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    testl       $ACC_NATIVE, offMethod_accessFlags(%eax) # check for native call
8607c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, offStackSaveArea_method(%edx) # newSaveArea->method<- method to call
8608c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         .LinvokeNative          # handle native call
8609c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8610c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8611c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * Update "glue" values for the new method
8612c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFp
8613c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8614c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8615c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offMethod_clazz(%eax), %edx # %edx<- method->clazz
8616c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
8617c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex
8618c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, offGlue_method(%ecx) # glue->method<- methodToCall
8619c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, offGlue_methodClassDex(%ecx) # glue->methodClassDex<- method->clazz->pDvmDex
8620c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offMethod_insns(%eax), rPC # rPC<- methodToCall->insns
8621c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%ecx), %eax # %eax<- glue->self
8622c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
8623c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- newFP
8624c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    FETCH_INST()
8625c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GOTO_NEXT                           # jump to methodToCall->insns
8626c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8627c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8628c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * Prep for the native call
8629c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFP, %edx=newSaveArea
8630c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8631c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8632c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNative:
8633c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
8634c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
8635c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%ecx), %ecx        # %ecx<- glue->self
8636d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        offThread_jniLocal_topCookie(%ecx), %eax # %eax<- self->localRef->...
8637d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        %eax, offStackSaveArea_localRefCookie(%edx) # newSaveArea->localRefCookie<- top
8638c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, OUT_ARG4(%esp)    # save newSaveArea
8639c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %edx # %edx<- newFP
8640c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, offThread_curFrame(%ecx)  # glue->self->curFrame<- newFP
8641c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG3(%esp)    # save glue->self
8642c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG2(%esp)    # push parameter glue->self
8643c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
8644c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG1(%esp), %eax    # %eax<- methodToCall
8645c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         offGlue_retval(%ecx), %ecx # %ecx<- &retval
8646c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG0(%esp)    # push parameter pMterpGlue
8647c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    push        %edx                    # push parameter newFP
8648c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8649c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    call        *offMethod_nativeFunc(%eax) # call methodToCall->nativeFunc
8650c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%esp), %esp
8651c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG4(%esp), %ecx    # %ecx<- newSaveArea
8652c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG3(%esp), %eax    # %eax<- glue->self
8653d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        offStackSaveArea_localRefCookie(%ecx), %edx # %edx<- old top
8654c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $0, offThread_exception(%eax) # check for exception
8655c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- rFP
8656d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
8657c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    UNSPILL(rPC)
8658c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         common_exceptionThrown  # handle exception
8659c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    FETCH_INST_WORD(3)
8660c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    ADVANCE_PC(3)
8661c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GOTO_NEXT                           # jump to next instruction
8662c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
86636ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow:    # eax=methodToCall
86646ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
8665c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%eax)                      # %eax<- pMterpGlue
8666c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%eax), %eax # %eax<- glue->self
8667c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, OUT_ARG0(%esp)    # push parameter self
86686ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    call        dvmHandleStackOverflow  # call: (Thread* self, Method* meth)
8669c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    UNSPILL(rPC)                        # return: void
8670c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp         common_exceptionThrown  # handle exception
8671c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8672c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common invoke code (old-style).
8675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING:  Rewrite along lines of new armv5 code?
8676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   eax = Method* methodToCall
8679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ecx = bool methodCallRange
8680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   rINST trashed, must reload
8681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeOld:
8683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)     # arg1<- methodCallRange
8684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl  (rPC),rINST_FULL         # recover rINST
8686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG2(%esp)     # arg2<- method
8687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzwl   4(rPC),%eax             # eax<- GFED or CCCC
8688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
8689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
8690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
8691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     rINST_FULL,OUT_ARG3(%esp)# arg3<- AA
8692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)     # arg0<- GLUE
8693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl     %eax,OUT_ARG4(%esp)     # arg4<- GFED/CCCC
8694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     dvmMterp_invokeMethod
8695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp      common_resumeAfterGlueCall
8696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Do we need the thread to be suspended or have debugger/profiling activity?
8700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
8702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ebx  -> PC adjustment in 16-bit words (must be preserved)
8703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   ecx  -> GLUE pointer
8704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: A call will normally kill %eax, rPC/%edx and %ecx.  To
8706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       streamline the normal case, this routine will preserve rPC and
8707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       %ecx in addition to the normal caller save regs.  The save/restore
8708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       is a bit ugly, but will happen in the relatively uncommon path.
8709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TUNING: Might be worthwhile to inline this.
8710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: Basic-block style Jit will need a hook here as well.  Fold it into
8711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       the suspendCount check so we can get both in 1 shot.
8712c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * TODO: to match the other intepreters, this should handle suspension
8713c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *       and then check for debugger/profiling after dvmCheckSuspendPending
8714c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *       returns.
8715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks:
8717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_pSelfSuspendCount(%ecx),%eax    # eax <- &suspendCount
8718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $0,(%eax)
8719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne     1f
8720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
8722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER)
8723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   offGlue_pDebuggerActive(%ecx),%eax      # eax <- &DebuggerActive
8724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_PROFILER)
8726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   offGlue_pActiveProfilers(%ecx),%ecx     # ecx <- &ActiveProfilers
8727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) && defined(WITH_PROFILER)
8729c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    # TODO: check for NULL before load
8730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
8731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orl    (%ecx),%eax             # eax <- debuggerActive || activeProfilers
8732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_DEBUGGER)
8733c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    # TODO: check for NULL before load
8734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
8735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#elif defined(WITH_PROFILER)
8736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   (%ecx),%eax             # eax <= activeProfilers
8737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)                 # restore rGLUE
8739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    testl  %eax,%eax
8740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jne    3f                      # one or both active - switch interp
8741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret
8744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Check for suspend */
8746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
8747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*  At this point, the return pointer to the caller of
8748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  common_periodicChecks is on the top of stack.  We need to preserve
8749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  rPC(edx) and GLUE(ecx).  We'll spill rPC, and reload GLUE.
8750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  The outgoing profile is:
8751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      bool dvmCheckSuspendPending(Thread* self)
8752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  Because we reached here via a call, go ahead and build a new frame.
8753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
875499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         # need for precise GC
8755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%eax      # eax<- glue->self
8756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)                      # save edx
8757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    push    %ebp
8758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %esp,%ebp
8759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subl    $24,%esp
8760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmCheckSuspendPending
8762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addl    $24,%esp
8763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pop     %ebp
8764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ret
8767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Switch interpreters */
8769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Note: %ebx contains the 16-bit word offset to be applied to rPC to
8770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "complete" the interpretation of backwards branches.  In effect, we
8771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * are completing the interpretation of the branch instruction here,
8772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and the new interpreter will resume interpretation at the branch
8773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * target. However, a switch request recognized during the handling
8774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * of a return from method instruction results in an immediate abort,
8775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and the new interpreter will resume by re-interpreting the return
8776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction.
8777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:
8779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    leal    (rPC,%ebx,2),rPC       # adjust pc to show target
8780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)                 # bail expect GLUE already loaded
8781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $1,rINST_FULL         # set changeInterp to true
8782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_gotoBail
8783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction
8787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod:
8789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Set entry mode in case we bail */
8791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    $kInterpEntryReturn,offGlue_entryPoint(%ecx)
8792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    rINST_FULL,rINST_FULL   # zero offset in case we switch interps
8793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    common_periodicChecks   # Note: expects %ecx to be preserved
8794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(%eax,rFP)                    # eax<- saveArea (old)
8796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offStackSaveArea_prevFrame(%eax),rFP  # rFP<- prevFrame
8797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST_FULL
8798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpl    $0,rINST_FULL                        # break?
8799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    je      common_gotoBail    # break frame, bail out completely
8800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offStackSaveArea_savedPc(%eax),rPC    # pc<- saveArea->savedPC
8802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offGlue_self(%ecx),%eax               # eax<- self
8803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rINST_FULL,offGlue_method(%ecx)  # glue->method = newSave->meethod
8804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    rFP,offThread_curFrame(%eax)     # self->curFrame = fp
8805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offMethod_clazz(rINST_FULL),%eax # eax<- method->clazz
8806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST_WORD(3)
8807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    offClassObject_pDvmDex(%eax),%eax # eax<- method->clazz->pDvmDex
8808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ADVANCE_PC(3)
8809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,offGlue_methodClassDex(%ecx)
8810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* not bailing - restore entry mode to default */
8811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movb    $kInterpEntryInstr,offGlue_entryPoint(%ecx)
8812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_NEXT
8813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Prepare to strip the current frame and "longjump" back to caller of
8816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dvmMterpStdRun.
8817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on entry:
8819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    rINST_FULL holds changeInterp
8820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    ecx holds glue pointer
8821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected profile: dvmMterpStdBail(MterpGlue *glue, bool changeInterp)
8823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail:
8825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)                # export state to glue
8826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
8827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   %ecx,OUT_ARG0(%esp)           # glue in arg0
8828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl   rINST_FULL,OUT_ARG1(%esp)     # changeInterp in arg1
8829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmMterpStdBail              # bail out....
8830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated values
8834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and start executing at the next instruction.
8835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project common_resumeAfterGlueCall:
8837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GET_GLUE(%ecx)
8838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     LOAD_PC_FROM_GLUE(%ecx)
8839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     LOAD_FP_FROM_GLUE(%ecx)
8840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     FETCH_INST()
8841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     GOTO_NEXT
8842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero
8845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero:
8847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrArithmeticException,%eax
8849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrDivideByZero,%eax
8851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
8856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
8859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize:
8861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrNegativeArraySizeException,%eax
8863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
8865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
8870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
8873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod:
8875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrNoSuchMethodError,%eax
8878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
8880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
8885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Hit a null object when we weren't expecting one.  Export the PC, throw a
8888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NullPointerException and goto the exception processing code.
8889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject:
8891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrNullPointerException,%eax
8893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
8895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
8900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Array index exceeds max.
8903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex:
8905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrArrayIndexException,%eax
8907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
8909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
8914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value.
8916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore:
8918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $.LstrArrayStoreException,%eax
8920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
8921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    xorl    %eax,%eax
8922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
8923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rPC)
8924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmThrowException
8925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rPC)
8926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_exceptionThrown
8927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception.  Handle it.
8930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling
8932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
8933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be.
8934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
8936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown:
8938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_GLUE(%ecx)
8939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
8940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
8941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
8942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call    dvmMterp_exceptionThrown
8943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    jmp     common_resumeAfterGlueCall
8944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort:
8946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movl    $0xdeadf00d,%eax
8947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    call     *%eax
8948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Strings
8952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section     .rodata
8955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException:
8956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz    "Ljava/lang/NullPointerException;"
8957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException:
8958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArithmeticException;"
8959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero:
8960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "divide by zero"
8961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException:
8962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
8963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException:
8964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayStoreException;"
8965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException:
8966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NegativeArraySizeException;"
8967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError:
8968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InstantiationError;"
8969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException:
8970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ClassCastException;"
8971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError:
8972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NoSuchMethodError;"
8973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError:
8974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InternalError;"
8975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl:
8976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "filled-new-array only implemented for 'int'"
8977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8978