InterpAsm-x86.S revision c4080f6bdeda19901a508cc75f96ac7e07903918
189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * This file was generated automatically by gen-mterp.py for 'x86'.
389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * --> DO NOT EDIT <--
589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/header.S */
889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
1089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
1189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
1289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * you may not use this file except in compliance with the License.
1389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * You may obtain a copy of the License at
1489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
1589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
1789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * See the License for the specific language governing permissions and
2189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * limitations under the License.
2289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
2389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
2489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * 32-bit x86 definitions and declarations.
2589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
2689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
2789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
2889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project386 ABI general notes:
2989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
3089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectCaller save set:
3189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   eax, edx, ecx, st(0)-st(7)
3289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectCallee save set:
3389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   ebx, esi, edi, ebp
3489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectReturn regs:
3589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   32-bit in eax
3689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   64-bit in edx:eax (low-order 32 in eax)
3789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   fp on top of fp stack st(0)
3889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
3989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectParameters passed on stack, pushed right-to-left.  On entry to target, first
4089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectparm is at 4(%esp).  Traditional entry code is:
4189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
4289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectfunctEntry:
4389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    push    %ebp             # save old frame pointer
4489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    mov     %ebp,%esp        # establish new frame pointer
4589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sub     FrameSize,%esp   # Allocate storage for spill, locals & outs
4689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
4789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectOnce past the prologue, arguments are referenced at ((argno + 2)*4)(%ebp)
4889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
4989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectAlignment of stack not strictly required, but should be for performance.  We'll
5089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectalign frame sizes to 16-byte multiples.
5189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
5289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectIf we're not doing variable stack allocation (alloca), the frame pointer can be
5389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projecteliminated and all arg references adjusted to be esp relative.
5489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
5589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectMterp notes:
5689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
5789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectSome key interpreter variables will be assigned to registers.  Note that each
5889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectwill also have an associated spill location (mostly used useful for those assigned
5989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectto callee save registers).
6089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
6189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project  nick     reg   purpose
6289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project  rPC      edx   interpreted program counter, used for fetching instructions
6389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project  rFP      esi   interpreted frame pointer, used for accessing locals and args
6489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project  rIBASE   edi   Base pointer for instruction dispatch computed goto
6589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project  rINST    bx    first 16-bit code of current instruction
6689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project  rOPCODE  bl    opcode portion of instruction word
6789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project  rINST_HI bh    high byte of instruction word, usually contains src/tgt reg names
6889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
6989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectNotes:
7089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   o High order 16 bits of ebx must be zero on entry to handler
7189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   o rPC, rFP, rIBASE, rINST/rOPCODE valid on handler entry and exit
7289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   o eax and ecx are scratch, rINST/ebx sometimes scratch
7389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   o rPC is in the caller save set, and will be killed across external calls. Don't
7489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     forget to SPILL/UNSPILL it around call points
7589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
7689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project*/
7789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
7889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rPC      %edx
7989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rFP      %esi
8089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rIBASE   %edi
8189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rINST_FULL %ebx
8289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rINST    %bx
8389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rINST_HI %bh
8489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rINST_LO %bl
8589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rOPCODE  %bl
8689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
8789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
8889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* Frame diagram while executing dvmMterpStdRun, high to low addresses */
8989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define IN_ARG0        (  8)
9089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define CALLER_RP      (  4)
9189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define PREV_FP        (  0) /* <- dvmMterpStdRun ebp */
9289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* Spill offsets relative to %ebp */
9389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define EDI_SPILL      ( -4)
9489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define ESI_SPILL      ( -8)
9589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define EDX_SPILL      (-12) /* <- esp following dmMterpStdRun header */
9689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rPC_SPILL      (-16)
9789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rFP_SPILL      (-20)
9889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rGLUE_SPILL    (-24)
9989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rIBASE_SPILL   (-28)
10089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define rINST_FULL_SPILL    (-32)
10189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define TMP_SPILL      (-36)
10289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define LOCAL0_OFFSET  (-40)
10389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define LOCAL1_OFFSET  (-44)
10489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define LOCAL2_OFFSET  (-48)
10589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define LOCAL3_OFFSET  (-52)
10689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* Out Arg offsets, relative to %sp */
10789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define OUT_ARG4       ( 16)
10889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define OUT_ARG3       ( 12)
10989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define OUT_ARG2       (  8)
11089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define OUT_ARG1       (  4)
11189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define OUT_ARG0       (  0)  /* <- dvmMterpStdRun esp */
11289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
11389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define SPILL(reg) movl reg##,reg##_SPILL(%ebp)
11489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define UNSPILL(reg) movl reg##_SPILL(%ebp),reg
11589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define SPILL_TMP(reg) movl reg,TMP_SPILL(%ebp)
11689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define UNSPILL_TMP(reg) movl TMP_SPILL(%ebp),reg
11789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
11889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
11989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* save/restore the PC and/or FP from the glue struct */
12089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define LOAD_PC_FROM_GLUE(_glu)     movl    offGlue_pc(_glu),rPC
12189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define SAVE_PC_TO_GLUE(_glu)       movl    rPC,offGlue_pc(_glu)
12289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define LOAD_FP_FROM_GLUE(_glu)     movl    offGlue_fp(_glu),rFP
12389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define SAVE_FP_TO_GLUE(_glu)       movl    rFP,offGlue_fp(_glu)
12489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
12589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define GET_GLUE(_reg)     movl   rGLUE_SPILL(%ebp),_reg
12689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
12789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* The interpreter assumes a properly aligned stack on entry, and
12889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * will preserve 16-byte alignment.
12989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
13089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
13189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
13289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * "export" the PC to the interpreted stack frame, f/b/o future exception
13389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * objects.  Must * be done *before* something calls dvmThrowException.
13489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
13589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
13689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
13789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
13889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * It's okay to do this more than once.
13989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
14089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define EXPORT_PC() \
14189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rPC, (-sizeofStackSaveArea + offStackSaveArea_currentPc)(rFP)
14289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
14389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
14489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Given a frame pointer, find the stack save area.
14589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
14689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * In C this is "((StackSaveArea*)(_fp) -1)".
14789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
14889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define SAVEAREA_FROM_FP(_reg, _fpreg) \
14989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    -sizeofStackSaveArea(_fpreg),_reg
15089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
15189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
15289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
15389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
15489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define FETCH_INST()            movzwl    (rPC),rINST_FULL
15589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
15689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
15789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Fetch the nth instruction word from rPC into rINST.  Does not advance
15889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * rPC, and _count is in words
15989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
16089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define FETCH_INST_WORD(_count)  movzwl  _count*2(rPC),rINST_FULL
16189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
16289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
16389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Fetch instruction word indexed (used for branching).
16489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Index is in instruction word units.
16589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
16689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define FETCH_INST_INDEXED(_reg) movzwl  (rPC,_reg,2),rINST_FULL
16789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
16889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
16989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Extract the opcode of the instruction in rINST
17089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
17189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define EXTRACT_OPCODE(_reg)   movzx rOPCODE,_reg
17289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
17389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
17489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Advance rPC by instruction count
17589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
17689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define ADVANCE_PC(_count)    leal  2*_count(rPC),rPC
17789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
17889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
17989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Advance rPC by branch offset in register
18089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
18189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define ADVANCE_PC_INDEXED(_reg) leal (rPC,_reg,2),rPC
18289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
18389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
18489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Note: assumes opcode previously fetched and in rINST, and
18589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *       %eax is killable at this point.
18689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
18789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#if 1
18889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.macro GOTO_NEXT
18989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* For computed next version */
19089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movzx    rOPCODE,%eax
19189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     sall     $6,%eax
19289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     addl     rIBASE,%eax
19389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     jmp      *%eax
19489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.endm
19589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#else
19689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   /* For jump table version */
19789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.macro GOTO_NEXT
19889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movzx   rOPCODE,%eax
19989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     jmp     *(rIBASE,%eax,4)
20089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.endm
20189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#endif
20289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
20389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
20489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Get/set the 32-bit value from a Dalvik register.
20589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
20689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define GET_VREG(_reg, _vreg)   movl     (rFP,_vreg,4),_reg
20789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define SET_VREG(_reg, _vreg)   movl     _reg,(rFP,_vreg,4)
20889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define GET_VREG_WORD(_reg, _vreg, _offset)   movl     4*(_offset)(rFP,_vreg,4),_reg
20989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#define SET_VREG_WORD(_reg, _vreg, _offset)   movl     _reg,4*(_offset)(rFP,_vreg,4)
21089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
21189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
21289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * This is a #include, not a %include, because we want the C pre-processor
21389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * to expand the macros into assembler assignment statements.
21489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
21589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#include "../common/asm-constants.h"
21689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
21789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
21889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
21989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .global dvmAsmInstructionStart
22089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .type   dvmAsmInstructionStart, %function
22189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP
22289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .text
22389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
22489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
22589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
22689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_NOP: /* 0x00 */
22789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_NOP.S */
22889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
22989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
23089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
23189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
23289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
23389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
23489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE: /* 0x01 */
23589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE.S */
23689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* for move, move-object, long-to-int */
23789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB */
23889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
23989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb   $0xf,%al             # eax<- A
24089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
24189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
24289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
24389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
24489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
24589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
24689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
24789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
24889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
24989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */
25089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_FROM16.S */
25189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* for: move/from16, move-object/from16 */
25289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBBBB */
25389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%eax            # eax <= AA
25489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw     2(rPC),rINST             # rINST <= BBBB
25589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG (%ecx,rINST_FULL)        # ecx<- fp[BBBB]
25689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
25789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
25889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG (%ecx,%eax)              # fp[AA]<- ecx]
25989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
26089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
26189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
26289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
26389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
26489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */
26589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_16.S */
26689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* for: move/16, move-object/16 */
26789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAAAA, vBBBB */
26889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),%ecx              # ecx<- BBBB
26989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- AAAA
27089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
27189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
27289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
27389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
27489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
27589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
27689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
27789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
27889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */
27989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_WIDE.S */
28089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* move-wide vA, vB */
28189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
28289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                # ecx <- BA
28389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $12,rINST_FULL              # rinst_FULL<- B
28489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[B+0]
28589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[B+1]
28689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,%cl                    # ecx <- A
28789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rINST_FULL,%ecx,1)       # v[A+1]<- rINST_FULL
28889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
28989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
29089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)             # v[A+0]<- eax
29189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
29289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
29389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
29489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
29589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
29689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_WIDE_FROM16.S */
29789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* move-wide/from16 vAA, vBBBB */
29889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
29989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%ecx              # ecx<- BBBB
30089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%eax            # eax<- AAAA
30189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0)   # rINST_FULL<- v[BBBB+0]
30289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[BBBB+1]
30389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rINST_FULL,%eax,0)   # v[AAAA+0]<- rINST_FULL
30489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
30589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
30689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%ecx,%eax,1)         # v[AAAA+1]<- eax
30789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
30889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
30989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
31089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
31189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */
31289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_WIDE_16.S */
31389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* move-wide/16 vAAAA, vBBBB */
31489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
31589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),%ecx            # ecx<- BBBB
31689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax            # eax<- AAAA
31789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0) # rINST_WORD<- v[BBBB+0]
31889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)       # ecx<- v[BBBB+1]
31989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rINST_FULL,%eax,0) # v[AAAA+0]<- rINST_FULL
32089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
32189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
32289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%ecx,%eax,1)       # v[AAAA+1]<- ecx
32389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
32489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
32589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
32689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
32789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */
32889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_OBJECT.S */
32989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE.S */
33089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* for move, move-object, long-to-int */
33189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB */
33289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
33389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb   $0xf,%al             # eax<- A
33489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
33589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
33689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
33789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
33889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
33989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
34089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
34189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
34289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
34389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
34489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
34589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_OBJECT_FROM16.S */
34689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_FROM16.S */
34789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* for: move/from16, move-object/from16 */
34889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBBBB */
34989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%eax            # eax <= AA
35089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw     2(rPC),rINST             # rINST <= BBBB
35189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG (%ecx,rINST_FULL)        # ecx<- fp[BBBB]
35289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
35389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
35489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG (%ecx,%eax)              # fp[AA]<- ecx]
35589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
35689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
35789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
35889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
35989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
36089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
36189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */
36289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_OBJECT_16.S */
36389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_16.S */
36489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* for: move/16, move-object/16 */
36589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAAAA, vBBBB */
36689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),%ecx              # ecx<- BBBB
36789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- AAAA
36889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
36989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
37089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
37189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
37289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
37389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
37489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
37589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
37689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
37789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */
37889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_RESULT.S */
37989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* for: move-result, move-result-object */
38089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA */
38189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)                         # eax<- rGLUE
38289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx                 # ecx<- AA
38389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_retval(%eax),%eax     # eax<- glue->retval.l
38489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
38589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
38689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG (%eax,%ecx)                   # fp[AA]<- retval.l
38789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
38889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
38989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
39089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
39189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
39289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_RESULT_WIDE.S */
39389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* move-result-wide vAA */
39489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
39589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
39689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_retval(%ecx),%eax
39789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    4+offGlue_retval(%ecx),%ecx
39889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)    # v[AA+0] <- eax
39989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)    # v[AA+1] <- ecx
40089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
40189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
40289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
40389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
40489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
40589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
40689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
40789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_RESULT_OBJECT.S */
40889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_RESULT.S */
40989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* for: move-result, move-result-object */
41089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA */
41189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)                         # eax<- rGLUE
41289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx                 # ecx<- AA
41389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_retval(%eax),%eax     # eax<- glue->retval.l
41489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
41589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
41689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG (%eax,%ecx)                   # fp[AA]<- retval.l
41789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
41889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
41989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
42089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
42189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
42289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */
42389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE_EXCEPTION.S */
42489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* move-exception vAA */
42589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
42689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
42789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_self(%ecx),%ecx    # ecx<- glue->self
42889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offThread_exception(%ecx),%eax # eax<- dvmGetException bypass
42989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)          # fp[AA]<- exception object
43089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
43189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
43289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $0,offThread_exception(%ecx) # dvmClearException bypass
43389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
43489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
43589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
43689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
43789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */
43889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_RETURN_VOID.S */
43989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_returnFromMethod
44089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
44189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
44289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
44389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
44489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_RETURN: /* 0x0f */
44589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_RETURN.S */
44689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
44789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
44889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * structure, then jumps to the return handler.
44989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
45089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: return, return-object
45189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
45289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA */
45389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
45489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
45589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
45689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)   # retval.i <- AA
45789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_returnFromMethod
45889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
45989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
46089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
46189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_RETURN_WIDE: /* 0x10 */
46289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_RETURN_WIDE.S */
46389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
46489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Return a 64-bit value.  Copies the return value into the "glue"
46589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * structure, then jumps to the return handler.
46689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
46789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* return-wide vAA */
46889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
46989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL            # rINST_FULL<- AA
47089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[AA+0]
47189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[AA+1]
47289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)
47389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,4+offGlue_retval(%ecx)
47489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_returnFromMethod
47589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
47689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
47789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
47889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */
47989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_RETURN_OBJECT.S */
48089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_RETURN.S */
48189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
48289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
48389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * structure, then jumps to the return handler.
48489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
48589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: return, return-object
48689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
48789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA */
48889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
48989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
49089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
49189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)   # retval.i <- AA
49289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_returnFromMethod
49389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
49489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
49589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
49689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
49789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_4: /* 0x12 */
49889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_4.S */
49989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const/4 vA, #+B */
50089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsx   rINST_HI,%eax              # eax<-ssssssBx
50189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $0xf,%ecx
50289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl    %eax,%ecx                  # ecx<- A
50389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
50489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
50589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%eax
50689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
50789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
50889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
50989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
51089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
51189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
51289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_16: /* 0x13 */
51389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_16.S */
51489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const/16 vAA, #+BBBB */
51589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl  2(rPC),%ecx                # ecx<- ssssBBBB
51689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%eax              # eax<- AA
51789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
51889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
51989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)                # vAA<- ssssBBBB
52089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
52189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
52289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
52389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
52489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST: /* 0x14 */
52589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST.S */
52689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const vAA, #+BBBBbbbb */
52789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- AA
52889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      2(rPC),%eax               # grab all 32 bits at once
52989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
53089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
53189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)                 # vAA<- eax
53289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
53389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
53489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
53589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
53689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */
53789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_HIGH16.S */
53889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const/high16 vAA, #+BBBB0000 */
53989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl     2(rPC),%eax                # eax<- 0000BBBB
54089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl     rINST_HI,%ecx              # ecx<- AA
54189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
54289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
54389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sall       $16,%eax                  # eax<- BBBB0000
54489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)                   # vAA<- eax
54589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
54689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
54789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
54889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
54989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_WIDE_16: /* 0x16 */
55089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_WIDE_16.S */
55189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const-wide/16 vAA, #+BBBB */
55289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl    2(rPC),%eax               # eax<- ssssBBBB
55389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
55489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- AA
55589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
55689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd                                # rPC:eax<- ssssssssssssBBBB
55789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)           # store msw
55889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
55989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
56089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
56189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
56289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
56389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
56489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
56589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */
56689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_WIDE_32.S */
56789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const-wide/32 vAA, #+BBBBbbbb */
56889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     2(rPC),%eax               # eax<- BBBBbbbb
56989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
57089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- AA
57189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
57289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd                                # rPC:eax<- ssssssssssssBBBB
57389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)           # store msw
57489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
57589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
57689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
57789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
57889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
57989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
58089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
58189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */
58289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_WIDE.S */
58389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
58489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      2(rPC),%eax         # eax<- lsw
58589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx       # ecx <- AA
58689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      6(rPC),rINST_FULL   # rINST_FULL<- msw
58789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      (rFP,%ecx,4),%ecx   # dst addr
58889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,4(%ecx)
58989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(5)
59089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,(%ecx)
59189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(5)
59289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
59389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
59489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
59589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
59689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
59789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
59889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_WIDE_HIGH16.S */
59989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const-wide/high16 vAA, #+BBBB000000000000 */
60089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl     2(rPC),%eax                # eax<- 0000BBBB
60189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl     rINST_HI,%ecx              # ecx<- AA
60289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
60389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
60489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sall       $16,%eax                  # eax<- BBBB0000
60589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,1)            # v[AA+1]<- eax
60689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl       %eax,%eax
60789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)            # v[AA+0]<- eax
60889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
60989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
61089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
61189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
61289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
61389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */
61489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_STRING.S */
61589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
61689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const/string vAA, String@BBBB */
61789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
61889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
61989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
62089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
62189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
62289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
62389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%ecx
62489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
62589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                # resolved yet?
62689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_CONST_STRING_resolve
62789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
62889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
62989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
63089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
63189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
63289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
63389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */
63489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_STRING_JUMBO.S */
63589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
63689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const/string vAA, String@BBBBBBBB */
63789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
63889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      2(rPC),%eax              # eax<- BBBBBBBB
63989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
64089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
64189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
64289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
64389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%ecx
64489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
64589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                # resolved yet?
64689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_CONST_STRING_JUMBO_resolve
64789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
64889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
64989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
65089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
65189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
65289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
65389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */
65489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CONST_CLASS.S */
65589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
65689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* const/class vAA, Class@BBBB */
65789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
65889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
65989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
66089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
66189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- dvmDex->pResClasses
66289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- rResClasses[BBBB]
66389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%ecx
66489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
66589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                # resolved yet?
66689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_CONST_CLASS_resolve
66789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)                # vAA<- rResClasses[BBBB]
66889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
66989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
67089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
67189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
67289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
67389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */
67489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MONITOR_ENTER.S */
67589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
67689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Synchronize on an object.
67789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
67889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* monitor-enter vAA */
67989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
68089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
68189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
68289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
68389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
68489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # null object?
68589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#ifdef WITH_MONITOR_TRACKING
68689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
68789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#endif
68889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_MONITOR_ENTER_continue
68989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_errNullObject
69089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
69189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
69289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
69389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */
69489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MONITOR_EXIT.S */
69589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
69689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Unlock an object.
69789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
69889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Exceptions that occur when unlocking a monitor need to appear as
69989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * if they happened at the following instruction.  See the Dalvik
70089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * instruction spec.
70189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
70289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* monitor-exit vAA */
70389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
70489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)
70589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
70689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
70789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # null object?
70889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject        # go if so
70989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
71089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
71189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
71289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
71389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_MONITOR_EXIT_continue
71489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
71589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
71689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
71789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */
71889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CHECK_CAST.S */
71989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
72089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Check to see if a cast from one class to another is allowed.
72189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
72289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* check-cast vAA, class@BBBB */
72389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
72489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
72589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA (object)
72689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
72789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
72889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # is oject null?
72989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
73089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_CHECK_CAST_okay          # null obj, cast always succeeds
73189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved class
73289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
73389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # have we resolved this before?
73489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_CHECK_CAST_resolve       # no, go do it now
73589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CHECK_CAST_resolved:
73689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      %eax,%ecx                 # same class (trivial success)?
73789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne       .LOP_CHECK_CAST_fullcheck     # no, do full check
73889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CHECK_CAST_okay:
73989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
74089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
74189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
74289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
74389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
74489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
74589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */
74689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INSTANCE_OF.S */
74789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
74889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Check to see if an object reference is an instance of a class.
74989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
75089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Most common situation is a non-null object, being compared against
75189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * an already-resolved class.
75289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
75389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* instance-of vA, vB, class@CCCC */
75489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%eax               # eax<- BA
75589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%eax                    # eax<- B
75689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
75789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
75889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # object null?
75989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
76089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
76189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      .LOP_INSTANCE_OF_store           # null obj, not instance, store it
76289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rPC                  # rPC<- CCCC
76389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
76489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%ecx,rPC,4),%ecx           # ecx<- resolved class
76589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
76689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                   # have we resolved this before?
76789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      .LOP_INSTANCE_OF_resolve         # not resolved, do it now
76889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INSTANCE_OF_resolved:  # eax<- obj->clazz, ecx<- resolved class
76989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl    %eax,%ecx                   # same class (trivial success)?
77089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      .LOP_INSTANCE_OF_trivial         # yes, trivial finish
77189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_INSTANCE_OF_fullcheck       # no, do full check
77289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
77389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
77489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
77589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */
77689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ARRAY_LENGTH.S */
77789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
77889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Return the length of an array.
77989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
78089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   movzbl   rINST_HI,%eax              # eax<- BA
78189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   sarl     $12,rINST_FULL            # rINST_FULL<- B
78289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   GET_VREG(%ecx,rINST_FULL)           # ecx<- vB (object ref)
78389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   andb     $0xf,%al                  # eax<- A
78489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   testl    %ecx,%ecx                  # is null?
78589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   je       common_errNullObject
78689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   FETCH_INST_WORD(1)
78789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   movl     offArrayObject_length(%ecx),%ecx
78889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   ADVANCE_PC(1)
78989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   SET_VREG(%ecx,%eax)
79089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   GOTO_NEXT
79189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
79289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
79389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
79489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */
79589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_NEW_INSTANCE.S */
79689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
79789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Create a new instance of a class.
79889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
79989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* new-instance vAA, class@BBBB */
80089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
80189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
80289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
80389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
80489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
80589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
80689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved class
80789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
80889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                 # resolved?
80989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_NEW_INSTANCE_resolve       # no, go do it
81089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_NEW_INSTANCE_resolved:  # on entry, ecx<- class
81189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpb      $CLASS_INITIALIZED,offClassObject_status(%ecx)
81289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_NEW_INSTANCE_initialized
81389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_NEW_INSTANCE_needinit
81489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
81589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
81689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
81789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */
81889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_NEW_ARRAY.S */
81989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
82089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Allocate an array of objects, specified with the array class
82189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * and a count.
82289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
82389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * The verifier guarantees that this is an array class, so we don't
82489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * check for it here.
82589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
82689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* new-array vA, vB, class@CCCC */
82789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
828cc05ad238516f1303687aba4a978e24e57c0c07aThe Android Open Source Project    EXPORT_PC()
82989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
83089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),%eax                       # eax<- CCCC
83189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResClasses(%ecx),%ecx  # ecx<- pDvmDex->pResClasses
83289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%ecx,%eax,4),%ecx                # ecx<- resolved class
83389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%eax
83489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%eax                          # eax<- B
83589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                       # eax<- vB (array length)
83689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL
83789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                    # rINST_FULL<- A
83889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax
83989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js      common_errNegativeArraySize       # bail
84089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                         # already resolved?
84189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_NEW_ARRAY_finish                # yes, fast path
84289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_NEW_ARRAY_resolve               # resolve now
84389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
84489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
84589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
84689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
84789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_FILLED_NEW_ARRAY.S */
84889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
84989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Create a new array with elements filled from registers.
85089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
85189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: filled-new-array, filled-new-array/range
85289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
85389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
85489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
85589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
85689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL               # rINST_FULL<- AA or BA
85789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%eax),%eax # eax<- pDvmDex
85889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),%ecx                       # ecx<- BBBB
85989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
86089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
86189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,%ecx,4),%eax                # eax<- resolved class
86289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
86389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                         # already resolved?
86489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_FILLED_NEW_ARRAY_continue              # yes, continue
86589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    # less frequent path, so we'll redo some work
86689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
86789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $0,OUT_ARG2(%esp)                # arg2<- false
86889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
86989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(%eax),%eax         # eax<- glue->method
87089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_FILLED_NEW_ARRAY_more
87189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
87289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
87389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
87489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
87589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_FILLED_NEW_ARRAY_RANGE.S */
87689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_FILLED_NEW_ARRAY.S */
87789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
87889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Create a new array with elements filled from registers.
87989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
88089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: filled-new-array, filled-new-array/range
88189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
88289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
88389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
88489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
88589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL               # rINST_FULL<- AA or BA
88689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%eax),%eax # eax<- pDvmDex
88789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),%ecx                       # ecx<- BBBB
88889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
88989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
89089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,%ecx,4),%eax                # eax<- resolved class
89189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
89289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                         # already resolved?
89389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_FILLED_NEW_ARRAY_RANGE_continue              # yes, continue
89489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    # less frequent path, so we'll redo some work
89589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
89689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $0,OUT_ARG2(%esp)                # arg2<- false
89789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
89889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(%eax),%eax         # eax<- glue->method
89989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_FILLED_NEW_ARRAY_RANGE_more
90089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
90189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
90289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
90389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
90489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */
90589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_FILL_ARRAY_DATA.S */
90689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* fill-array-data vAA, +BBBBBBBB */
90789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    2(rPC),%ecx                # ecx<- BBBBbbbb
90889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
90989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    (rPC,%ecx,2),%ecx          # ecx<- PC + BBBBbbbb*2
91089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)
91189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
91289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
91389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
91489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)
91589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmInterpHandleFillArrayData
91689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
91789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
91889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # exception thrown?
91989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown
92089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
92189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
92289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
92389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
92489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
92589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_THROW: /* 0x27 */
92689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_THROW.S */
92789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
92889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Throw an exception object in the current thread.
92989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
93089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* throw vAA */
93189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
93289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL       # rINST_FULL<- AA
93389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)          # eax<- exception object
93489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_self(%ecx),%ecx   # ecx<- glue->self
93589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax                 # null object?
93689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_errNullObject
93789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,offThread_exception(%ecx) # thread->exception<- obj
93889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown
93989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
94089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
94189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
94289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_GOTO: /* 0x28 */
94389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_GOTO.S */
94489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
94589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Unconditional branch, 8-bit offset.
94689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
94789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
94889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * double to get a byte offset.
94989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
95089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* goto +AA */
95189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl  rINST_HI,rINST_FULL         # ebx<- ssssssAA
95289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rINST_FULL,rINST_FULL       # test for <0
95389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js      common_backwardBranch
95489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%eax
95589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
95689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
95789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
95889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
95989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
96089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
96189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */
96289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_GOTO_16.S */
96389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
96489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Unconditional branch, 16-bit offset.
96589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
96689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * The branch distance is a signed code-unit offset
96789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
96889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* goto/16 +AAAA */
96989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl  2(rPC),rINST_FULL           # rINST_FULL<- ssssAAAA
97089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rINST_FULL,rINST_FULL       # test for <0
97189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js      common_backwardBranch
97289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%eax
97389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
97489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
97589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
97689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
97789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
97889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
97989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */
98089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_GOTO_32.S */
98189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
98289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Unconditional branch, 32-bit offset.
98389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
98489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * The branch distance is a signed code-unit offset.
98589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
98689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Unlike most opcodes, this one is allowed to branch to itself, so
98789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * our "backward branch" test must be "<=0" instead of "<0".
98889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
98989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* goto/32 AAAAAAAA */
99089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    2(rPC),rINST_FULL           # rINST_FULL<- AAAAAAAA
99189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl    $0,rINST_FULL              # test for <= 0
99289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jle     common_backwardBranch
99389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%eax
99489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
99589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
99689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
99789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
99889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
99989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
100089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */
100189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_PACKED_SWITCH.S */
100289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
100389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
100489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * we decode it and hand it off to a helper function.
100589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
100689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
100789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * they're perfectly legal, so we check for them here.
100889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
100989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: packed-switch, sparse-switch
101089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
101189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, +BBBB */
101289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
101389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
101489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
101589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
101689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
101789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
101889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
101989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmInterpHandlePackedSwitch
102089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
102189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax
102289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,rINST_FULL             # set up word offset
102389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jle     common_backwardBranch       # check on special actions
102489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
102589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST()
102689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
102789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
102889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
102989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
103089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */
103189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPARSE_SWITCH.S */
103289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_PACKED_SWITCH.S */
103389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
103489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
103589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * we decode it and hand it off to a helper function.
103689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
103789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
103889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * they're perfectly legal, so we check for them here.
103989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
104089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: packed-switch, sparse-switch
104189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
104289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, +BBBB */
104389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
104489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
104589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
104689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
104789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
104889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
104989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
105089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmInterpHandleSparseSwitch
105189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
105289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax
105389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,rINST_FULL             # set up word offset
105489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jle     common_backwardBranch       # check on special actions
105589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
105689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST()
105789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
105889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
105989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
106089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
106189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
106289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */
106389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CMPL_FLOAT.S */
106489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
106589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
106689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
106789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
106889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
106989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%eax,4)
107089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%ecx,4)
107189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
107289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%eax,4)
107389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%ecx,4)
107489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
107589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
107689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     %ecx,%ecx
107789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
107889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstsw   %ax
107989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
108089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%eax
108189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
108289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp       .LOP_CMPL_FLOAT_isNaN
108389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_CMPL_FLOAT_finish
108489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sbbl     %ecx,%ecx
108589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jb       .LOP_CMPL_FLOAT_finish
108689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    incl     %ecx
108789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMPL_FLOAT_finish:
108889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
108989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
109089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
109189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
109289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
109389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
109489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
109589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */
109689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CMPG_FLOAT.S */
109789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
109889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
109989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
110089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
110189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
110289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%eax,4)
110389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%ecx,4)
110489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
110589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%eax,4)
110689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%ecx,4)
110789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
110889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
110989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     %ecx,%ecx
111089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
111189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstsw   %ax
111289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
111389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%eax
111489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
111589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp       .LOP_CMPG_FLOAT_isNaN
111689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_CMPG_FLOAT_finish
111789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sbbl     %ecx,%ecx
111889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jb       .LOP_CMPG_FLOAT_finish
111989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    incl     %ecx
112089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMPG_FLOAT_finish:
112189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
112289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
112389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
112489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
112589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
112689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
112789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
112889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */
112989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CMPL_DOUBLE.S */
113089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
113189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
113289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
113389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
113489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
113589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%eax,4)
113689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%ecx,4)
113789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
113889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%eax,4)
113989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%ecx,4)
114089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
114189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
114289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     %ecx,%ecx
114389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
114489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstsw   %ax
114589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
114689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%eax
114789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
114889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp       .LOP_CMPL_DOUBLE_isNaN
114989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_CMPL_DOUBLE_finish
115089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sbbl     %ecx,%ecx
115189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jb       .LOP_CMPL_DOUBLE_finish
115289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    incl     %ecx
115389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMPL_DOUBLE_finish:
115489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
115589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
115689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
115789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
115889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
115989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
116089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
116189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */
116289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CMPG_DOUBLE.S */
116389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* float/double_cmp[gl] vAA, vBB, vCC */
116489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%eax             # eax<- CC
116589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%ecx             # ecx<- BB
116689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
116789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%eax,4)
116889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%ecx,4)
116989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
117089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%eax,4)
117189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%ecx,4)
117289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
117389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
117489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     %ecx,%ecx
117589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fucompp     # z if equal, p set if NaN, c set if st0 < st1
117689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstsw   %ax
117789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
117889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%eax
117989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
118089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp       .LOP_CMPG_DOUBLE_isNaN
118189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_CMPG_DOUBLE_finish
118289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sbbl     %ecx,%ecx
118389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jb       .LOP_CMPG_DOUBLE_finish
118489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    incl     %ecx
118589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMPG_DOUBLE_finish:
118689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
118789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
118889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
118989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
119089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
119189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
119289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */
119389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_CMP_LONG.S */
119489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
119589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
119689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * register based on the results of the comparison.
119789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
119889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* cmp-long vAA, vBB, vCC */
119989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
120089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
120189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),rPC               # rPC<- CC
120289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,1)         # eax<- v[BB+1]
120389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,0)         # ecx<- v[BB+0]
120489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
120589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      4(rFP,rPC,4),%eax
120689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jl        .LOP_CMP_LONG_smaller
120789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jg        .LOP_CMP_LONG_bigger
120889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sub       (rFP,rPC,4),%ecx
120989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ja        .LOP_CMP_LONG_bigger
121089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jb        .LOP_CMP_LONG_smaller
121189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
121289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_CMP_LONG_finish
121389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
121489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
121589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
121689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */
121789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_EQ.S */
121889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bincmp.S */
121989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
122089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
122189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
122289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
122389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
122489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
122589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
122689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
122789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
122889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
122989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
123089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
123189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
123289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
123389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                   # assume not taken
123489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne   1f
123589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
123689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
123789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
123889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
123989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
124089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
124189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
124289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
124389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
124489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
124589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
124689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
124789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_NE: /* 0x33 */
124889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_NE.S */
124989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bincmp.S */
125089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
125189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
125289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
125389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
125489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
125589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
125689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
125789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
125889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
125989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
126089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
126189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
126289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
126389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
126489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                   # assume not taken
126589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je   1f
126689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
126789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
126889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
126989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
127089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
127189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
127289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
127389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
127489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
127589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
127689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
127789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
127889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_LT: /* 0x34 */
127989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_LT.S */
128089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bincmp.S */
128189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
128289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
128389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
128489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
128589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
128689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
128789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
128889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
128989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
129089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
129189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
129289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
129389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
129489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
129589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                   # assume not taken
129689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jge   1f
129789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
129889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
129989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
130089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
130189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
130289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
130389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
130489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
130589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
130689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
130789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
130889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
130989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_GE: /* 0x35 */
131089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_GE.S */
131189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bincmp.S */
131289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
131389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
131489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
131589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
131689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
131789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
131889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
131989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
132089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
132189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
132289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
132389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
132489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
132589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
132689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                   # assume not taken
132789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jl   1f
132889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
132989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
133089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
133189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
133289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
133389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
133489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
133589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
133689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
133789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
133889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
133989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
134089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_GT: /* 0x36 */
134189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_GT.S */
134289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bincmp.S */
134389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
134489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
134589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
134689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
134789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
134889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
134989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
135089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
135189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
135289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
135389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
135489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
135589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
135689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
135789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                   # assume not taken
135889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jle   1f
135989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
136089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
136189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
136289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
136389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
136489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
136589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
136689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
136789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
136889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
136989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
137089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
137189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_LE: /* 0x37 */
137289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_LE.S */
137389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bincmp.S */
137489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
137589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
137689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
137789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
137889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
137989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
138089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
138189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
138289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx              # ecx <- A+
138389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                  # ecx <- A
138489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%ecx)                 # eax <- vA
138589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL            # rINST_FULL<- B
138689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
138789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL          # Get signed branch offset
138889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                   # assume not taken
138989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jg   1f
139089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
139189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
139289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
139389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
139489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
139589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
139689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
139789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
139889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
139989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
140089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
140189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
140289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */
140389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_EQZ.S */
140489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/zcmp.S */
140589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
140689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
140789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
140889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
140989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
141089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
141189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
141289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vAA, +BBBB */
141389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
141489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
141589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
141689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
141789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne   1f
141889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
141989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
142089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
142189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
142289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
142389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
142489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
142589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
142689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
142789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
142889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
142989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
143089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */
143189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_NEZ.S */
143289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/zcmp.S */
143389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
143489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
143589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
143689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
143789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
143889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
143989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
144089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vAA, +BBBB */
144189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
144289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
144389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
144489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
144589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je   1f
144689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
144789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
144889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
144989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
145089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
145189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
145289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
145389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
145489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
145589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
145689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
145789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
145889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_LTZ: /* 0x3a */
145989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_LTZ.S */
146089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/zcmp.S */
146189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
146289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
146389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
146489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
146589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
146689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
146789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
146889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vAA, +BBBB */
146989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
147089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
147189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
147289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
147389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jge   1f
147489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
147589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
147689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
147789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
147889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
147989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
148089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
148189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
148289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
148389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
148489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
148589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
148689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_GEZ: /* 0x3b */
148789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_GEZ.S */
148889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/zcmp.S */
148989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
149089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
149189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
149289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
149389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
149489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
149589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
149689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vAA, +BBBB */
149789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
149889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
149989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
150089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
150189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jl   1f
150289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
150389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
150489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
150589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
150689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
150789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
150889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
150989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
151089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
151189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
151289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
151389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
151489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */
151589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_GTZ.S */
151689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/zcmp.S */
151789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
151889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
151989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
152089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
152189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
152289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
152389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
152489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vAA, +BBBB */
152589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
152689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
152789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
152889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
152989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jle   1f
153089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
153189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
153289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
153389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
153489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
153589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
153689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
153789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
153889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
153989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
154089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
154189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
154289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */
154389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IF_LEZ.S */
154489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/zcmp.S */
154589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
154689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
154789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
154889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for "if-le" you would use "gt".
154989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
155089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
155189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
155289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* if-cmp vAA, +BBBB */
155389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx             # ecx <- AA
155489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
155589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),rINST_FULL         # fetch signed displacement
155689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $2,%eax                  # assume branch not taken
155789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jg   1f
155889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rINST_FULL,rINST_FULL
155989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    js       common_backwardBranch
156089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%eax
156189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
156289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_INDEXED(%eax)
156389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(%eax)
156489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
156589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
156689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
156789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
156889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
156989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
157089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */
157189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_3E.S */
157289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
157389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
157489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
157589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
157689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
157789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
157889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */
157989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_3F.S */
158089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
158189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
158289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
158389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
158489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
158589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
158689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */
158789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_40.S */
158889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
158989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
159089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
159189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
159289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
159389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
159489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */
159589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_41.S */
159689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
159789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
159889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
159989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
160089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
160189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
160289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */
160389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_42.S */
160489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
160589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
160689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
160789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
160889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
160989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
161089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */
161189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_43.S */
161289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
161389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
161489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
161589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
161689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
161789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
161889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AGET: /* 0x44 */
161989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET.S */
162089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
162189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
162289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
162389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
162489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
162589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
162689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
162789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
162889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
162989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
163089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
163189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
163289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
163389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
163489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
163589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offArrayObject_contents(%eax,%ecx,4),%eax
163689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%ecx
163789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
163889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
163989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
164089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
164189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
164289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
164389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
164489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
164589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */
164689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET_WIDE.S */
164789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
164889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array get, 64 bits.  vAA <- vBB[vCC].
164989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
165089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
165189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
165289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
165389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
165489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
165589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
165689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
165789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
165889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
165989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
166089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jb        .LOP_AGET_WIDE_finish        # index < length, OK
166189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_errArrayIndex      # index >= length, bail
166289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
166389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
166489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
166589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */
166689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET_OBJECT.S */
166789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET.S */
166889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
166989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
167089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
167189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
167289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
167389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
167489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
167589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
167689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
167789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
167889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
167989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
168089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
168189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
168289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
168389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offArrayObject_contents(%eax,%ecx,4),%eax
168489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%ecx
168589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
168689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
168789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
168889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
168989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
169089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
169189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
169289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
169389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
169489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */
169589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET_BOOLEAN.S */
169689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET.S */
169789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
169889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
169989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
170089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
170189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
170289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
170389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
170489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
170589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
170689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
170789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
170889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
170989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
171089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
171189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
171289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl     offArrayObject_contents(%eax,%ecx,1),%eax
171389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%ecx
171489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
171589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
171689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
171789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
171889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
171989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
172089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
172189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
172289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
172389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */
172489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET_BYTE.S */
172589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET.S */
172689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
172789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
172889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
172989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
173089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
173189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
173289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
173389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
173489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
173589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
173689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
173789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
173889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
173989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
174089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
174189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl     offArrayObject_contents(%eax,%ecx,1),%eax
174289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%ecx
174389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
174489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
174589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
174689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
174789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
174889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
174989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
175089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
175189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
175289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */
175389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET_CHAR.S */
175489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET.S */
175589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
175689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
175789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
175889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
175989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
176089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
176189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
176289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
176389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
176489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
176589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
176689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
176789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
176889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
176989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
177089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl     offArrayObject_contents(%eax,%ecx,2),%eax
177189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%ecx
177289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
177389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
177489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
177589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
177689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
177789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
177889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
177989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
178089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
178189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */
178289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET_SHORT.S */
178389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AGET.S */
178489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
178589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
178689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
178789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
178889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
178989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
179089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
179189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
179289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
179389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
179489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
179589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
179689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
179789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
179889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
179989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl     offArrayObject_contents(%eax,%ecx,2),%eax
180089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,%ecx
180189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
180289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
180389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
180489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
180589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
180689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
180789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
180889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
180989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
181089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_APUT: /* 0x4b */
181189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT.S */
181289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
181389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
181489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
181589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
181689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
181789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
181889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
181989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
182089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
182189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
182289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
182389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
182489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
182589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
182689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
182789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,4),%eax
182889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
182989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
183089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,(%eax)
183189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
183289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
183389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
183489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
183589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
183689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
183789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */
183889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT_WIDE.S */
183989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
184089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array put, 64 bits.  vBB[vCC]<-vAA.
184189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
184289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
184389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
184489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
184589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
184689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
184789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
184889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
184989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
185089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
185189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
185289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jb        .LOP_APUT_WIDE_finish        # index < length, OK
185389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_errArrayIndex      # index >= length, bail
185489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
185589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
185689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
185789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */
185889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT_OBJECT.S */
185989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
186089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
186189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
186289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
186389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
186489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
186589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
186689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
186789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
186889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
186989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
187089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA
187189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
187289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
187389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
187489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jb        .LOP_APUT_OBJECT_continue
187589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_errArrayIndex      # index >= length, bail
187689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
187789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
187889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
187989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */
188089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT_BOOLEAN.S */
188189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT.S */
188289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
188389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
188489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
188589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
188689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
188789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
188889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
188989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
189089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
189189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
189289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
189389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
189489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
189589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
189689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
189789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,1),%eax
189889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
189989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
190089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb     %cl,(%eax)
190189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
190289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
190389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
190489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
190589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
190689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
190789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
190889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */
190989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT_BYTE.S */
191089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT.S */
191189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
191289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
191389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
191489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
191589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
191689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
191789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
191889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
191989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
192089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
192189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
192289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
192389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
192489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
192589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
192689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,1),%eax
192789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
192889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
192989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb     %cl,(%eax)
193089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
193189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
193289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
193389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
193489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
193589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
193689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
193789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */
193889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT_CHAR.S */
193989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT.S */
194089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
194189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
194289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
194389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
194489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
194589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
194689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
194789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
194889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
194989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
195089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
195189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
195289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
195389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
195489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
195589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,2),%eax
195689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
195789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
195889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw     %cx,(%eax)
195989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
196089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
196189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
196289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
196389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
196489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
196589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
196689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */
196789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT_SHORT.S */
196889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_APUT.S */
196989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
197089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA
197189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
197289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: aput, aput-object, aput-boolean, aput-byte, aput-char, aput-short
197389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
197489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, vBB, vCC */
197589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
197689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
197789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
197889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
197989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
198089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null array object?
198189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # bail if so
198289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      offArrayObject_length(%eax),%ecx
198389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae       common_errArrayIndex      # index >= length, bail
198489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,2),%eax
198589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
198689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
198789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw     %cx,(%eax)
198889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
198989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
199089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
199189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
199289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
199389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
199489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
199589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET: /* 0x52 */
199689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET.S */
199789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
199889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field get.
199989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
200089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
200189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
200289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
200389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
200489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
200589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
200689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
200789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
200889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
200989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
201089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
201189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
201289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
201389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
201489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
201589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_finish                    # no, already resolved
201689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
201789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
201889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IGET_resolve
201989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
202089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
202189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
202289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */
202389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_WIDE.S */
202489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
202589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 64-bit instance field get.
202689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
202789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
202889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
202989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
203089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
203189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
203289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
203389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
203489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
203589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
203689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
203789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
203889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
203989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
204089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
204189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_WIDE_finish                    # no, already resolved
204289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
204389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
204489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IGET_WIDE_resolve
204589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
204689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
204789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
204889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */
204989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_OBJECT.S */
205089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET.S */
205189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
205289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field get.
205389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
205489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
205589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
205689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
205789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
205889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
205989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
206089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
206189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
206289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
206389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
206489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
206589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
206689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
206789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
206889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
206989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_OBJECT_finish                    # no, already resolved
207089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
207189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
207289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IGET_OBJECT_resolve
207389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
207489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
207589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
207689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
207789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */
207889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_BOOLEAN.S */
207989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET.S */
208089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
208189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field get.
208289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
208389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
208489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
208589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
208689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
208789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
208889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
208989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
209089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
209189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
209289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
209389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
209489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
209589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
209689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
209789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
209889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_BOOLEAN_finish                    # no, already resolved
209989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
210089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
210189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IGET_BOOLEAN_resolve
210289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
210389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
210489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
210589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
210689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */
210789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_BYTE.S */
210889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET.S */
210989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
211089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field get.
211189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
211289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
211389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
211489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
211589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
211689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
211789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
211889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
211989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
212089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
212189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
212289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
212389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
212489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
212589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
212689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
212789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_BYTE_finish                    # no, already resolved
212889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
212989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
213089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IGET_BYTE_resolve
213189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
213289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
213389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
213489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
213589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */
213689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_CHAR.S */
213789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET.S */
213889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
213989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field get.
214089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
214189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
214289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
214389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
214489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
214589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
214689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
214789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
214889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
214989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
215089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
215189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
215289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
215389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
215489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
215589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
215689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_CHAR_finish                    # no, already resolved
215789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
215889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
215989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IGET_CHAR_resolve
216089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
216189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
216289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
216389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
216489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */
216589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_SHORT.S */
216689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET.S */
216789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
216889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field get.
216989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
217089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
217189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
217289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
217389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
217489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
217589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
217689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
217789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
217889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
217989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
218089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
218189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
218289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
218389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
218489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
218589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_SHORT_finish                    # no, already resolved
218689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
218789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
218889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IGET_SHORT_resolve
218989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
219089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
219189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
219289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
219389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT: /* 0x59 */
219489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT.S */
219589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
219689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
219789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field put.
219889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
219989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
220089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
220189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
220289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
220389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
220489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
220589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
220689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
220789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
220889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
220989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
221089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
221189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
221289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
221389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
221489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_finish                    # no, already resolved
221589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
221689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
221789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IPUT_resolve
221889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
221989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
222089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
222189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */
222289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_WIDE.S */
222389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
222489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 64-bit instance field put.
222589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
222689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
222789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
222889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
222989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
223089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
223189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
223289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
223389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
223489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
223589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
223689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
223789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
223889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
223989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
224089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_WIDE_finish                    # no, already resolved
224189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
224289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
224389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IPUT_WIDE_resolve
224489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
224589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
224689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
224789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */
224889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_OBJECT.S */
224989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT.S */
225089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
225189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
225289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field put.
225389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
225489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
225589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
225689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
225789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
225889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
225989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
226089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
226189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
226289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
226389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
226489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
226589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
226689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
226789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
226889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
226989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_OBJECT_finish                    # no, already resolved
227089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
227189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
227289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IPUT_OBJECT_resolve
227389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
227489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
227589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
227689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
227789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */
227889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_BOOLEAN.S */
227989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT.S */
228089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
228189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
228289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field put.
228389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
228489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
228589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
228689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
228789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
228889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
228989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
229089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
229189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
229289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
229389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
229489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
229589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
229689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
229789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
229889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
229989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_BOOLEAN_finish                    # no, already resolved
230089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
230189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
230289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IPUT_BOOLEAN_resolve
230389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
230489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
230589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
230689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
230789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */
230889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_BYTE.S */
230989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT.S */
231089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
231189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
231289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field put.
231389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
231489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
231589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
231689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
231789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
231889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
231989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
232089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
232189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
232289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
232389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
232489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
232589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
232689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
232789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
232889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
232989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_BYTE_finish                    # no, already resolved
233089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
233189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
233289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IPUT_BYTE_resolve
233389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
233489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
233589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
233689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
233789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */
233889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_CHAR.S */
233989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT.S */
234089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
234189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
234289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field put.
234389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
234489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
234589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
234689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
234789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
234889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
234989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
235089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
235189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
235289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
235389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
235489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
235589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
235689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
235789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
235889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
235989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_CHAR_finish                    # no, already resolved
236089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
236189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
236289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IPUT_CHAR_resolve
236389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
236489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
236589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
236689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
236789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */
236889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_SHORT.S */
236989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT.S */
237089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
237189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
237289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit instance field put.
237389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
237489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
237589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
237689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, field@CCCC */
237789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
237889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)                                 # need another reg
237989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
238089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
238189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx                         # ecx<- BA
238289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%ecx                              # ecx<- B
238389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
238489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
238589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,rINST_LO                        # rINST_FULL<- A
238689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
238789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,rIBASE,4),%eax                  # resolved entry
238889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # is resolved entry null?
238989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_SHORT_finish                    # no, already resolved
239089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rIBASE,OUT_ARG1(%esp)
239189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rIBASE)
239289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_IPUT_SHORT_resolve
239389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
239489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
239589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
239689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
239789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SGET: /* 0x60 */
239889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET.S */
239989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
240089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SGET handler.
240189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
240289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
240389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
240489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
240589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
240689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
240789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
240889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
240989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
241089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
241189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SGET_resolve                # if not, make it so
241289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_finish:     # field ptr in eax
241389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offStaticField_value(%eax),%eax
241489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
241589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
241689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
241789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
241889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
241989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
242089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
242189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
242289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */
242389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET_WIDE.S */
242489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
242589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 64-bit SGET handler.
242689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
242789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
242889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* sget-wide vAA, field@BBBB */
242989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
243089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
243189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
243289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
243389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
243489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
243589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SGET_WIDE_resolve                # if not, make it so
243689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_WIDE_finish:     # field ptr in eax
243789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offStaticField_value(%eax),%ecx    # ecx<- lsw
243889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      4+offStaticField_value(%eax),%eax  # eax<- msw
243989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL                # rINST_FULL<- AA
244089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
244189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
244289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
244389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
244489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
244589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
244689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
244789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
244889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */
244989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET_OBJECT.S */
245089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET.S */
245189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
245289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SGET handler.
245389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
245489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
245589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
245689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
245789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
245889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
245989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
246089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
246189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
246289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
246389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SGET_OBJECT_resolve                # if not, make it so
246489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_OBJECT_finish:     # field ptr in eax
246589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offStaticField_value(%eax),%eax
246689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
246789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
246889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
246989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
247089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
247189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
247289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
247389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
247489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
247589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */
247689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET_BOOLEAN.S */
247789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET.S */
247889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
247989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SGET handler.
248089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
248189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
248289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
248389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
248489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
248589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
248689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
248789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
248889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
248989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
249089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SGET_BOOLEAN_resolve                # if not, make it so
249189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_BOOLEAN_finish:     # field ptr in eax
249289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offStaticField_value(%eax),%eax
249389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
249489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
249589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
249689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
249789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
249889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
249989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
250089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
250189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
250289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */
250389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET_BYTE.S */
250489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET.S */
250589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
250689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SGET handler.
250789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
250889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
250989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
251089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
251189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
251289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
251389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
251489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
251589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
251689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
251789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SGET_BYTE_resolve                # if not, make it so
251889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_BYTE_finish:     # field ptr in eax
251989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offStaticField_value(%eax),%eax
252089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
252189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
252289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
252389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
252489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
252589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
252689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
252789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
252889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
252989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */
253089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET_CHAR.S */
253189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET.S */
253289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
253389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SGET handler.
253489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
253589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
253689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
253789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
253889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
253989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
254089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
254189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
254289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
254389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
254489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SGET_CHAR_resolve                # if not, make it so
254589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_CHAR_finish:     # field ptr in eax
254689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offStaticField_value(%eax),%eax
254789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
254889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
254989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
255089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
255189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
255289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
255389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
255489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
255589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
255689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */
255789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET_SHORT.S */
255889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SGET.S */
255989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
256089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SGET handler.
256189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
256289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
256389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
256489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
256589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
256689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
256789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
256889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
256989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
257089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
257189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SGET_SHORT_resolve                # if not, make it so
257289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_SHORT_finish:     # field ptr in eax
257389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offStaticField_value(%eax),%eax
257489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
257589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
257689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
257789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
257889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
257989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
258089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
258189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
258289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
258389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SPUT: /* 0x67 */
258489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT.S */
258589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
258689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SPUT handler.
258789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
258889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
258989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
259089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
259189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
259289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
259389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
259489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
259589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
259689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
259789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SPUT_resolve                # if not, make it so
259889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_finish:     # field ptr in eax
259989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
260089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
260189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
260289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
260389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
260489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
260589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
260689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
260789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
260889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */
260989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT_WIDE.S */
261089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
261189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SPUT handler.
261289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
261389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
261489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
261589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
261689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
261789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
261889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
261989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
262089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
262189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
262289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SPUT_WIDE_resolve                # if not, make it so
262389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_WIDE_finish:     # field ptr in eax
262489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
262589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rINST_FULL,%ecx,0)             # rINST_FULL<- lsw
262689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)                   # ecx<- msw
262789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,offStaticField_value(%eax)
262889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
262989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
263089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,4+offStaticField_value(%eax)
263189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
263289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
263389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
263489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
263589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */
263689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT_OBJECT.S */
263789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT.S */
263889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
263989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SPUT handler.
264089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
264189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
264289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
264389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
264489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
264589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
264689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
264789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
264889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
264989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
265089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SPUT_OBJECT_resolve                # if not, make it so
265189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_OBJECT_finish:     # field ptr in eax
265289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
265389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
265489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
265589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
265689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
265789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
265889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
265989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
266089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
266189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
266289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */
266389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT_BOOLEAN.S */
266489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT.S */
266589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
266689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SPUT handler.
266789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
266889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
266989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
267089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
267189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
267289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
267389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
267489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
267589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
267689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
267789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SPUT_BOOLEAN_resolve                # if not, make it so
267889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_BOOLEAN_finish:     # field ptr in eax
267989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
268089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
268189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
268289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
268389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
268489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
268589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
268689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
268789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
268889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
268989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */
269089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT_BYTE.S */
269189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT.S */
269289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
269389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SPUT handler.
269489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
269589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
269689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
269789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
269889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
269989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
270089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
270189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
270289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
270389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
270489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SPUT_BYTE_resolve                # if not, make it so
270589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_BYTE_finish:     # field ptr in eax
270689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
270789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
270889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
270989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
271089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
271189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
271289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
271389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
271489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
271589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
271689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */
271789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT_CHAR.S */
271889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT.S */
271989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
272089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SPUT handler.
272189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
272289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
272389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
272489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
272589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
272689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
272789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
272889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
272989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
273089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
273189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SPUT_CHAR_resolve                # if not, make it so
273289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_CHAR_finish:     # field ptr in eax
273389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
273489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
273589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
273689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
273789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
273889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
273989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
274089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
274189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
274289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
274389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */
274489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT_SHORT.S */
274589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SPUT.S */
274689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
274789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * General 32-bit SPUT handler.
274889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
274989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
275089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
275189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, field@BBBB */
275289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
275389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax                        # eax<- field ref BBBB
275489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
275589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
275689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax                 # eax<- resolved StaticField ptr
275789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                          # resolved entry null?
275889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_SPUT_SHORT_resolve                # if not, make it so
275989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_SHORT_finish:     # field ptr in eax
276089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx                      # ecx<- AA
276189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
276289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
276389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,offStaticField_value(%eax)
276489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
276589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
276689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
276789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
276889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
276989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
277089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */
277189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL.S */
277289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
277389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
277489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a virtual method call.
277589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
277689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
277789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
277889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
277989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
278089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
278189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%ecx                 # ecx<- BBBB
278289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
278389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
278489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
278589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
278689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                   # already resolved?
278789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_continue        # yes, continue
278889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
278989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
279089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_method(%eax),%eax   # eax<- glue->method
279189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
279289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_INVOKE_VIRTUAL_more
279389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
279489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
279589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
279689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */
279789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_SUPER.S */
279889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
279989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a "super" method call.
280089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
280189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-super, invoke-super/range
280289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
280389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
280489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
280589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rINST_FULL)
280689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
280789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
280889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
280989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
281089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
281189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_method(rINST_FULL),%eax # eax<- method
281289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
281389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if       (!0)
281489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
281589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
281689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
281789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # null "this"?
281889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # yes, throw
281989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
282089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                 # already resolved?
282189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne       .LOP_INVOKE_SUPER_continue      # yes - go on
282289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_INVOKE_SUPER_resolve
282389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
282489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
282589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
282689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */
282789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT.S */
282889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
282989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a direct method call.
283089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
283189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
283289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * method invocation code, and use a flag to indicate that static
283389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
283489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * out we could avoiding loading the first arg twice.)
283589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
283689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-direct, invoke-direct/range
283789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
283889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
283989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
284089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
284189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
284289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
284389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
284489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
284589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
284689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
284789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
284889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if       (!0)
284989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
285089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
285189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                # already resolved?
285289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
285389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_INVOKE_DIRECT_resolve      # not resolved, do it now
285489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_DIRECT_finish:
285589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
285689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                # null "this"?
2857c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange  # no, continue on
285889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_errNullObject
285989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
286089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
286189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
286289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */
286389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_STATIC.S */
286489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
286589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a static method call.
286689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
286789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-static, invoke-static/range
286889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
286989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
287089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
287189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
287289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
287389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
287489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
287589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
287689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
287789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax
2878c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange
287989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
288089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
288189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax
288289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
288389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
288489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
288589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_INVOKE_STATIC_continue
288689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
288789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
288889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
288989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */
289089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE.S */
289189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
289289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle an interface method call.
289389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
289489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-interface, invoke-interface/range
289589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
289689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
289789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
289889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
289989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
290089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if        (!0)
290189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl       $0xf,%eax               # eax<- C (or stays CCCC)
290289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
290389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
290489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
290589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl      %eax,%eax                # null this?
290689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je         common_errNullObject     # yes, fail
290789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
290889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
290989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       offGlue_methodClassDex(%ecx),%eax   # eax<- methodClassDex
291089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       offGlue_method(%ecx),%ecx           # ecx<- method
291189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
291289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl     2(rPC),%eax                         # eax<- BBBB
291389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
291489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
291589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
291689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp        .LOP_INVOKE_INTERFACE_continue
291789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
291889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
291989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
292089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */
292189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_73.S */
292289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
292389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
292489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
292589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
292689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
292789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
292889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
292989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_RANGE.S */
293089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL.S */
293189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
293289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
293389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a virtual method call.
293489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
293589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
293689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
293789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
293889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
293989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
294089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%ecx                 # ecx<- BBBB
294189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
294289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
294389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
294489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
294589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                   # already resolved?
294689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # yes, continue
294789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
294889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
294989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_method(%eax),%eax   # eax<- glue->method
295089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
295189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_INVOKE_VIRTUAL_RANGE_more
295289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
295389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
295489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
295589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
295689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
295789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_RANGE.S */
295889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_SUPER.S */
295989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
296089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a "super" method call.
296189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
296289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-super, invoke-super/range
296389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
296489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
296589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
296689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(rINST_FULL)
296789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
296889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
296989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
297089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
297189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
297289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_method(rINST_FULL),%eax # eax<- method
297389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
297489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if       (!1)
297589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
297689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
297789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
297889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # null "this"?
297989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # yes, throw
298089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
298189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                 # already resolved?
298289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne       .LOP_INVOKE_SUPER_RANGE_continue      # yes - go on
298389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_INVOKE_SUPER_RANGE_resolve
298489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
298589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
298689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
298789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
298889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
298989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT_RANGE.S */
299089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT.S */
299189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
299289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a direct method call.
299389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
299489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
299589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * method invocation code, and use a flag to indicate that static
299689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
299789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * out we could avoiding loading the first arg twice.)
299889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
299989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-direct, invoke-direct/range
300089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
300189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
300289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
300389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
300489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax              # eax<- BBBB
300589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
300689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
300789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
300889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
300989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
301089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
301189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if       (!1)
301289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
301389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
301489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                # already resolved?
301589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
301689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_INVOKE_DIRECT_RANGE_resolve      # not resolved, do it now
301789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish:
301889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
301989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                # null "this"?
3020c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange  # no, continue on
302189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_errNullObject
302289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
302389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
302489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
302589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
302689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
302789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_STATIC_RANGE.S */
302889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_STATIC.S */
302989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
303089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle a static method call.
303189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
303289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-static, invoke-static/range
303389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
303489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
303589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
303689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
303789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
303889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
303989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
304089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
304189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
304289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax
3043c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange
304489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
304589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
304689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax
304789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
304889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)       # arg1<- BBBB
304989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)       # arg0<- clazz
305089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_INVOKE_STATIC_RANGE_continue
305189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
305289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
305389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
305489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
305589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
305689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE_RANGE.S */
305789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_INTERFACE.S */
305889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
305989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle an interface method call.
306089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
306189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: invoke-interface, invoke-interface/range
306289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
306389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
306489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
306589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
306689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
306789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if        (!1)
306889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl       $0xf,%eax               # eax<- C (or stays CCCC)
306989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
307089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
307189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
307289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl      %eax,%eax                # null this?
307389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je         common_errNullObject     # yes, fail
307489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
307589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       %eax,OUT_ARG0(%esp)                 # arg0<- class
307689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       offGlue_methodClassDex(%ecx),%eax   # eax<- methodClassDex
307789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       offGlue_method(%ecx),%ecx           # ecx<- method
307889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       %eax,OUT_ARG3(%esp)                 # arg3<- dex
307989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl     2(rPC),%eax                         # eax<- BBBB
308089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
308189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
308289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
308389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp        .LOP_INVOKE_INTERFACE_RANGE_continue
308489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
308589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
308689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
308789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
308889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */
308989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_79.S */
309089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
309189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
309289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
309389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
309489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
309589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
309689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */
309789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_7A.S */
309889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
309989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
310089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
310189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
310289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
310389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
310489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */
310589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_NEG_INT.S */
310689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unop.S */
310789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
310889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
310989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = op eax".
311089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
311189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
311289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
311389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
311489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
311589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
311689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
311789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
311889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
311989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
312089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    negl %eax
312189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
312289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
312389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
312489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
312589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
312689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
312789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */
312889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_NOT_INT.S */
312989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unop.S */
313089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
313189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
313289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = op eax".
313389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
313489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
313589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
313689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
313789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
313889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
313989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
314089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
31414c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project
31424c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project
31434c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    notl %eax
314489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
314589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
314689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
314789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
314889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
314989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
315089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */
315189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_NEG_LONG.S */
315289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
315389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx            # ecx<- BA
315489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                 # ecx<- B
315589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
315689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO           # rINST_FULL<- A
315789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
315889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
315989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    negl      %eax
316089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl      $0,%ecx
316189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    negl      %ecx
316289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
316389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
316489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
316589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
316689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
316789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
316889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
316989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
317089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */
317189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_NOT_LONG.S */
317289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
317389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx            # ecx<- BA
317489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                 # ecx<- B
317589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
317689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO           # rINST_FULL<- A
317789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
317889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
31794c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    notl      %eax
31804c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    notl      %ecx
318189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
318289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
318389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
318489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
318589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
318689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
318789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
318889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
318989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */
319089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_NEG_FLOAT.S */
319189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/fpcvt.S */
319289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
319389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit FP conversion operation.
319489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
319589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
319689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
319789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
319889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,rINST_FULL,4)      # %st0<- vB
319989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
320089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
320189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
320289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fchs
320389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
320489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
320589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
320689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
320789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
320889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
320989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */
321089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_NEG_DOUBLE.S */
321189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/fpcvt.S */
321289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
321389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit FP conversion operation.
321489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
321589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
321689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
321789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
321889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
321989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
322089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
322189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
322289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fchs
322389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
322489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
322589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
322689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
322789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
322889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
322989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */
323089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INT_TO_LONG.S */
323189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* int to long vA, vB */
323289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- +A
323389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
323489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
323589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)                          # will step on edx later
323689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
323789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd                                # edx:eax<- sssssssBBBBBBBB
323889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)          # v[A+1]<- edx/rPC
323989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
324089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)          # v[A+0]<- %eax
324189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
324289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
324389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
324489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
324589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
324689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
324789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */
324889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INT_TO_FLOAT.S */
324989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/fpcvt.S */
325089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
325189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit FP conversion operation.
325289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
325389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
325489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
325589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
325689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
325789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
325889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
325989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
326089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
326189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
326289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
326389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
326489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
326589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
326689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
326789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */
326889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INT_TO_DOUBLE.S */
326989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/fpcvt.S */
327089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
327189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit FP conversion operation.
327289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
327389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
327489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
327589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
327689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
327789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
327889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
327989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
328089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
328189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
328289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
328389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
328489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
328589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
328689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
328789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */
328889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_LONG_TO_INT.S */
328989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */
329089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MOVE.S */
329189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* for move, move-object, long-to-int */
329289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB */
329389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl rINST_HI,%eax         # eax<- BA
329489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb   $0xf,%al             # eax<- A
329589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl   $12,rINST_FULL       # rINST_FULL<- B
329689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,rINST_FULL)
329789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
329889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
329989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
330089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
330189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
330289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
330389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
330489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
330589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */
330689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_LONG_TO_FLOAT.S */
330789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/fpcvt.S */
330889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
330989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit FP conversion operation.
331089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
331189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
331289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
331389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
331489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
331589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
331689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
331789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
331889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
331989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
332089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
332189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
332289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
332389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
332489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
332589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */
332689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_LONG_TO_DOUBLE.S */
332789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/fpcvt.S */
332889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
332989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit FP conversion operation.
333089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
333189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
333289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
333389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
333489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
333589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
333689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
333789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
333889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
333989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
334089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
334189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
334289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
334389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
334489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
334589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */
334689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_FLOAT_TO_INT.S */
334789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/cvtfp_int.S */
334889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* On fp to int conversions, Java requires that
334989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
335089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
335189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
335289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
335389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * to play some games.
335489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
335589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* float/double to int/long vA, vB */
335689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
335789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
335889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
335989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
336089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
336189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
336289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
336389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ftst
336489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
336589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
336689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb     $0xc,%ah
336789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
336889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
336989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
337089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
337189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
337289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
337389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
337489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
337589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
337689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
337789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_FLOAT_TO_INT_continue
337889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
337989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
338089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
338189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
338289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */
338389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_FLOAT_TO_LONG.S */
338489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/cvtfp_int.S */
338589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* On fp to int conversions, Java requires that
338689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
338789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
338889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
338989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
339089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * to play some games.
339189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
339289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* float/double to int/long vA, vB */
339389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
339489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
339589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
339689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
339789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
339889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
339989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
340089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ftst
340189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
340289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
340389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb     $0xc,%ah
340489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
340589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
340689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
340789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
340889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
340989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
341089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
341189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
341289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
341389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
341489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_FLOAT_TO_LONG_continue
341589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
341689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
341789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
341889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
341989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
342089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_FLOAT_TO_DOUBLE.S */
342189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/fpcvt.S */
342289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
342389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit FP conversion operation.
342489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
342589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
342689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
342789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
342889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,rINST_FULL,4)      # %st0<- vB
342989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
343089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
343189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
343289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
343389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl  (rFP,%ecx,4)             # vA<- %st0
343489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
343589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
343689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
343789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
343889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
343989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */
344089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DOUBLE_TO_INT.S */
344189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/cvtfp_int.S */
344289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* On fp to int conversions, Java requires that
344389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
344489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
344589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
344689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
344789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * to play some games.
344889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
344989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* float/double to int/long vA, vB */
345089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
345189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
345289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
345389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
345489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
345589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
345689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
345789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ftst
345889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
345989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
346089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb     $0xc,%ah
346189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
346289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
346389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
346489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
346589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
346689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
346789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
346889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
346989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
347089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
347189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DOUBLE_TO_INT_continue
347289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
347389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
347489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
347589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
347689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */
347789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DOUBLE_TO_LONG.S */
347889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/cvtfp_int.S */
347989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* On fp to int conversions, Java requires that
348089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * if the result > maxint, it should be clamped to maxint.  If it is less
348189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * than minint, it should be clamped to minint.  If it is a nan, the result
348289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * should be zero.  Further, the rounding mode is to truncate.  This model
348389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have
348489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * to play some games.
348589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
348689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* float/double to int/long vA, vB */
348789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx           # ecx<- A+
348889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $12,rINST_FULL         # rINST_FULL<- B
348989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
349089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
349189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
349289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,rINST_FULL,4)       # %st0<- vB
349389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
349489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ftst
349589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
349689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   LOCAL0_OFFSET(%ebp),%eax
349789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb     $0xc,%ah
349889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw     %ax,LOCAL0_OFFSET+2(%ebp)
349989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
350089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
350189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl                # ecx<- A
350289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
350389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fistpll  (rFP,%ecx,4)             # convert and store
350489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
350589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fistpl   (rFP,%ecx,4)             # convert and store
350689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
350789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldcw    LOCAL0_OFFSET(%ebp)      # restore previous rounding mode
350889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DOUBLE_TO_LONG_continue
350989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
351089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
351189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
351289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
351389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
351489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DOUBLE_TO_FLOAT.S */
351589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/fpcvt.S */
351689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
351789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit FP conversion operation.
351889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
351989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
352089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
352189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
352289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
352389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
352489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
352589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
352689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
352789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps  (rFP,%ecx,4)             # vA<- %st0
352889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
352989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
353089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
353189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
353289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
353389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */
353489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INT_TO_BYTE.S */
353589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unop.S */
353689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
353789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
353889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = op eax".
353989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
354089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
354189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
354289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
354389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
354489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
354589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
354689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
354789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
354889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
354989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl %al,%eax
355089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
355189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
355289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
355389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
355489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
355589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
355689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */
355789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INT_TO_CHAR.S */
355889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unop.S */
355989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
356089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
356189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = op eax".
356289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
356389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
356489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
356589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
356689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
356789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
356889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
356989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
357089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
357189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
357289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl %ax,%eax
357389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
357489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
357589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
357689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
357789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
357889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
357989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */
358089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INT_TO_SHORT.S */
358189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unop.S */
358289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
358389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
358489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = op eax".
358589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
358689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* unop vA, vB */
358789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx           # ecx<- A+
358889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $12,rINST_FULL         # rINST_FULL<- B
358989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)        # eax<- vB
359089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,%cl               # ecx<- A
359189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
359289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
359389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
359489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
359589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl %ax,%eax
359689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
359789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
359889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
359989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
360089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
360189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
360289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */
360389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_INT.S */
360489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop.S */
360589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
360689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
360789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
360889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
360989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
361089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
361189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
361289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
361389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
361489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
361589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
361689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
361789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
361889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    addl (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
361989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
362089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
362189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
362289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
362389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
362489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
362589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
362689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
362789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
362889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
362989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */
363089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SUB_INT.S */
363189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop.S */
363289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
363389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
363489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
363589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
363689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
363789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
363889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
363989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
364089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
364189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
364289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
364389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
364489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
364589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    subl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
364689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
364789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
364889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
364989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
365089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
365189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
365289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
365389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
365489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
365589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
365689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */
365789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_INT.S */
365889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
365989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit binary multiplication.
366089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
366189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* mul vAA, vBB, vCC */
366289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
366389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
366489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
366589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
366689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    imull    (rFP,%ecx,4),%eax      # trashes rPC/edx
366789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
366889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx          # ecx<- AA
366989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
367089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
367189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
367289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
367389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
367489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
367589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
367689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */
367789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_INT.S */
367889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bindiv.S */
367989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
368089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
368189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
368289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * op1=-1.
368389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
368489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
368589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
368689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
368789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
368889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
368989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
369089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,%ecx
369189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_errDivideByZero
369289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%ecx
369389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_INT_continue_div
369489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%eax
369589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_INT_continue_div
369689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%eax
369789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DIV_INT_finish_div
369889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
369989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
370089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
370189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
370289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
370389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_INT: /* 0x94 */
370489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_INT.S */
370589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bindiv.S */
370689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
370789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
370889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
370989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * op1=-1.
371089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
371189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
371289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
371389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
371489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
371589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
371689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
371789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,%ecx
371889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_errDivideByZero
371989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%ecx
372089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_INT_continue_div
372189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%eax
372289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_INT_continue_div
372389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0,%edx
372489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_REM_INT_finish_div
372589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
372689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
372789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
372889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
372989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
373089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AND_INT: /* 0x95 */
373189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AND_INT.S */
373289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop.S */
373389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
373489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
373589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
373689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
373789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
373889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
373989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
374089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
374189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
374289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
374389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
374489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
374589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
374689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
374789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
374889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
374989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
375089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
375189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
375289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
375389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
375489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
375589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
375689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
375789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_OR_INT: /* 0x96 */
375889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_OR_INT.S */
375989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop.S */
376089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
376189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
376289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
376389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
376489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
376589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
376689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
376789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
376889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
376989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
377089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
377189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
377289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
377389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
377489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
377589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
377689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
377789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
377889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
377989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
378089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
378189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
378289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
378389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
378489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */
378589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_XOR_INT.S */
378689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop.S */
378789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
378889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
378989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * specifies an instruction that performs "result = eax op (rFP,%ecx,4)".
379089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
379189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
379289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
379389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int, sub-int, and-int, or-int,
379489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int
379589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
379689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
379789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
379889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
379989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
380089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
380189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
380289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
380389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
380489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
380589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
380689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
380789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
380889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
380989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
381089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
381189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */
381289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHL_INT.S */
381389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop1.S */
381489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
381589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
381689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
381789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
381889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
381989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
382089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
382189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
382289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
382389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sall    %cl,%eax                          # ex: addl    %ecx,%eax
382489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
382589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
382689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
382789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
382889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
382989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
383089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
383189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
383289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
383389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */
383489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHR_INT.S */
383589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop1.S */
383689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
383789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
383889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
383989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
384089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
384189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
384289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
384389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
384489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
384589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    %cl,%eax                          # ex: addl    %ecx,%eax
384689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
384789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
384889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
384989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
385089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
385189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
385289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
385389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
385489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
385589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */
385689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_USHR_INT.S */
385789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop1.S */
385889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
385989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary operation in which both operands loaded to
386089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * registers (op0 in eax, op1 in ecx).
386189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
386289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
386389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- BB
386489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- CC
386589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)             # eax<- vBB
386689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
386789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl    %cl,%eax                          # ex: addl    %ecx,%eax
386889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx          # tmp<- AA
386989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
387089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
387189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
387289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
387389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
387489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
387589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
387689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
387789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */
387889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_LONG.S */
387989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide.S */
388089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
388189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
388289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
388389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
388489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
388589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
388689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
388789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
388889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
388989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
389089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    addl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
389189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
389289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
389389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
389489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
389589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
389689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
389789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
389889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
389989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
390089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
390189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
390289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
390389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */
390489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SUB_LONG.S */
390589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide.S */
390689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
390789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
390889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
390989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
391089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
391189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
391289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
391389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
391489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
391589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
391689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    subl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
391789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sbbl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
391889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
391989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
392089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
392189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
392289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
392389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
392489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
392589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
392689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
392789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
392889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
392989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */
393089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_LONG.S */
393189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
393289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Signed 64-bit integer multiply.
393389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
393489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * We could definately use more free registers for
393589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * this code.  We must spill rPC (edx) because it
393689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * is used by imul.  We'll also spill rINST (ebx),
393789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * giving us eax, ebc, ecx and edx as computational
393889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * temps.  On top of that, we'll spill rIBASE (edi)
393989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for use as the vB pointer and rFP (esi) for use
394089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * as the vC pointer.  Yuck.
394189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
394289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* mul-long vAA, vBB, vCC */
394389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- B
394489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx              # ecx<- C
394589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
394689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)
394789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rFP)
394889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rINST_FULL)
394989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[B]
395089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      (rFP,%ecx,4),rFP         # rFP<- &v[C]
395189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      4(rIBASE),%ecx      # ecx<- Bmsw
395289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    imull     (rFP),%ecx          # ecx<- (Bmsw*Clsw)
395389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      4(rFP),%eax         # eax<- Cmsw
395489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    imull     (rIBASE),%eax       # eax<- (Cmsw*Blsw)
395589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    addl      %eax,%ecx           # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
395689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (rFP),%eax          # eax<- Clsw
395789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    mull      (rIBASE)            # eax<- (Clsw*Alsw)
395889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rINST_FULL)
395989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rFP)
396089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_MUL_LONG_continue
396189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
396289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
396389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
396489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */
396589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_LONG.S */
396689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div vAA, vBB, vCC */
396789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%eax              # eax<- CC
396889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
396989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
397089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
397189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
397289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
397389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
397489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_DIV_LONG_check_zero
397589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%eax
397689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_DIV_LONG_check_neg1
397789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_notSpecial:
397889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
397989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
398089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_notSpecial1:
398189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
398289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
398389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
398489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DIV_LONG_continue
398589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
398689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
398789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
398889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */
398989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_LONG.S */
399089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_LONG.S */
399189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div vAA, vBB, vCC */
399289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%eax              # eax<- CC
399389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%ecx              # ecx<- BB
399489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
399589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
399689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
399789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
399889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
399989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_REM_LONG_check_zero
400089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%eax
400189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_REM_LONG_check_neg1
400289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_notSpecial:
400389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
400489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
400589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_notSpecial1:
400689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
400789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
400889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
400989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_REM_LONG_continue
401089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
401189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
401289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
401389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
401489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */
401589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AND_LONG.S */
401689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide.S */
401789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
401889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
401989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
402089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
402189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
402289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
402389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
402489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
402589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
402689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
402789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
402889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
402989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
403089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
403189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
403289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
403389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
403489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
403589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
403689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
403789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
403889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
403989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
404089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */
404189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_OR_LONG.S */
404289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide.S */
404389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
404489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
404589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
404689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
404789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
404889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
404989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
405089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
405189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
405289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
405389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
405489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
405589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
405689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
405789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
405889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
405989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
406089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
406189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
406289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
406389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
406489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
406589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
406689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */
406789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_XOR_LONG.S */
406889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide.S */
406989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
407089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
407189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
407289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
407389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
407489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
407589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
407689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
407789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
407889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
407989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
408089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
408189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
408289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
408389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
408489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
408589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
408689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
408789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
408889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
408989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
409089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
409189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
409289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */
409389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHL_LONG.S */
409489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
409589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
409689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
409789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
409889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
409989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
410089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * case specially.
410189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
410289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* shl-long vAA, vBB, vCC */
410389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* ecx gets shift count */
410489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Need to spill edx */
410589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rINST gets AA */
410689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
410789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
410889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)                          # spill edx
410989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # ecx<- v[BB+1]
411089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
411189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
411289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shldl     %eax,%edx
411389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sall      %cl,%eax
411489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testb     $32,%cl
411589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        2f
411689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,%edx
411789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl      %eax,%eax
411889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project2:
411989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx
412089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- %edx
412189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
412289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
412389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_SHL_LONG_finish
412489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
412589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
412689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
412789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */
412889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHR_LONG.S */
412989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
413089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
413189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
413289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
413389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
413489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
413589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * case specially.
413689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
413789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* shr-long vAA, vBB, vCC */
413889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* ecx gets shift count */
413989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Need to spill edx */
414089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rINST gets AA */
414189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
414289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
414389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)                          # spill edx
414489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
414589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
414689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
414789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrdl     %edx,%eax
414889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      %cl,%edx
414989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testb     $32,%cl
415089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        2f
415189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %edx,%eax
415289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $31,%edx
415389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project2:
415489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx
415589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- edx
415689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
415789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
415889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_SHR_LONG_finish
415989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
416089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
416189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
416289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */
416389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_USHR_LONG.S */
416489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
416589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
416689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
416789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
416889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 6 bits of the shift distance.  x86 shifts automatically mask off
416989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31
417089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * case specially.
417189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
417289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* shr-long vAA, vBB, vCC */
417389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* ecx gets shift count */
417489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Need to spill edx */
417589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rINST gets AA */
417689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax               # eax<- BB
417789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    3(rPC),%ecx               # ecx<- CC
417889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)                          # spill edx
417989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
418089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
418189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
418289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrdl     %edx,%eax
418389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl      %cl,%edx
418489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testb     $32,%cl
418589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        2f
418689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %edx,%eax
418789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl      %edx,%edx
418889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project2:
418989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx
419089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%edx,%ecx,1)         # v[BB+1]<- edx
419189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
419289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_USHR_LONG_finish
419389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
419489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
419589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
419689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */
419789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_FLOAT.S */
419889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop.S */
419989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
420089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
420189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
420289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
420389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
420489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
420589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
420689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
420789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
420889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fadds   (rFP,%ecx,4)           # ex: faddp
420989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
421089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
421189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
421289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
421389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
421489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
421589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
421689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
421789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
421889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
421989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */
422089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SUB_FLOAT.S */
422189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop.S */
422289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
422389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
422489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
422589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
422689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
422789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
422889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
422989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
423089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
423189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fsubs   (rFP,%ecx,4)           # ex: faddp
423289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
423389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
423489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
423589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
423689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
423789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
423889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
423989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
424089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
424189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
424289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */
424389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_FLOAT.S */
424489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop.S */
424589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
424689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
424789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
424889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
424989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
425089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
425189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
425289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
425389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
425489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fmuls   (rFP,%ecx,4)           # ex: faddp
425589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
425689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
425789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
425889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
425989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
426089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
426189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
426289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
426389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
426489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
426589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */
426689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_FLOAT.S */
426789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop.S */
426889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
426989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
427089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
427189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
427289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
427389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
427489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
427589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
427689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,%eax,4)           # vCC to fp stack
427789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fdivs   (rFP,%ecx,4)           # ex: faddp
427889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
427989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
428089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
428189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps   (rFP,%ecx,4)           # %st to vAA
428289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
428389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
428489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
428589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
428689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
428789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
428889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */
428989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_FLOAT.S */
429089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rem_float vAA, vBB, vCC */
429189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
429289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
429389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%ecx,4)           # vCC to fp stack
429489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%eax,4)           # vCC to fp stack
429589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
429689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
429789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
42984c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    fprem
429989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstsw     %ax
430089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
430189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp        1b
430289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstp      %st(1)
430389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
430489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps    (rFP,%ecx,4)           # %st to vAA
430589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
430689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
430789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
430889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
430989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */
431089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_DOUBLE.S */
431189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop.S */
431289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
431389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
431489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
431589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
431689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
431789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
431889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
431989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
432089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
432189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    faddl   (rFP,%ecx,4)           # ex: faddp
432289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
432389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
432489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
432589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
432689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
432789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
432889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
432989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
433089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
433189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
433289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */
433389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SUB_DOUBLE.S */
433489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop.S */
433589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
433689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
433789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
433889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
433989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
434089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
434189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
434289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
434389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
434489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fsubl   (rFP,%ecx,4)           # ex: faddp
434589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
434689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
434789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
434889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
434989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
435089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
435189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
435289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
435389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
435489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
435589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */
435689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_DOUBLE.S */
435789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop.S */
435889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
435989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
436089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
436189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
436289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
436389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
436489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
436589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
436689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
436789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fmull   (rFP,%ecx,4)           # ex: faddp
436889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
436989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
437089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
437189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
437289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
437389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
437489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
437589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
437689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
437789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
437889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */
437989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_DOUBLE.S */
438089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop.S */
438189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
438289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
438389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
438489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
438589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
438689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop vAA, vBB, vCC */
438789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
438889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
438989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,%eax,4)           # vCC to fp stack
439089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fdivl   (rFP,%ecx,4)           # ex: faddp
439189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecx<- AA
439289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
439389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
439489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl   (rFP,%ecx,4)           # %st to vAA
439589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
439689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
439789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
439889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
439989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
440089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
440189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */
440289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_DOUBLE.S */
440389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rem_float vAA, vBB, vCC */
440489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   3(rPC),%ecx            # ecx<- BB
440589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   2(rPC),%eax            # eax<- CC
440689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%ecx,4)           # vCC to fp stack
440789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%eax,4)           # vCC to fp stack
440889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx          # ecx<- AA
440989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
441089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
44114c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    fprem
441289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstsw     %ax
441389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
441489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp        1b
441589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstp      %st(1)
441689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
441789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl    (rFP,%ecx,4)           # %st to vAA
441889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
441989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
442089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
442189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
442289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */
442389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_INT_2ADDR.S */
442489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop2addr.S */
442589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
442689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
442789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
442889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
442989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
443089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
443189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
443289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
443389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
443489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
443589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
443689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
443789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
443889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
443989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
444089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
444189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
444289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
444389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
444489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
444589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    addl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
444689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
444789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
444889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
444989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
445089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
445189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
445289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */
445389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SUB_INT_2ADDR.S */
445489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop2addr.S */
445589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
445689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
445789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
445889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
445989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
446089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
446189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
446289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
446389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
446489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
446589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
446689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
446789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
446889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
446989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
447089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
447189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
447289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
447389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
447489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
447589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    subl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
447689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
447789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
447889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
447989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
448089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
448189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
448289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */
448389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_INT_2ADDR.S */
448489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* mul vA, vB */
448589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
448689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
448789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
448889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
448989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
449089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    imull   (rFP,%ecx,4),%eax
449189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
449289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
449389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
449489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
449589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
449689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
449789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
449889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
449989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */
450089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_INT_2ADDR.S */
450189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bindiv2addr.S */
450289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
450389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
450489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * op1=-1.
450589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
450689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div/rem/2addr vA, vB */
450789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
450889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
450989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
451089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
451189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
451289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
451389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
451489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,%ecx
451589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_errDivideByZero
451689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%ecx
451789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_INT_2ADDR_continue_div2addr
451889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%eax
451989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_INT_2ADDR_continue_div2addr
452089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%eax
452189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DIV_INT_2ADDR_finish_div2addr
452289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
452389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
452489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
452589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
452689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
452789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */
452889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_INT_2ADDR.S */
452989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bindiv2addr.S */
453089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
453189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
453289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * op1=-1.
453389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
453489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div/rem/2addr vA, vB */
453589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
453689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
453789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
453889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
453989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
454089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
454189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
454289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,%ecx
454389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_errDivideByZero
454489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%ecx
454589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_INT_2ADDR_continue_div2addr
454689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%eax
454789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_INT_2ADDR_continue_div2addr
454889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0,%edx
454989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_REM_INT_2ADDR_finish_div2addr
455089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
455189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
455289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
455389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
455489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
455589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */
455689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AND_INT_2ADDR.S */
455789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop2addr.S */
455889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
455989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
456089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
456189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
456289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
456389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
456489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
456589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
456689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
456789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
456889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
456989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
457089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
457189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
457289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
457389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
457489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
457589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
457689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
457789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
457889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
457989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
458089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
458189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
458289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
458389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
458489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
458589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */
458689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_OR_INT_2ADDR.S */
458789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop2addr.S */
458889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
458989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
459089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
459189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
459289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
459389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
459489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
459589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
459689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
459789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
459889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
459989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
460089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
460189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
460289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
460389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
460489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
460589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
460689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
460789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
460889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
460989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
461089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
461189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
461289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
461389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
461489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
461589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */
461689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_XOR_INT_2ADDR.S */
461789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binop2addr.S */
461889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
461989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
462089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
462189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
462289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
462389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
462489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
462589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
462689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
462789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
462889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
462989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
463089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
463189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
463289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
463389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
463489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
463589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)           # eax<- vB
463689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
463789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
463889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
463989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
464089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
464189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
464289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
464389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
464489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
464589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */
464689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHL_INT_2ADDR.S */
464789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/shop2addr.S */
464889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
464989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
465089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
465189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* shift/2addr vA, vB */
465289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
465389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
465489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
465589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
465689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
465789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
465889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sall    %cl,%eax                          # ex: sarl %cl,%eax
465989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
466089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
466189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
466289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
466389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
466489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
466589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
466689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
466789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
466889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */
466989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHR_INT_2ADDR.S */
467089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/shop2addr.S */
467189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
467289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
467389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
467489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* shift/2addr vA, vB */
467589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
467689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
467789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
467889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
467989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
468089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
468189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    %cl,%eax                          # ex: sarl %cl,%eax
468289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
468389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
468489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
468589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
468689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
468789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
468889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
468989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
469089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
469189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */
469289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_USHR_INT_2ADDR.S */
469389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/shop2addr.S */
469489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
469589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "shift/2addr" operation.
469689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
469789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* shift/2addr vA, vB */
469889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx    rINST_HI,%ecx          # eax<- BA
469989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%ecx               # ecx<- B
470089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)             # eax<- vBB
470189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
470289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO         # rINST_FULL<- A
470389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
470489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl    %cl,%eax                          # ex: sarl %cl,%eax
470589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
470689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
470789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
470889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
470989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
471089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
471189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
471289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
471389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
471489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */
471589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_LONG_2ADDR.S */
471689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide2addr.S */
471789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
471889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
471989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
472089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
472189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
472289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
472389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
472489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
472589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
472689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
472789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    addl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
472889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
472989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
473089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
473189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
473289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
473389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
473489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
473589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
473689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */
473789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SUB_LONG_2ADDR.S */
473889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide2addr.S */
473989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
474089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
474189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
474289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
474389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
474489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
474589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
474689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
474789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
474889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
474989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    subl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
475089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sbbl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
475189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
475289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
475389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
475489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
475589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
475689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
475789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
475889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */
475989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_LONG_2ADDR.S */
476089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
476189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Signed 64-bit integer multiply, 2-addr version
476289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
476389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * We could definately use more free registers for
476489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * this code.  We must spill rPC (edx) because it
476589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * is used by imul.  We'll also spill rINST (ebx),
476689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * giving us eax, ebc, ecx and edx as computational
476789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * temps.  On top of that, we'll spill rIBASE (edi)
476889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for use as the vA pointer and rFP (esi) for use
476989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * as the vB pointer.  Yuck.
477089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
477189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* mul-long/2addr vA, vB */
477289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%eax            # eax<- BA
477389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,%al                # eax<- A
477489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $12,rINST_FULL          # rINST_FULL<- B
477589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
477689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)
477789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rFP)
477889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[A]
477989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      (rFP,rINST_FULL,4),rFP   # rFP<- &v[B]
478089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      4(rIBASE),%ecx      # ecx<- Amsw
478189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    imull     (rFP),%ecx          # ecx<- (Amsw*Blsw)
478289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      4(rFP),%eax         # eax<- Bmsw
478389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    imull     (rIBASE),%eax       # eax<- (Bmsw*Alsw)
478489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    addl      %eax,%ecx           # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
478589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (rFP),%eax          # eax<- Blsw
478689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    mull      (rIBASE)            # eax<- (Blsw*Alsw)
478789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_MUL_LONG_2ADDR_continue
478889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
478989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
479089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
479189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */
479289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_LONG_2ADDR.S */
479389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div/2addr vA, vB */
479489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%eax
479589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl      $4,%eax                  # eax<- B
479689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
479789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
479889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
479989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
480089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
480189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
480289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
480389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_DIV_LONG_2ADDR_check_zero
480489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%eax
480589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_DIV_LONG_2ADDR_check_neg1
480689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_2ADDR_notSpecial:
480789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
480889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
480989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_2ADDR_notSpecial1:
481089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DIV_LONG_2ADDR_continue
481189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
481289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
481389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
481489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */
481589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_LONG_2ADDR.S */
481689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_LONG_2ADDR.S */
481789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div/2addr vA, vB */
481889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%eax
481989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl      $4,%eax                  # eax<- B
482089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
482189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
482289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
482389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%eax,0)
482489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%eax,1)
482589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rPC,OUT_ARG2(%esp)
482689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
482789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_REM_LONG_2ADDR_check_zero
482889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%eax
482989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_REM_LONG_2ADDR_check_neg1
483089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_2ADDR_notSpecial:
483189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
483289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
483389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_2ADDR_notSpecial1:
483489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_REM_LONG_2ADDR_continue
483589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
483689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
483789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
483889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
483989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */
484089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AND_LONG_2ADDR.S */
484189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide2addr.S */
484289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
484389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
484489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
484589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
484689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
484789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
484889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
484989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
485089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
485189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
485289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
485389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
485489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
485589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
485689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
485789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
485889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
485989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
486089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
486189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */
486289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_OR_LONG_2ADDR.S */
486389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide2addr.S */
486489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
486589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
486689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
486789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
486889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
486989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
487089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
487189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
487289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
487389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
487489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
487589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
487689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
487789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
487889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
487989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
488089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
488189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
488289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
488389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
488489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_XOR_LONG_2ADDR.S */
488589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopWide2addr.S */
488689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
488789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 64-bit binary operation.
488889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
488989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
489089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
489189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
489289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
489389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
489489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
489589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xF,rINST_LO            # rINST_FULL<- A
489689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
489789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
489889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
489989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
490089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
490189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
490289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
490389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
490489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
490589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
490689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHL_LONG_2ADDR.S */
490789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
490889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
490989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit shift distance.
491089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
491189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* shl-long/2addr vA, vB */
491289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* ecx gets shift count */
491389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Need to spill edx */
491489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rINST gets AA */
491589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
491689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
491789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
491889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
491989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
492089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
492189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
492289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
492389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shldl     %eax,%edx
492489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sall      %cl,%eax
492589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testb     $32,%cl
492689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        2f
492789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,%edx
492889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl      %eax,%eax
492989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project2:
493089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
493189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
493289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_SHL_LONG_2ADDR_finish
493389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
493489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
493589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
493689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
493789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHR_LONG_2ADDR.S */
493889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
493989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
494089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit shift distance.
494189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
494289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* shl-long/2addr vA, vB */
494389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* ecx gets shift count */
494489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Need to spill edx */
494589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rINST gets AA */
494689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
494789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
494889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
494989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
495089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
495189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
495289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
495389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
495489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrdl     %edx,%eax
495589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      %cl,%edx
495689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testb     $32,%cl
495789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        2f
495889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %edx,%eax
495989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $31,%edx
496089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project2:
496189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
496289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
496389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_SHR_LONG_2ADDR_finish
496489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
496589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
496689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
496789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
496889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_USHR_LONG_2ADDR.S */
496989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
497089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
497189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit shift distance.
497289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
497389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* shl-long/2addr vA, vB */
497489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* ecx gets shift count */
497589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Need to spill edx */
497689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rINST gets AA */
497789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
497889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
497989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
498089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
498189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
498289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
498389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
498489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
498589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrdl     %edx,%eax
498689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl      %cl,%edx
498789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testb     $32,%cl
498889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        2f
498989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %edx,%eax
499089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl      %edx,%edx
499189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project2:
499289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
499389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
499489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_USHR_LONG_2ADDR_finish
499589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
499689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
499789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
499889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
499989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_FLOAT_2ADDR.S */
500089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop2addr.S */
500189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
500289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
500389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
500489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
500589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
500689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
500789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
500889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
500989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
501089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
501189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
501289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fadds   (rFP,rINST_FULL,4)           # ex: faddp
501389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
501489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
501589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
501689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
501789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
501889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
501989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
502089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
502189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
502289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SUB_FLOAT_2ADDR.S */
502389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop2addr.S */
502489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
502589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
502689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
502789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
502889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
502989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
503089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
503189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
503289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
503389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
503489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
503589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fsubs   (rFP,rINST_FULL,4)           # ex: faddp
503689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
503789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
503889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
503989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
504089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
504189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
504289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
504389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
504489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
504589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_FLOAT_2ADDR.S */
504689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop2addr.S */
504789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
504889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
504989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
505089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
505189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
505289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
505389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
505489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
505589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
505689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
505789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
505889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fmuls   (rFP,rINST_FULL,4)           # ex: faddp
505989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
506089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
506189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
506289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
506389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
506489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
506589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
506689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
506789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
506889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_FLOAT_2ADDR.S */
506989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop2addr.S */
507089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
507189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
507289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
507389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
507489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
507589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
507689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
507789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
507889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
507989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds    (rFP,%ecx,4)               # vAA to fp stack
508089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
508189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fdivs   (rFP,rINST_FULL,4)           # ex: faddp
508289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
508389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
508489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps    (rFP,%ecx,4)              # %st to vA
508589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
508689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
508789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
508889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
508989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
509089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */
509189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_FLOAT_2ADDR.S */
509289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rem_float/2addr vA, vB */
509389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
509489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
509589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,rINST_FULL,4)         # vBB to fp stack
509689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
509789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    flds     (rFP,%ecx,4)               # vAA to fp stack
509889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
509989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
51004c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    fprem
510189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstsw     %ax
510289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
510389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp        1b
510489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstp      %st(1)
510589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
510689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstps    (rFP,%ecx,4)               # %st to vA
510789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
510889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
510989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
511089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
511189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
511289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_DOUBLE_2ADDR.S */
511389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop2addr.S */
511489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
511589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
511689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
511789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
511889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
511989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
512089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
512189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
512289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
512389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
512489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
512589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    faddl   (rFP,rINST_FULL,4)           # ex: faddp
512689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
512789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
512889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
512989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
513089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
513189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
513289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
513389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
513489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
513589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SUB_DOUBLE_2ADDR.S */
513689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop2addr.S */
513789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
513889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
513989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
514089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
514189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
514289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
514389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
514489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
514589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
514689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
514789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
514889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fsubl   (rFP,rINST_FULL,4)           # ex: faddp
514989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
515089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
515189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
515289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
515389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
515489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
515589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
515689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
515789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
515889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_DOUBLE_2ADDR.S */
515989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop2addr.S */
516089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
516189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
516289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
516389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
516489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
516589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
516689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
516789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
516889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
516989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
517089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
517189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fmull   (rFP,rINST_FULL,4)           # ex: faddp
517289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
517389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
517489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
517589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
517689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
517789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
517889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
517989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
518089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
518189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_DOUBLE_2ADDR.S */
518289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binflop2addr.S */
518389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
518489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit binary float operation.
518589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
518689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-fp, sub-fp, mul-fp, div-fp
518789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
518889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
518989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/2addr vA, vB */
519089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
519189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
519289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl    (rFP,%ecx,4)               # vAA to fp stack
519389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
519489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fdivl   (rFP,rINST_FULL,4)           # ex: faddp
519589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
519689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
519789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl    (rFP,%ecx,4)              # %st to vA
519889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
519989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
520089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
520189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
520289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
520389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
520489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_DOUBLE_2ADDR.S */
520589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* rem_float/2addr vA, vB */
520689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx   rINST_HI,%ecx               # ecx<- A+
520789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $12,rINST_FULL             # rINST_FULL<- B
520889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,rINST_FULL,4)         # vBB to fp stack
520989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecx<- A
521089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fldl     (rFP,%ecx,4)               # vAA to fp stack
521189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
521289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
52134c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    fprem
521489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstsw     %ax
521589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
521689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp        1b
521789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstp      %st(1)
521889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
521989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fstpl    (rFP,%ecx,4)               # %st to vA
522089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
522189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
522289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
522389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
522489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */
522589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_INT_LIT16.S */
522689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit16.S */
522789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
522889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
522989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
523089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
523189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
523289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
523389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit16, rsub-int,
523489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
523589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
523689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
523789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
523889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%eax                   # eax<- B
523989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
524089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
524189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
524289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
52434c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    addl %ecx,%eax                              # for example: addl %ecx, %eax
524489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
524589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
524689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
524789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
524889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
524989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
525089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
525189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
525289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_RSUB_INT: /* 0xd1 */
525389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_RSUB_INT.S */
52544c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project/* File: x86/binopLit16.S */
525589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
52564c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
52574c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
52584c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
52594c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project     * comes back in a register other than eax, you can override "result".)
52604c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project     *
52614c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project     * For: add-int/lit16, rsub-int,
52624c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
526389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
52644c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
52654c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
52664c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    sarl     $4,%eax                   # eax<- B
52674c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
52684c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
52694c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
52704c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
52714c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    subl %eax,%ecx                              # for example: addl %ecx, %eax
52724c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    SET_VREG(%ecx,rINST_FULL)
527389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
527489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
527589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
527689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
527789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
527889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
527989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
528089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */
528189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_INT_LIT16.S */
528289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* mul/lit16 vA, vB, #+CCCC */
528389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
528489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
528589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%eax                   # eax<- B
528689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
528789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
528889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
528989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
529089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
529189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    imull     %ecx,%eax                 # trashes rPC
529289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
529389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
529489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
529589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
529689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
529789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
529889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
529989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
530089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */
530189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_INT_LIT16.S */
530289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bindivLit16.S */
530389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
530489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
530589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * op1=-1.
530689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
530789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div/rem/lit16 vA, vB, #+CCCC */
530889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
530989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
531089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%eax                   # eax<- B
531189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
531289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
531389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
531489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
531589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
531689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,%ecx
531789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_errDivideByZero
531889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%ecx
531989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_INT_LIT16_continue_div
532089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%eax
532189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_INT_LIT16_continue_div
532289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%eax
532389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DIV_INT_LIT16_finish_div
532489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
532589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
532689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
532789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
532889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
532989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */
533089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_INT_LIT16.S */
533189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bindivLit16.S */
533289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
533389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit binary div/rem operation.  Handles special case of op0=minint and
533489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * op1=-1.
533589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
533689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div/rem/lit16 vA, vB, #+CCCC */
533789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
533889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
533989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%eax                   # eax<- B
534089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
534189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
534289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
534389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
534489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
534589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,%ecx
534689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_errDivideByZero
534789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%ecx
534889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_INT_LIT16_continue_div
534989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%eax
535089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_INT_LIT16_continue_div
535189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0,%edx
535289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_REM_INT_LIT16_finish_div
535389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
535489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
535589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
535689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
535789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
535889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */
535989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AND_INT_LIT16.S */
536089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit16.S */
536189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
536289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
536389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
536489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
536589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
536689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
536789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit16, rsub-int,
536889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
536989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
537089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
537189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
537289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%eax                   # eax<- B
537389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
537489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
537589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
537689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
53774c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    andl %ecx,%eax                              # for example: addl %ecx, %eax
537889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
537989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
538089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
538189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
538289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
538389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
538489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
538589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
538689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */
538789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_OR_INT_LIT16.S */
538889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit16.S */
538989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
539089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
539189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
539289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
539389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
539489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
539589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit16, rsub-int,
539689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
539789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
539889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
539989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
540089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%eax                   # eax<- B
540189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
540289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
540389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
540489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
54054c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    orl     %ecx,%eax                              # for example: addl %ecx, %eax
540689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
540789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
540889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
540989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
541089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
541189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
541289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
541389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
541489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
541589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */
541689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_XOR_INT_LIT16.S */
541789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit16.S */
541889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
541989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
542089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
542189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
542289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than eax, you can override "result".)
542389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
542489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit16, rsub-int,
542589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit16, or-int/lit16, xor-int/lit16
542689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
542789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
542889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%eax              # eax<- 000000BA
542989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl     $4,%eax                   # eax<- B
543089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB
543189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
543289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
543389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb     $0xf,rINST_LO             # rINST_FULL<- A
54344c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    xor    %ecx,%eax                              # for example: addl %ecx, %eax
543589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
543689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
543789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
543889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
543989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
544089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
544189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
544289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
544389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */
544489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_ADD_INT_LIT8.S */
544589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit8.S */
544689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
544789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
544889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
544989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
545089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
545189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
545289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
545389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
545489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
545589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
545689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
545789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
545889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
545989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
546089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
546189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    addl %ecx,%eax                             # ex: addl %ecx,%eax
546289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
546389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
546489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
546589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
546689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
546789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
546889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
546989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
547089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */
547189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_RSUB_INT_LIT8.S */
547289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit8.S */
547389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
547489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
547589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
547689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
547789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
547889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
547989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
548089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
548189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
548289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
548389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
548489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
548589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
548689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
548789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
548889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    subl  %eax,%ecx                             # ex: addl %ecx,%eax
548989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%ecx,rINST_FULL)
549089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
549189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
549289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
549389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
549489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
549589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
549689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
549789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */
549889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_MUL_INT_LIT8.S */
549989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* mul/lit8 vAA, vBB, #+CC */
550089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
550189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
550289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
550389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
550489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
550589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    imull     %ecx,%eax                # trashes rPC
550689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
550789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
550889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
550989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
551089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
551189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
551289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
551389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
551489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
551589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */
551689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_DIV_INT_LIT8.S */
551789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bindivLit8.S */
551889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
551989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit div/rem "lit8" binary operation.  Handles special case of
552089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * op0=minint & op1=-1
552189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
552289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div/rem/lit8 vAA, vBB, #+CC */
552389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
552489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
552589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
552689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
552789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
552889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,%ecx
552989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_errDivideByZero
553089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%eax
553189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_INT_LIT8_continue_div
553289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%ecx
553389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_INT_LIT8_continue_div
553489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%eax
553589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DIV_INT_LIT8_finish_div
553689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
553789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
553889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
553989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
554089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
554189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */
554289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_REM_INT_LIT8.S */
554389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/bindivLit8.S */
554489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
554589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * 32-bit div/rem "lit8" binary operation.  Handles special case of
554689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * op0=minint & op1=-1
554789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
554889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* div/rem/lit8 vAA, vBB, #+CC */
554989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
555089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
555189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
555289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
555389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
555489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0,%ecx
555589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_errDivideByZero
555689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%eax
555789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_INT_LIT8_continue_div
555889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $-1,%ecx
555989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_INT_LIT8_continue_div
556089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0,%edx
556189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_REM_INT_LIT8_finish_div
556289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
556389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
556489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
556589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
556689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
556789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */
556889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_AND_INT_LIT8.S */
556989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit8.S */
557089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
557189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
557289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
557389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
557489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
557589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
557689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
557789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
557889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
557989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
558089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
558189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
558289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
558389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
558489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
558589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl %ecx,%eax                             # ex: addl %ecx,%eax
558689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
558789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
558889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
558989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
559089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
559189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
559289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
559389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
559489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */
559589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_OR_INT_LIT8.S */
559689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit8.S */
559789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
559889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
559989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
560089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
560189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
560289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
560389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
560489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
560589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
560689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
560789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
560889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
560989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
561089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
561189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
561289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl     %ecx,%eax                             # ex: addl %ecx,%eax
561389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
561489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
561589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
561689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
561789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
561889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
561989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
562089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
562189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
562289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */
562389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_XOR_INT_LIT8.S */
562489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit8.S */
562589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
562689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
562789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
562889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
562989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
563089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
563189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
563289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
563389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
563489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
563589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
563689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
563789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
563889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
563989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
564089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xor    %ecx,%eax                             # ex: addl %ecx,%eax
564189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
564289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
564389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
564489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
564589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
564689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
564789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
564889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
564989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */
565089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHL_INT_LIT8.S */
565189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit8.S */
565289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
565389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
565489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
565589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
565689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
565789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
565889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
565989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
566089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
566189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
566289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
566389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
566489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
566589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
566689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
566789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sall  %cl,%eax                             # ex: addl %ecx,%eax
566889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
566989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
567089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
567189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
567289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
567389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
567489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
567589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
567689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */
567789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_SHR_INT_LIT8.S */
567889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit8.S */
567989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
568089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
568189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
568289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
568389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
568489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
568589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
568689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
568789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
568889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
568989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
569089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
569189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
569289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
569389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
569489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    %cl,%eax                             # ex: addl %ecx,%eax
569589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
569689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
569789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
569889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
569989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
570089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
570189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
570289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
570389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */
570489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_USHR_INT_LIT8.S */
570589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/binopLit8.S */
570689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
570789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
570889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * that specifies an instruction that performs "result = eax op ecx".
570989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * This could be an x86 instruction or a function call.  (If the result
571089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
571189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
571289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8
571389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      and-int/lit8, or-int/lit8, xor-int/lit8,
571489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
571589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
571689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
571789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    2(rPC),%eax              # eax<- BB
571889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
571989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
572089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG  (%eax,%eax)              # eax<- rBB
572189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl     %cl,%eax                             # ex: addl %ecx,%eax
572289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,rINST_FULL)
572389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
572489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
572589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
572689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
572789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
572889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
572989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
573089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_E3: /* 0xe3 */
573189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_E3.S */
573289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
573389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
573489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
573589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
573689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
573789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
573889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_E4: /* 0xe4 */
573989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_E4.S */
574089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
574189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
574289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
574389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
574489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
574589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
574689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_E5: /* 0xe5 */
574789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_E5.S */
574889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
574989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
575089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
575189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
575289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
575389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
575489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_E6: /* 0xe6 */
575589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_E6.S */
575689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
575789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
575889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
575989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
576089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
576189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
576289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_E7: /* 0xe7 */
576389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_E7.S */
576489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
576589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
576689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
576789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
576889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
576989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
577089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_E8: /* 0xe8 */
577189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_E8.S */
577289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
577389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
577489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
577589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
577689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
577789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
577889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_E9: /* 0xe9 */
577989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_E9.S */
578089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
578189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
578289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
578389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
578489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
578589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
578689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_EA: /* 0xea */
578789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_EA.S */
578889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
578989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
579089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
579189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
579289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
579389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
579489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_EB: /* 0xeb */
579589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_EB.S */
579689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
579789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
579889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
579989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
580089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
580189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
580289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_EC: /* 0xec */
580389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_EC.S */
580489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
580589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
580689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
580789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
580889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
580989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
581089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_ED: /* 0xed */
581189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_ED.S */
581289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
581389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
581489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
581589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
581689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
581789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
581889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */
581989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_EXECUTE_INLINE.S */
582089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
582189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Execute a "native inline" instruction.
582289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
582389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * We will be calling through a function table:
582489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
582589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * (*gDvmInlineOpsTable[opIndex].func)(arg0, arg1, arg2, arg3, pResult)
582689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
582789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
582889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
582989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
583089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
583189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
583289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      offGlue_retval(%ecx),%ecx # ecx<- & glue->retval
583389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,OUT_ARG4(%esp)
583489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $12,rINST_FULL           # rINST_FULL<- arg count (0-4)
583589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
583689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call      .LOP_EXECUTE_INLINE_continue      # make call; will return after
583789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
583889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # successful?
583989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
584089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_exceptionThrown    # no, handle exception
584189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
584289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
584389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
584489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
584589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
584689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_EF: /* 0xef */
584789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_EF.S */
584889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
584989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
585089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
585189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
585289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
585389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
585489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */
585589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_DIRECT_EMPTY.S */
585689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
585789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * invoke-direct-empty is a no-op in a "standard" interpreter.
585889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
585989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
586089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
586189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
586289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
586389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
586489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
586589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */
586689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_F1.S */
586789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
586889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
586989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
587089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
587189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
587289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
587389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */
587489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_QUICK.S */
587589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* For: iget-quick, iget-object-quick */
587689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, offset@CCCC */
587789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
587889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
587989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
588089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
588189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
588289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject
588389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,1),%eax
588489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx
588589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
588689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
588789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,%cl                 # rINST_FULL<- A
588889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,%ecx)               # fp[A]<- result
588989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
589089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
589189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
589289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
589389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
589489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_WIDE_QUICK.S */
589589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* For: iget-wide-quick */
589689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, offset@CCCC */
589789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
589889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
589989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
590089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
590189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
590289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject
590389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      (%ecx,%eax,1),%eax        # eax<- address of 64-bit source
590489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%eax),%ecx               # ecx<- lsw
590589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      4(%eax),%eax               # eax<- msw
590689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
590789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
590889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)    # v[A+0]<- lsw
590989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[A+1]<- msw
591089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
591189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
591289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
591389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
591489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
591589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
591689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
591789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_OBJECT_QUICK.S */
591889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IGET_QUICK.S */
591989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* For: iget-quick, iget-object-quick */
592089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, offset@CCCC */
592189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
592289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
592389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
592489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
592589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl      $0,%ecx                  # is object null?
592689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject
592789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,1),%eax
592889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx
592989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
593089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
593189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,%cl                 # rINST_FULL<- A
593289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG  (%eax,%ecx)               # fp[A]<- result
593389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
593489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
593589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
593689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
593789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
593889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */
593989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_QUICK.S */
594089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* For: iput-quick, iput-object-quick */
594189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, offset@CCCC */
594289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
594389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
594489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
594589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
594689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
594789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
594889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
594989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                  # is object null?
595089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject
595189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,(%ecx,%eax,1)
595289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
595389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
595489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
595589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
595689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
595789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
595889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
595989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_WIDE_QUICK.S */
596089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* For: iput-wide-quick */
596189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, offset@CCCC */
596289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
596389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
596489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
596589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
596689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl      %ecx,%ecx                # is object null?
596789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject
596889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      (%ecx,%eax,1),%ecx        # ecx<- Address of 64-bit target
596989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
597089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
597189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- lsw
597289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- msw
597389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,(%ecx)
597489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,4(%ecx)
597589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
597689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
597789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
597889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
597989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
598089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
598189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
598289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_OBJECT_QUICK.S */
598389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_IPUT_QUICK.S */
598489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* For: iput-quick, iput-object-quick */
598589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vA, vB, offset@CCCC */
598689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx             # ecx<- BA
598789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,%ecx                  # ecx<- B
598889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
598989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,rINST_FULL
599089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb      $0xf,rINST_LO            # rINST_FULL<- A
599189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
599289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- field byte offset
599389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                  # is object null?
599489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject
599589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,(%ecx,%eax,1)
599689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
599789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
599889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
599989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
600089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
600189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
600289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
600389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
600489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
600589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
600689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle an optimized virtual method call.
600789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
600889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
600989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
601089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
601189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
601289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
601389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%ecx               # ecx<- BBBB
601489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if     (!0)
601589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,%eax                # eax<- C (or stays CCCC)
601689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
601789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
601889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null?
601989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # yep, throw exception
602089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
602189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
602289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                         # might throw later - get ready
602389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
6024c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
6025c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
602689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
602789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
602889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
602989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
603089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
603189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
603289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_VIRTUAL_QUICK.S */
603389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
603489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle an optimized virtual method call.
603589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
603689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
603789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
603889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
603989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
604089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- FEDC or CCCC
604189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%ecx               # ecx<- BBBB
604289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if     (!1)
604389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,%eax                # eax<- C (or stays CCCC)
604489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
604589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
604689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null?
604789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # yep, throw exception
604889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
604989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
605089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                         # might throw later - get ready
605189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
6052c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
6053c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
605489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
605589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
605689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
605789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
605889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
605989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
606089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK.S */
606189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
606289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle an optimized "super" method call.
606389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
606489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
606589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
606689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
606789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
606889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
606989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- GFED or CCCC
607089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- current method
607189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if       (!0)
607289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,%eax                # eax<- D (or stays CCCC)
607389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
607489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
607589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
607689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
607789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null "this"?
607889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # "this" is null, throw exception
607989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
608089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
608189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
608289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
6083c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
608489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
608589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
608689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
608789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
608889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
608989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK_RANGE.S */
609089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_INVOKE_SUPER_QUICK.S */
609189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
609289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Handle an optimized "super" method call.
609389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
609489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
609589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
609689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
609789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
609889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
609989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),%eax               # eax<- GFED or CCCC
610089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offGlue_method(%ecx),%ecx # ecx<- current method
610189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if       (!1)
610289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,%eax                # eax<- D (or stays CCCC)
610389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
610489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
610589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- "this"
610689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
610789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # null "this"?
610889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # "this" is null, throw exception
610989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    2(rPC),%eax               # eax<- BBBB
611089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
611189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
611289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
6113c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
611489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
611589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
611689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
611789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
611889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
611989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_FC: /* 0xfc */
612089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_FC.S */
612189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
612289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
612389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
612489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
612589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
612689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
612789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_FD: /* 0xfd */
612889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_FD.S */
612989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
613089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
613189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
613289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
613389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
613489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
613589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_FE: /* 0xfe */
613689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_FE.S */
613789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
613889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
613989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
614089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
614189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* ------------------------------ */
614289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
614389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */
614489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/OP_UNUSED_FF.S */
614589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/unused.S */
614689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_abort
614789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
614889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
614989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
615089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 64
615189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
615289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .global dvmAsmInstructionEnd
615389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectdvmAsmInstructionEnd:
615489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
615589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
615689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * ===========================================================================
615789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *  Sister implementations
615889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * ===========================================================================
615989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
616089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .global dvmAsmSisterStart
616189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .type   dvmAsmSisterStart, %function
616289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .text
616389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .balign 4
616489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectdvmAsmSisterStart:
616589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
616689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_CONST_STRING */
616789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
616889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* This is the less common path, so we'll redo some work
616989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   here rather than force spills on the common path */
617089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CONST_STRING_resolve:
617189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
617289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
617389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
617489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
617589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%ecx               # ecx<- BBBB
617689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
617789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
617889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
617989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
618089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveString          # go resolve
618189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
618289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax                 # failed?
618389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_exceptionThrown
618489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
618589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
618689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
618789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
618889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
618989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
619089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */
619189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
619289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* This is the less common path, so we'll redo some work
619389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   here rather than force spills on the common path */
619489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve:
619589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
619689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
619789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
619889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
619989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     2(rPC),%ecx               # ecx<- BBBBBBBB
620089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
620189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
620289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
620389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
620489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveString          # go resolve
620589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
620689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax                 # failed?
620789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_exceptionThrown
620889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
620989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
621089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
621189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
621289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
621389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
621489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_CONST_CLASS */
621589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
621689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* This is the less common path, so we'll redo some work
621789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   here rather than force spills on the common path */
621889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CONST_CLASS_resolve:
621989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%eax)
622089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
622189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
622289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%eax),%eax # eax<- glue->method
622389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $1,OUT_ARG2(%esp)        # true
622489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%ecx               # ecx<- BBBB
622589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%eax),%eax
622689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
622789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
622889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG0(%esp)
622989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveClass           # go resolve
623089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
623189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax                 # failed?
623289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_exceptionThrown
623389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
623489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
623589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
623689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
623789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
623889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
623989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_MONITOR_ENTER */
624089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
624189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_MONITOR_ENTER_continue:
624289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)                          # have to - caller save
624389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
624489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
624589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmLockObject               # dvmLockObject(self,object)
624689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
624789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION
624889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
624989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlueSelf(%ecx),%ecx      # ecx<- glue->self
625089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offThread_exception(%ecx),%eax
625189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax
625289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     common_exceptionThrown
625389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#endif
625489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
625589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
625689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
625789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_MONITOR_EXIT */
625889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
625989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_MONITOR_EXIT_continue:
626089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmUnlockObject             # unlock(self,obj)
626189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
626289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
626389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # success?
626489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown      # no, exception pending
626589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
626689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
626789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
626889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_CHECK_CAST */
626989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
627089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
627189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
627289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx holds obj->clazz
627389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  eax holds class resolved from BBBB
627489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  rINST_FULL holds object
627589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
627689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CHECK_CAST_fullcheck:
627789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
627889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
627989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
628089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmInstanceofNonTrivial     # eax<- boolean result
628189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
628289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # failed?
628389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_CHECK_CAST_okay            # no, success
628489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
628589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    # A cast has failed.  We need to throw a ClassCastException with the
628689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    # class of the object that failed to be cast.
628789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
628889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
628989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrClassCastException,%eax
629089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_descriptor(%ecx),%ecx
629189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)     # arg0<- message
629289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)     # arg1<- obj->clazz->descriptor
629389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
629489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowExceptionWithClassMessage
629589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
629689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
629789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
629889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
629989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Resolution required.  This is the least-likely path, and we're
630089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * going to have to recreate some data.
630189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
630289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  rINST_FULL holds object
630389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
630489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CHECK_CAST_resolve:
630589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
630689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
630789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),%eax                # eax<- BBBB
630889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
630989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)        # arg1<- BBBB
631089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx # ecx<- metho->clazz
631189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $0,OUT_ARG2(%esp)         # arg2<- false
631289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)        # arg0<- method->clazz
631389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
631489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveClass            # eax<- resolved ClassObject ptr
631589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
631689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                  # got null?
631789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown     # yes, handle exception
631889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
631989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_CHECK_CAST_resolved       # pick up where we left off
632089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
632189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INSTANCE_OF */
632289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
632389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
632489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
632589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  eax holds obj->clazz
632689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx holds class resolved from BBBB
632789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  rINST_HI has BA
632889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  rPC already spilled
632989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
633089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INSTANCE_OF_fullcheck:
633189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
633289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)
633389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmInstanceofNonTrivial     # eax<- boolean result
633489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    # fall through to OP_INSTANCE_OF_store
633589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
633689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
633789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * eax holds boolean result
633889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * rINST_HI holds BA
633989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
634089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INSTANCE_OF_store:
634189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
634289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- BA
634389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
634489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecl<- A
634589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
634689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)                 # vA<- eax
634789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
634889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
634989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
635089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Trivial test succeeded, save and bail.
635189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  r9 holds A
635289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
635389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INSTANCE_OF_trivial:
635489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
635589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%ecx               # ecx<- BA
635689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
635789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andb    $0xf,%cl                   # ecl<- A
635889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
635989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $1,%eax
636089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)                  # vA<- true
636189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
636289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
636389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
636489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Resolution required.  This is the least-likely path.
636589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
636689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  rPC holds BBBB
636789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  rINST_HI holds BA
636889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
636989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INSTANCE_OF_resolve:
637089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG1(%esp)          # arg1<- BBBB
637189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
637289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
637389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(%ecx),%ecx
637489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $1,OUT_ARG2(%esp)          # arg2<- true
637589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
637689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
637789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)         # arg0<- method->clazz
637889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveClass             # eax<- resolved ClassObject ptr
637989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
638089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # success?
638189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown      # no, handle exception
638289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* Now, we need to sync up with fast path.  We need eax to
638389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * hold the obj->clazz, and ecx to hold the resolved class
638489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
638589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved class
638689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  rINST_HI,%eax               # eax<- BA
638789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,%eax                    # eax<- B
638889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
638989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
639089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     .LOP_INSTANCE_OF_resolved
639189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
639289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
639389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_NEW_INSTANCE */
639489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
639589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_NEW_INSTANCE_initialized:  # on entry, ecx<- class
639689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     $(ACC_INTERFACE|ACC_ABSTRACT),offClassObject_accessFlags(%ecx)
639789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $ALLOC_DONT_TRACK,OUT_ARG1(%esp)
639889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne       .LOP_NEW_INSTANCE_abstract
639989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_NEW_INSTANCE_finish: # ecx=class
640089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
640189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmAllocObject             # eax<- new object
640289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
640389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%ecx
640489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
640589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax                  # success?
640689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       common_exceptionThrown     # no, bail out
640789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
640889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
640989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
641089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
641189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
641289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Class initialization required.
641389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
641489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx holds class object
641589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
641689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_NEW_INSTANCE_needinit:
641789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                     # save object
641889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
641989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmInitClass                # initialize class
642089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)                   # restore object
642189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # success?
642289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_NEW_INSTANCE_initialized     # success, continue
642389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)                        # failed, restore PC
642489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown      # go deal with init exception
642589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
642689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
642789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Resolution required.  This is the least-likely path.
642889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
642989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
643089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_NEW_INSTANCE_resolve:
643189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
643289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),%eax
643389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(%ecx),%ecx   # ecx<- glue->method
643489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
643589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
643689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $0,OUT_ARG2(%esp)
643789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
643889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveClass             # call(clazz,off,flags)
643989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved ClassObject ptr
644089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                   # success?
644189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_NEW_INSTANCE_resolved        # good to go
644289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
644389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown      # no, handle exception
644489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
644589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
644689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * We can't instantiate an abstract class or interface, so throw an
644789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * InstantiationError with the class descriptor as the message.
644889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
644989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx holds class object
645089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
645189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_NEW_INSTANCE_abstract:
645289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_descriptor(%ecx),%eax
64534c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    movl    $.LstrInstantiationError,OUT_ARG0(%esp)
64544c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
645589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowExceptionWithClassMessage
645689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
645789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
645889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
645989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
646089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
646189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
646289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_NEW_ARRAY */
646389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
646489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
646589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Resolve class.  (This is an uncommon case.)
646689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx holds class (null here)
646789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  eax holds array length (vB)
646889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
646989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_NEW_ARRAY_resolve:
647089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
647189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%eax)                    # save array length
647289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
647389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),%eax                # eax<- CCCC
647489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
647589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
647689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $0,OUT_ARG2(%esp)
647789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
647889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
647989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveClass            # eax<- call(clazz,ref,flag)
648089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
648189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,%ecx
648289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%eax)
648389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                  # successful resolution?
648489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown     # no, bail.
648589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project# fall through to OP_NEW_ARRAY_finish
648689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
648789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
648889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Finish allocation
648989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
649089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * ecx holds class
649189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * eax holds array length (vB)
649289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
649389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_NEW_ARRAY_finish:
649489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
649589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
649689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)
649789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
649889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmAllocArrayByClass    # eax<- call(clazz,length,flags)
649989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
650089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax               # failed?
650189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown  # yup - go handle
650289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%ecx
650389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
650489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
650589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
650689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
650789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
650889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
650989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */
651089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
651189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FILLED_NEW_ARRAY_more:
651289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
651389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
651489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
651589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
651689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                         # null?
651789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown            # yes, handle it
651889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
651989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project       # note: fall through to .LOP_FILLED_NEW_ARRAY_continue
652089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
652189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
652289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * On entry:
652389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *    eax holds array class [r0]
652489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *    rINST_FULL holds AA or BB [r10]
652589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *    ecx is scratch
652689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *    rPC is valid, but has been spilled
652789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
652889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue:
652989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
653089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
653189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
653289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)                   # arg0<- typeCh
653389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpb    $'I',%cl                             # supported?
653489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_FILLED_NEW_ARRAY_notimpl                  # no, not handled yet
653589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if      (!0)
653689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
653789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,rINST_FULL
653889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
653989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
654089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmAllocPrimitiveArray      # eax<- call(typeCh, length, flags)
654189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
654289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
654389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # alloc successful?
654489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown                # no, handle exception
654589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
654689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
654789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
654889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
654989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* at this point:
655089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     eax is pointer to tgt
655189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     rINST_FULL is length
655289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     ecx is FEDC or CCCC
655389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     TMP_SPILL is BA
655489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     rPC is valid, but spilled
655589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *  We now need to copy values from registers into the array
655689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
655789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
655889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
655989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    # set up src pointer
656089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rFP)     # esi
656189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)   # edi
656289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,%edi         # set up dst ptr
656389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    (rFP,%ecx,4),%esi # set up src ptr
656489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%ecx   # load count register
656589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
656689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    rep
656789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsd
656889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
656989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rFP)
657089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
657189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl  rINST_FULL,rINST_FULL
657289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je     4f
657389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(rPC)
65744c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    andl   $0x0f,rPC            # rPC<- 0000000A
65754c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    sall   $16,rPC              # rPC<- 000A0000
65764c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    orl    %ecx,rPC              # rpc<- 000AFEDC
657789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project3:
657889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   $0xf,%ecx
657989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl   rPC,%ecx           # ecx<- next reg to load
658089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
658189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl   $4,rPC
658289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal   4(%eax),%eax
658389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   %ecx,-4(%eax)
658489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sub    $1,rINST_FULL
658589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne    3b
658689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project4:
658789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
658889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
658989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
659089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
659189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
659289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
659389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
659489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
659589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
659689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Throw an exception indicating that we have not implemented this
659789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * mode of filled-new-array.
659889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
659989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl:
660089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrInternalError,%eax
660189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
660289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrFilledNewArrayNotImpl,%eax
660389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
660489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowException
660589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
660689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
660789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
660889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
660989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
661089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
661189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_more:
661289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
661389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
661489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
661589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
661689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                         # null?
661789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown            # yes, handle it
661889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
661989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project       # note: fall through to .LOP_FILLED_NEW_ARRAY_RANGE_continue
662089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
662189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
662289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * On entry:
662389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *    eax holds array class [r0]
662489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *    rINST_FULL holds AA or BB [r10]
662589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *    ecx is scratch
662689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *    rPC is valid, but has been spilled
662789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
662889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue:
662989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
663089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
663189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
663289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)                   # arg0<- typeCh
663389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpb    $'I',%cl                             # supported?
663489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_FILLED_NEW_ARRAY_RANGE_notimpl                  # no, not handled yet
663589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if      (!1)
663689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
663789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl    $4,rINST_FULL
663889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
663989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
664089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmAllocPrimitiveArray      # eax<- call(typeCh, length, flags)
664189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
664289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
664389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             # alloc successful?
664489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_exceptionThrown                # no, handle exception
664589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
664689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  4(rPC),%ecx                           # ecx<- FEDC or CCCC
664789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    offArrayObject_contents(%eax),%eax    # eax<- newArray->contents
664889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
664989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* at this point:
665089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     eax is pointer to tgt
665189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     rINST_FULL is length
665289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     ecx is FEDC or CCCC
665389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     TMP_SPILL is BA
665489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *     rPC is valid, but spilled
665589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *  We now need to copy values from registers into the array
665689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
665789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
665889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
665989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    # set up src pointer
666089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rFP)     # esi
666189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rIBASE)   # edi
666289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,%edi         # set up dst ptr
666389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    (rFP,%ecx,4),%esi # set up src ptr
666489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%ecx   # load count register
666589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
666689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    rep
666789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsd
666889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
666989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rFP)
667089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
667189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl  rINST_FULL,rINST_FULL
667289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je     4f
667389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(rPC)
66744c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    andl   $0x0f,rPC            # rPC<- 0000000A
66754c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    sall   $16,rPC              # rPC<- 000A0000
66764c1a2915e40eceeb68dbc323d28b8bf8763af83bThe Android Open Source Project    orl    %ecx,rPC              # rpc<- 000AFEDC
667789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project3:
667889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   $0xf,%ecx
667989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl   rPC,%ecx           # ecx<- next reg to load
668089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
668189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    shrl   $4,rPC
668289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal   4(%eax),%eax
668389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   %ecx,-4(%eax)
668489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sub    $1,rINST_FULL
668589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne    3b
668689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project4:
668789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
668889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
668989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
669089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
669189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
669289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
669389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
669489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
669589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
669689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Throw an exception indicating that we have not implemented this
669789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * mode of filled-new-array.
669889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
669989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
670089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrInternalError,%eax
670189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
670289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrFilledNewArrayNotImpl,%eax
670389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
670489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowException
670589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
670689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
670789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
670889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
670989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_CMPL_FLOAT */
671089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
671189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMPL_FLOAT_isNaN:
671289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $-1,%ecx
671389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_CMPL_FLOAT_finish
671489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
671589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_CMPG_FLOAT */
671689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
671789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMPG_FLOAT_isNaN:
671889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $1,%ecx
671989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_CMPG_FLOAT_finish
672089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
672189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */
672289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
672389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMPL_DOUBLE_isNaN:
672489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $-1,%ecx
672589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_CMPL_DOUBLE_finish
672689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
672789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */
672889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
672989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMPG_DOUBLE_isNaN:
673089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $1,%ecx
673189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_CMPG_DOUBLE_finish
673289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
673389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_CMP_LONG */
673489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
673589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMP_LONG_bigger:
673689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
673789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $1,%ecx
673889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_CMP_LONG_finish
673989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMP_LONG_smaller:
674089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
674189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $-1,%ecx
674289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_CMP_LONG_finish:
674389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,rINST_FULL)
674489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
674589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
674689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
674789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
674889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_AGET_WIDE */
674989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
675089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_AGET_WIDE_finish:
675189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,8),%eax
675289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%eax),%ecx
675389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      4(%eax),%eax
675489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
675589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
675689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
675789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
675889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
675989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
676089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
676189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_APUT_WIDE */
676289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
676389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_APUT_WIDE_finish:
676489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,8),%eax
676589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,0)
676689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)
676789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,4(%eax)
676889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
676989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,(%eax)
677089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
677189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
677289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
677389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
677489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_APUT_OBJECT */
677589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
677689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* On entry:
677789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax<- array object
677889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx<- index
677989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL<- vAA
678089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
678189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_APUT_OBJECT_continue:
678289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      offArrayObject_contents(%eax,%ecx,4),%ecx
678389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     rINST_FULL,rINST_FULL     # storing null reference?
678489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        .LOP_APUT_OBJECT_skip_check
678589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
678689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)
678789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offObject_clazz(%eax),%eax # eax<- arrayObj->clazz
678889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
678989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,OUT_ARG1(%esp)
679089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,OUT_ARG0(%esp)
679189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call      dvmCanPutArrayElement     # test object type vs. array type
679289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
679389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
679489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax
679589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errArrayStore
679689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
679789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_APUT_OBJECT_skip_check:
679889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      rINST_FULL,(%ecx)
679989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
680089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
680189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
680289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
680389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
680489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IGET */
680589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
680689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
680789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_resolve:
680889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
680989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
681089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
681189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
681289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
681389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
681489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
681589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
681689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
681789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
681889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
681989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_finish
682089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
682189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
682289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_finish:
682389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
682489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
682589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
682689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
682789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
682889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
682989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
683089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
683189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
683289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
683389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
683489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
683589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
683689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
683789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
683889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
683989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
684089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
684189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
684289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IGET_WIDE */
684389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
684489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
684589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_WIDE_resolve:
684689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
684789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
684889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
684989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
685089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
685189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
685289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
685389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
685489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
685589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
685689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
685789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_WIDE_finish
685889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
685989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
686089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_WIDE_finish:
686189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
686289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
686389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
686489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
686589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
686689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
686789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
686889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
686989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
687089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
687189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
687289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
687389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax),%ecx                          # ecx<- lsw
687489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    4(%eax),%eax                         # eax<- msw
687589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%ecx,rINST_FULL,0)
687689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,1)
687789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
687889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
687989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
688089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
688189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
688289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IGET_OBJECT */
688389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
688489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
688589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_OBJECT_resolve:
688689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
688789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
688889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
688989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
689089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
689189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
689289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
689389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
689489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
689589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
689689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
689789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_OBJECT_finish
689889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
689989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
690089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_OBJECT_finish:
690189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
690289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
690389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
690489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
690589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
690689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
690789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
690889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
690989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
691089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
691189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
691289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
691389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
691489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
691589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
691689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
691789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
691889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
691989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
692089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */
692189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
692289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
692389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_BOOLEAN_resolve:
692489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
692589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
692689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
692789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
692889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
692989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
693089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
693189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
693289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
693389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
693489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
693589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_BOOLEAN_finish
693689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
693789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
693889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_BOOLEAN_finish:
693989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
694089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
694189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
694289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
694389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
694489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
694589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
694689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
694789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
694889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
694989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
695089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
695189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
695289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
695389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
695489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
695589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
695689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
695789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
695889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IGET_BYTE */
695989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
696089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
696189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_BYTE_resolve:
696289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
696389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
696489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
696589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
696689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
696789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
696889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
696989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
697089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
697189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
697289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
697389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_BYTE_finish
697489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
697589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
697689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_BYTE_finish:
697789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
697889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
697989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
698089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
698189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
698289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
698389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
698489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
698589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
698689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
698789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
698889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movsbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
698989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
699089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
699189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
699289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
699389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
699489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
699589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
699689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IGET_CHAR */
699789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
699889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
699989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_CHAR_resolve:
700089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
700189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
700289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
700389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
700489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
700589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
700689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
700789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
700889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
700989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
701089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
701189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_CHAR_finish
701289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
701389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
701489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_CHAR_finish:
701589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
701689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
701789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
701889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
701989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
702089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
702189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
702289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
702389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
702489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
702589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
702689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
702789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
702889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
702989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
703089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
703189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
703289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
703389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
703489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IGET_SHORT */
703589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
703689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
703789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_SHORT_resolve:
703889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
703989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
704089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
704189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
704289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
704389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
704489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
704589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
704689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
704789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
704889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
704989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IGET_SHORT_finish
705089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
705189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
705289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IGET_SHORT_finish:
705389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
705489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
705589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
705689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
705789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
705889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
705989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
706089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
706189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
706289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
706389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
706489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movswl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
706589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,%eax                      # eax<- A
706689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
706789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%ecx,%eax)
706889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
706989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
707089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
707189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
707289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IPUT */
707389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
707489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
707589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_resolve:
707689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
707789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
707889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
707989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
708089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
708189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
708289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
708389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
708489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
708589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
708689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
708789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_finish
708889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
708989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
709089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_finish:
709189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
709289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
709389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
709489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
709589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
709689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
709789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
709889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
709989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
710089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
710189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
710289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
710389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
710489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
710589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
710689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
710789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
710889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IPUT_WIDE */
710989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
711089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
711189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_WIDE_resolve:
711289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
711389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
711489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
711589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
711689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
711789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
711889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
711989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
712089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
712189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
712289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
712389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_WIDE_finish
712489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
712589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
712689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_WIDE_finish:
712789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
712889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
712989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
713089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
713189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
713289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
713389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
713489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
713589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
713689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
713789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
713889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
713989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,0)             # ecx<- lsw
714089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)       # rINST_FULL<- msw
714189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,4(%eax)
714289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
714389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,(%eax)
714489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
714589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
714689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
714789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IPUT_OBJECT */
714889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
714989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
715089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_OBJECT_resolve:
715189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
715289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
715389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
715489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
715589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
715689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
715789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
715889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
715989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
716089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
716189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
716289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_OBJECT_finish
716389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
716489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
716589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_OBJECT_finish:
716689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
716789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
716889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
716989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
717089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
717189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
717289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
717389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
717489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
717589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
717689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
717789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
717889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
717989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
718089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
718189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
718289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
718389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */
718489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
718589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
718689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_BOOLEAN_resolve:
718789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
718889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
718989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
719089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
719189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
719289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
719389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
719489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
719589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
719689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
719789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
719889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_BOOLEAN_finish
719989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
720089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
720189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_BOOLEAN_finish:
720289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
720389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
720489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
720589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
720689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
720789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
720889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
720989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
721089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
721189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
721289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
721389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
721489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
721589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
721689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
721789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
721889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
721989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IPUT_BYTE */
722089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
722189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
722289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_BYTE_resolve:
722389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
722489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
722589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
722689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
722789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
722889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
722989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
723089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
723189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
723289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
723389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
723489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_BYTE_finish
723589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
723689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
723789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_BYTE_finish:
723889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
723989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
724089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
724189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
724289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
724389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
724489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
724589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
724689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
724789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
724889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
724989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
725089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
725189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
725289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
725389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
725489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
725589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IPUT_CHAR */
725689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
725789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
725889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_CHAR_resolve:
725989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
726089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
726189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
726289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
726389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
726489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
726589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
726689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
726789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
726889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
726989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
727089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_CHAR_finish
727189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
727289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
727389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_CHAR_finish:
727489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
727589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
727689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
727789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
727889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
727989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
728089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
728189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
728289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
728389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
728489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
728589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
728689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
728789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
728889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
728989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
729089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
729189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_IPUT_SHORT */
729289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
729389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
729489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_SHORT_resolve:
729589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
729689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
729789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
729889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
729989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
730089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%ecx)                               # save object pointer across call
730189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
730289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveInstField                   #  ... to dvmResolveInstField
730389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%ecx)
730489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
730589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                             #  ... which returns InstrField ptr
730689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_IPUT_SHORT_finish
730789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
730889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
730989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_IPUT_SHORT_finish:
731089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
731189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Currently:
731289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax holds resolved field
731389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx holds object
731489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rIBASE is scratch, but needs to be unspilled
731589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   rINST_FULL holds A
731689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
731789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
731889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
731989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
732089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %ecx,%ecx                            # object null?
732189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_errNullObject                 # object was null
732289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
732389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
732489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
732589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
732689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
732789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SGET */
732889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
732989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
733089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
733189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
733289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_resolve:
733389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
733489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
733589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
733689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
733789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
733889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
733989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
734089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
734189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
734289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
734389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
734489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SGET_finish                 # success, continue
734589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
734689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
734789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
734889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SGET_WIDE */
734989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
735089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
735189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
735289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
735389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_WIDE_resolve:
735489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
735589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
735689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
735789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
735889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
735989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
736089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
736189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
736289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
736389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
736489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
736589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SGET_WIDE_finish                 # success, continue
736689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
736789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
736889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
736989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SGET_OBJECT */
737089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
737189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
737289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
737389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
737489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_OBJECT_resolve:
737589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
737689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
737789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
737889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
737989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
738089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
738189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
738289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
738389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
738489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
738589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
738689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SGET_OBJECT_finish                 # success, continue
738789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
738889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
738989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
739089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */
739189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
739289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
739389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
739489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
739589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_BOOLEAN_resolve:
739689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
739789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
739889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
739989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
740089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
740189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
740289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
740389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
740489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
740589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
740689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
740789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SGET_BOOLEAN_finish                 # success, continue
740889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
740989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
741089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
741189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SGET_BYTE */
741289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
741389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
741489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
741589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
741689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_BYTE_resolve:
741789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
741889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
741989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
742089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
742189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
742289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
742389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
742489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
742589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
742689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
742789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
742889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SGET_BYTE_finish                 # success, continue
742989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
743089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
743189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
743289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SGET_CHAR */
743389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
743489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
743589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
743689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
743789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_CHAR_resolve:
743889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
743989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
744089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
744189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
744289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
744389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
744489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
744589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
744689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
744789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
744889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
744989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SGET_CHAR_finish                 # success, continue
745089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
745189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
745289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
745389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SGET_SHORT */
745489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
745589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
745689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
745789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
745889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SGET_SHORT_resolve:
745989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
746089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
746189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
746289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
746389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
746489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
746589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
746689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
746789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
746889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
746989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
747089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SGET_SHORT_finish                 # success, continue
747189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
747289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
747389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
747489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SPUT */
747589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
747689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
747789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
747889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
747989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_resolve:
748089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
748189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
748289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
748389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
748489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
748589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
748689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
748789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
748889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
748989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
749089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
749189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SPUT_finish                 # success, continue
749289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
749389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
749489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
749589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SPUT_WIDE */
749689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
749789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
749889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
749989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
750089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_WIDE_resolve:
750189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
750289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
750389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
750489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
750589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
750689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
750789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
750889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
750989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
751089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
751189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
751289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SPUT_WIDE_finish                 # success, continue
751389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
751489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
751589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
751689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SPUT_OBJECT */
751789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
751889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
751989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
752089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
752189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_OBJECT_resolve:
752289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
752389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
752489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
752589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
752689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
752789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
752889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
752989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
753089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
753189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
753289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
753389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SPUT_OBJECT_finish                 # success, continue
753489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
753589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
753689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
753789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */
753889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
753989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
754089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
754189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
754289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve:
754389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
754489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
754589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
754689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
754789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
754889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
754989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
755089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
755189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
755289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
755389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
755489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SPUT_BOOLEAN_finish                 # success, continue
755589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
755689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
755789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
755889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SPUT_BYTE */
755989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
756089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
756189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
756289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
756389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_BYTE_resolve:
756489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
756589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
756689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
756789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
756889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
756989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
757089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
757189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
757289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
757389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
757489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
757589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SPUT_BYTE_finish                 # success, continue
757689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
757789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
757889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
757989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SPUT_CHAR */
758089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
758189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
758289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
758389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
758489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_CHAR_resolve:
758589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
758689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
758789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
758889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
758989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
759089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
759189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
759289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
759389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
759489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
759589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
759689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SPUT_CHAR_finish                 # success, continue
759789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
759889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
759989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
760089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SPUT_SHORT */
760189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
760289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
760389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Go resolve the field
760489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
760589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SPUT_SHORT_resolve:
760689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
760789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   2(rPC),%eax                        # eax<- field ref BBBB
760889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offGlue_method(%ecx),%ecx          # ecx<- current method
760989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()                                 # could throw, need to export
761089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
761189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
761289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG1(%esp)
761389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)
761489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmResolveStaticField              # eax<- resolved StaticField ptr
761589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
761689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    %eax,%eax
761789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_SPUT_SHORT_finish                 # success, continue
761889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_exceptionThrown             # no, handle exception
761989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
762089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
762189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */
762289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
762389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
762489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_VIRTUAL_more:
762589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
762689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
762789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
762889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
762989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
763089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                   # got null?
763189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_continue        # no, continue
763289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_exceptionThrown      # yes, handle exception
763389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
763489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* At this point:
763589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax = resolved base method
763689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx = scratch
763789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
763889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue:
763989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
764089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if       (!0)
764189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
764289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
764389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
764489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
764589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                 # null this?
764689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # go if so
764789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
764889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
764989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
7650c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodNoRange
765189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
765289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
765389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_SUPER */
765489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
765589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
765689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * At this point:
765789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx = resolved base method [r0]
765889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  eax = method->clazz [r9]
765989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
766089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_SUPER_continue:
766189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
766289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
766389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
766489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae     .LOP_INVOKE_SUPER_nsm           # method not present in superclass
766589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
766689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
7667c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp     common_invokeMethodNoRange
7668c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
766989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
767089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* At this point:
767189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * ecx = null (needs to be resolved base method)
767289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * eax = method->clazz
767389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    */
767489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_SUPER_resolve:
767589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%eax)                     # method->clazz
767689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
767789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),%ecx                 # ecx<- BBBB
767889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
767989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
768089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
768189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
768289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
768389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # got null?
768489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved base method
768589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%eax)                   # restore method->clazz
768689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_INVOKE_SUPER_continue        # good to go - continue
768789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown      # handle exception
768889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
768989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
769089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
769189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx = resolved base method
769289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
769389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_SUPER_nsm:
769489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_name(%ecx),%eax
769589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    mov     %eax,OUT_ARG1(%esp)
769689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_errNoSuchMethod
769789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
769889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */
769989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
770089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
770189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * On entry:
770289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   TMP_SPILL  <- "this" register
770389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Things a bit ugly on this path, but it's the less
770489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * frequent one.  We'll have to do some reloading.
770589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
770689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_DIRECT_resolve:
770789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     SPILL_TMP(%ecx)
770889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     GET_GLUE(%ecx)
770989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     UNSPILL(rPC)
771089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
771189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
771289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
771389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     $METHOD_DIRECT,OUT_ARG2(%esp)
771489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     %eax,OUT_ARG1(%esp)
771589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     %ecx,OUT_ARG0(%esp)
771689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     call     dvmResolveMethod # eax<- call(clazz, ref, flags)
771789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     UNSPILL_TMP(%ecx)
771889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     testl    %eax,%eax
771989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     jne      .LOP_INVOKE_DIRECT_finish
772089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     UNSPILL(rPC)
772189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     jmp      common_exceptionThrown
772289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
772389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_STATIC */
772489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
772589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_STATIC_continue:
772689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $METHOD_STATIC,%eax
772789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
772889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
772989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call      dvmResolveMethod          # call(clazz,ref,flags)
773089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
773189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # got null?
7732c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodNoRange
773389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_exceptionThrown
773489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
773589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
773689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_INTERFACE */
773789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
773889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_INTERFACE_continue:
773989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
774089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
774189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl      %eax,%eax
774289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je         common_exceptionThrown
7743c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp        common_invokeMethodNoRange
774489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
774589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
774689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL_RANGE */
774789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
774889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
774989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_more:
775089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
775189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
775289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
775389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
775489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
775589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                   # got null?
775689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # no, continue
775789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_exceptionThrown      # yes, handle exception
775889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
775989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* At this point:
776089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   eax = resolved base method
776189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   ecx = scratch
776289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
776389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_continue:
776489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
776589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if       (!1)
776689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
776789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
776889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
776989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
777089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %ecx,%ecx                 # null this?
777189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je        common_errNullObject      # go if so
777289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offObject_clazz(%ecx),%ecx  # ecx<- thisPtr->clazz
777389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      offClassObject_vtable(%ecx),%ecx # ecx<- thisPtr->clazz->vtable
777489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      (%ecx,%eax,4),%eax        # eax<- vtable[methodIndex]
7775c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp       common_invokeMethodRange
777689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
777789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
777889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */
777989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
778089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
778189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * At this point:
778289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx = resolved base method [r0]
778389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  eax = method->clazz [r9]
778489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
778589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue:
778689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
778789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
778889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
778989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jae     .LOP_INVOKE_SUPER_RANGE_nsm           # method not present in superclass
779089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
779189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
7792c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp     common_invokeMethodRange
7793c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
779489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
779589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* At this point:
779689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * ecx = null (needs to be resolved base method)
779789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * eax = method->clazz
779889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    */
779989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve:
780089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL_TMP(%eax)                     # method->clazz
780189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
780289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  2(rPC),%ecx                 # ecx<- BBBB
780389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
780489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
780589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
780689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
780789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
780889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   %eax,%eax                   # got null?
780989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,%ecx                   # ecx<- resolved base method
781089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL_TMP(%eax)                   # restore method->clazz
781189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_INVOKE_SUPER_RANGE_continue        # good to go - continue
781289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown      # handle exception
781389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
781489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
781589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
781689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx = resolved base method
781789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
781889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm:
781989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_name(%ecx),%eax
782089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    mov     %eax,OUT_ARG1(%esp)
782189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_errNoSuchMethod
782289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
782389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */
782489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
782589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
782689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * On entry:
782789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *   TMP_SPILL  <- "this" register
782889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Things a bit ugly on this path, but it's the less
782989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * frequent one.  We'll have to do some reloading.
783089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
783189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve:
783289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     SPILL_TMP(%ecx)
783389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     GET_GLUE(%ecx)
783489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     UNSPILL(rPC)
783589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
783689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
783789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
783889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     $METHOD_DIRECT,OUT_ARG2(%esp)
783989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     %eax,OUT_ARG1(%esp)
784089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     movl     %ecx,OUT_ARG0(%esp)
784189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     call     dvmResolveMethod # eax<- call(clazz, ref, flags)
784289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     UNSPILL_TMP(%ecx)
784389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     testl    %eax,%eax
784489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     jne      .LOP_INVOKE_DIRECT_RANGE_finish
784589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     UNSPILL(rPC)
784689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     jmp      common_exceptionThrown
784789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
784889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_STATIC_RANGE */
784989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
785089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_STATIC_RANGE_continue:
785189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $METHOD_STATIC,%eax
785289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
785389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
785489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call      dvmResolveMethod          # call(clazz,ref,flags)
785589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
785689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl     %eax,%eax                 # got null?
7857c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne       common_invokeMethodRange
785889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       common_exceptionThrown
785989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
786089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
786189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_INVOKE_INTERFACE_RANGE */
786289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
786389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_INVOKE_INTERFACE_RANGE_continue:
786489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
786589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
786689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl      %eax,%eax
786789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je         common_exceptionThrown
7868c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp        common_invokeMethodRange
786989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
787089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
787189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_FLOAT_TO_INT */
787289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
787389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
787489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FLOAT_TO_INT_continue:
787589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
787689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%eax
787789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
787889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl      (rFP,%ecx,4),%eax
787989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
788089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
788189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
788289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_FLOAT_TO_INT_special_case # fix up result
788389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
788489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FLOAT_TO_INT_finish:
788589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
788689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
788789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
788889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FLOAT_TO_INT_special_case:
788989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstsw   %ax
789089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
789189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp       .LOP_FLOAT_TO_INT_isNaN
789289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
789389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
789489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
789589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
789689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   jmp       .LOP_FLOAT_TO_INT_finish
789789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FLOAT_TO_INT_isNaN:
789889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0,(rFP,%ecx,4)
789989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
790089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
790189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
790289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_FLOAT_TO_INT_finish
790389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
790489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */
790589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
790689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
790789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FLOAT_TO_LONG_continue:
790889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
790989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%eax
791089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
791189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl      (rFP,%ecx,4),%eax
791289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
791389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
791489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
791589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_FLOAT_TO_LONG_special_case # fix up result
791689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
791789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FLOAT_TO_LONG_finish:
791889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
791989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
792089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
792189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FLOAT_TO_LONG_special_case:
792289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstsw   %ax
792389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
792489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp       .LOP_FLOAT_TO_LONG_isNaN
792589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
792689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
792789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
792889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
792989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   jmp       .LOP_FLOAT_TO_LONG_finish
793089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_FLOAT_TO_LONG_isNaN:
793189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0,(rFP,%ecx,4)
793289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
793389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
793489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
793589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_FLOAT_TO_LONG_finish
793689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
793789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_DOUBLE_TO_INT */
793889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
793989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
794089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DOUBLE_TO_INT_continue:
794189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
794289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%eax
794389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
794489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl      (rFP,%ecx,4),%eax
794589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
794689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
794789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
794889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_DOUBLE_TO_INT_special_case # fix up result
794989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
795089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DOUBLE_TO_INT_finish:
795189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
795289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
795389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
795489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DOUBLE_TO_INT_special_case:
795589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstsw   %ax
795689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
795789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp       .LOP_DOUBLE_TO_INT_isNaN
795889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
795989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
796089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
796189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
796289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   jmp       .LOP_DOUBLE_TO_INT_finish
796389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DOUBLE_TO_INT_isNaN:
796489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0,(rFP,%ecx,4)
796589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 0
796689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
796789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
796889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_DOUBLE_TO_INT_finish
796989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
797089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */
797189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
797289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
797389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DOUBLE_TO_LONG_continue:
797489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
797589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%eax
797689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     4(rFP,%ecx,4),%eax
797789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl      (rFP,%ecx,4),%eax
797889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .else
797989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,(rFP,%ecx,4)
798089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
798189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je       .LOP_DOUBLE_TO_LONG_special_case # fix up result
798289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
798389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DOUBLE_TO_LONG_finish:
798489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
798589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
798689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
798789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DOUBLE_TO_LONG_special_case:
798889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    fnstsw   %ax
798989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sahf
799089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jp       .LOP_DOUBLE_TO_LONG_isNaN
799189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl     $-1,(rFP,%ecx,4)
799289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
799389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    adcl     $-1,4(rFP,%ecx,4)
799489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
799589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   jmp       .LOP_DOUBLE_TO_LONG_finish
799689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DOUBLE_TO_LONG_isNaN:
799789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0,(rFP,%ecx,4)
799889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .if 1
799989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0,4(rFP,%ecx,4)
800089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .endif
800189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       .LOP_DOUBLE_TO_LONG_finish
800289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
800389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_DIV_INT */
800489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_INT_continue_div:
800589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd
800689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    idivl   %ecx
800789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_INT_finish_div:
800889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecl<- AA
800989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,%ecx)
801089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
801189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
801289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
801389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
801489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
801589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_REM_INT */
801689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_INT_continue_div:
801789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd
801889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    idivl   %ecx
801989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_INT_finish_div:
802089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx         # ecl<- AA
802189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%edx,%ecx)
802289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
802389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
802489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
802589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
802689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
802789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_MUL_LONG */
802889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
802989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_MUL_LONG_continue:
803089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
803189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl    rINST_HI,%ecx       # ecx<- A
803289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %edx,4(rFP,%ecx,4)  # v[B+1]<- %edx
803389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)                  # restore rPC/%edx
803489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
803589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
803689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,(rFP,%ecx,4)   # v[B]<- %eax
803789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
803889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
803989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
804089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
804189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_DIV_LONG */
804289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
804389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_continue:
804489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     __divdi3
804589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_finish:
804689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx
804789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
804889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
804989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
805089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
805189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
805289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
805389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
805489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_check_zero:
805589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rPC,rPC
805689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_DIV_LONG_notSpecial
805789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
805889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_errDivideByZero
805989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_check_neg1:
806089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rPC,%eax
806189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_DIV_LONG_notSpecial
806289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
806389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
806489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rPC,rPC
806589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_LONG_notSpecial1
806689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%ecx
806789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_LONG_notSpecial1
806889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
806989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     %eax,%eax
807089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%edx
807189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DIV_LONG_finish
807289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
807389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
807489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
807589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
807689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_REM_LONG */
807789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
807889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_continue:
807989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     __moddi3
808089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_finish:
808189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,%ecx
808289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
808389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
808489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
808589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
808689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
808789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
808889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
808989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_check_zero:
809089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rPC,rPC
809189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_REM_LONG_notSpecial
809289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
809389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_errDivideByZero
809489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_check_neg1:
809589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rPC,%eax
809689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_REM_LONG_notSpecial
809789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,%ecx,0)
809889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,%ecx,1)
809989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rPC,rPC
810089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_LONG_notSpecial1
810189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%ecx
810289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_LONG_notSpecial1
810389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
810489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     %eax,%eax
810589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0,%edx
810689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_REM_LONG_finish
810789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
810889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
810989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
811089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
811189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SHL_LONG */
811289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
811389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SHL_LONG_finish:
811489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- %eax
811589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
811689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
811789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
811889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SHR_LONG */
811989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
812089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
812189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SHR_LONG_finish:
812289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- eax
812389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
812489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
812589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
812689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_USHR_LONG */
812789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
812889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
812989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_USHR_LONG_finish:
813089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)        # v[BB+0]<- eax
813189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
813289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
813389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
813489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
813589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_DIV_INT_2ADDR */
813689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_INT_2ADDR_continue_div2addr:
813789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd
813889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    idivl   %ecx
813989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_INT_2ADDR_finish_div2addr:
814089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
814189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
814289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
814389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
814489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
814589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
814689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_REM_INT_2ADDR */
814789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_INT_2ADDR_continue_div2addr:
814889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd
814989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    idivl   %ecx
815089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_INT_2ADDR_finish_div2addr:
815189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
815289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
815389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
815489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
815589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
815689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
815789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_MUL_LONG_2ADDR */
815889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
815989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_MUL_LONG_2ADDR_continue:
816089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
816189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %edx,4(rIBASE)      # v[A+1]<- %edx
816289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)                  # restore rPC/%edx
816389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
816489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %eax,(rIBASE)       # v[A]<- %eax
816589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rFP)
816689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rIBASE)
816789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
816889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
816989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
817089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
817189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_DIV_LONG_2ADDR */
817289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
817389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_2ADDR_continue:
817489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
817589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
817689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
817789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     __divdi3
817889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_2ADDR_finish:
817989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%ecx
818089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
818189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
818289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
818389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
818489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
818589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
818689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
818789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_2ADDR_check_zero:
818889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rPC,rPC
818989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_DIV_LONG_2ADDR_notSpecial
819089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
819189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_errDivideByZero
819289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_LONG_2ADDR_check_neg1:
819389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rPC,%eax
819489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_DIV_LONG_2ADDR_notSpecial
819589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
819689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
819789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rPC,rPC
819889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_LONG_2ADDR_notSpecial1
819989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%ecx
820089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_DIV_LONG_2ADDR_notSpecial1
820189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
820289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     %eax,%eax
820389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0x80000000,%edx
820489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_DIV_LONG_2ADDR_finish
820589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
820689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
820789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_REM_LONG_2ADDR */
820889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
820989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_2ADDR_continue:
821089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG3(%esp)
821189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rPC,OUT_ARG0(%esp)
821289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)
821389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     __moddi3
821489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_2ADDR_finish:
821589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,%ecx
821689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(rPC,%ecx,1)
821789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
821889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,%ecx,0)
821989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
822089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
822189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
822289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
822389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_2ADDR_check_zero:
822489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rPC,rPC
822589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_REM_LONG_2ADDR_notSpecial
822689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
822789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_errDivideByZero
822889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_LONG_2ADDR_check_neg1:
822989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl   rPC,%eax
823089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .LOP_REM_LONG_2ADDR_notSpecial
823189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(rPC,rINST_FULL,0)
823289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG_WORD(%ecx,rINST_FULL,1)
823389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl    rPC,rPC
823489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_LONG_2ADDR_notSpecial1
823589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl     $0x80000000,%ecx
823689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne      .LOP_REM_LONG_2ADDR_notSpecial1
823789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* minint / -1, return minint on div, 0 on rem */
823889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl     %eax,%eax
823989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     $0,%edx
824089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      .LOP_REM_LONG_2ADDR_finish
824189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
824289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
824389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */
824489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
824589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
824689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish:
824789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
824889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
824989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
825089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
825189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
825289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */
825389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
825489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
825589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish:
825689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
825789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
825889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
825989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
826089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
826189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */
826289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
826389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
826489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish:
826589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[AA+0]<- eax
826689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(1)
826789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(1)
826889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
826989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
827089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_DIV_INT_LIT16 */
827189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_INT_LIT16_continue_div:
827289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd
827389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    idivl   %ecx
827489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_INT_LIT16_finish_div:
827589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
827689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
827789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
827889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
827989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
828089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
828189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_REM_INT_LIT16 */
828289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_INT_LIT16_continue_div:
828389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd
828489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    idivl   %ecx
828589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_INT_LIT16_finish_div:
828689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
828789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
828889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
828989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
829089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
829189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
829289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_DIV_INT_LIT8 */
829389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_INT_LIT8_continue_div:
829489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd
829589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    idivl   %ecx
829689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_DIV_INT_LIT8_finish_div:
829789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%eax,rINST_FULL)
829889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
829989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
830089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
830189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
830289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
830389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_REM_INT_LIT8 */
830489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_INT_LIT8_continue_div:
830589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cltd
830689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    idivl   %ecx
830789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_REM_INT_LIT8_finish_div:
830889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SET_VREG(%edx,rINST_FULL)
830989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
831089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(2)
831189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(2)
831289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
831389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
831489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */
831589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
831689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LOP_EXECUTE_INLINE_continue:
831789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*
831889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * Extract args, call function.
831989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  ecx = #of args (0-4)
832089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  eax = call index
832189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  @esp = return addr
832289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  esp is -4 from normal
832389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *
832489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  Go ahead and load all 4 args, even if not used.
832589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
832689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl    4(rPC),rPC
832789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
832889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0xf,%ecx
832989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      rPC,%ecx
833089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
833189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,rPC
833289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,4+OUT_ARG0(%esp)
833389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
833489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0xf,%ecx
833589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      rPC,%ecx
833689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
833789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,rPC
833889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,4+OUT_ARG1(%esp)
833989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
834089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0xf,%ecx
834189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      rPC,%ecx
834289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
834389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,rPC
834489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,4+OUT_ARG2(%esp)
834589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
834689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      $0xf,%ecx
834789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    andl      rPC,%ecx
834889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_VREG(%ecx,%ecx)
834989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sarl      $4,rPC
835089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl      %ecx,4+OUT_ARG3(%esp)
835189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
835289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    sall      $4,%eax      # index *= sizeof(table entry)
835389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp       *gDvmInlineOpsTable(%eax)
835489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    # will return to caller of .LOP_EXECUTE_INLINE_continue
835589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
835689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
835789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
835889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .global dvmAsmSisterEnd
835989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectdvmAsmSisterEnd:
836089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
836189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/entry.S */
836289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
836389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
836489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
836589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
836689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * you may not use this file except in compliance with the License.
836789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * You may obtain a copy of the License at
836889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
836989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
837089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
837189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
837289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
837389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
837489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * See the License for the specific language governing permissions and
837589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * limitations under the License.
837689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
837789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
837889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
837989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .text
838089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .global dvmMterpStdRun
838189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .type   dvmMterpStdRun, %function
838289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
838389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * bool dvmMterpStdRun(MterpGlue* glue)
838489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
838589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Interpreter entry point.  Returns changeInterp.
838689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
838789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
838889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectdvmMterpStdRun:
838989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    push    %ebp
839089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %esp,%ebp
839189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    push    %edi
839289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    push    %esi
839389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    push    %ebx
839489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
839589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* at this point, stack is misaligned by 1 word
839689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   We're allocating spill space for 6 words, plus
839789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   outgoing argument (5 words) and local variables
839889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   (4 words) - 15 words or 60 bytes total. See
839989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   diagram in header.S
840089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project*/
840189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    subl   $60,%esp
840289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
840389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* Set up "named" registers */
840489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    IN_ARG0(%ebp),%ecx
840589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,rGLUE_SPILL(%ebp)
840689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    LOAD_PC_FROM_GLUE(%ecx)
840789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    LOAD_FP_FROM_GLUE(%ecx)
840889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $dvmAsmInstructionStart,rIBASE
840989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
841089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* Remember %esp for future "longjmp" */
841189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %esp,offGlue_bailPtr(%ecx)
841289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
841389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* How to start? */
841489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb    offGlue_entryPoint(%ecx),%al
841589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
841689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* Normal start? */
841789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpb    $kInterpEntryInstr,%al
841889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     .Lnot_instr
841989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
842089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project   /* Normal case: start executing the instruction at rPC */
842189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST()
842289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
842389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
842489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.Lnot_instr:
842589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Reset to normal case */
842689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb   $kInterpEntryInstr,offGlue_entryPoint(%ecx)
842789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpb   $kInterpEntryReturn,%al
842889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je     common_returnFromMethod
842989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpb   $kInterpEntryThrow,%al
843089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je     common_exceptionThrown
843189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzx  %al,%eax
843289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   %eax,OUT_ARG1(%esp)
843389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   $.LstrBadEntryPoint,OUT_ARG0(%esp)
843489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call   printf
843589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call   dvmAbort
843689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Not reached */
843789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
843889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
843989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .global dvmMterpStdBail
844089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .type   dvmMterpStdBail, %function
844189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
844289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * void dvmMterpStdBail(MterpGlue* glue, bool changeInterp)
844389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
844489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
844589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
844689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
844789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
844889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * We're not going to build a standard frame here, so the arg accesses will
844989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * look a little strange.
845089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
845189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * On entry:
845289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *  esp+4 (arg0)  MterpGlue* glue
845389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *  esp+8 (arg1)  bool changeInterp
845489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
845589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source ProjectdvmMterpStdBail:
845689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    4(%esp),%ecx                 # grab glue
845789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    8(%esp),%eax                 # changeInterp to return reg
845889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_bailPtr(%ecx),%esp   # Stack back to normal
845989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    addl    $60,%esp                    # Strip dvmMterpStdRun's frame
846089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    pop     %ebx
846189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    pop     %esi
846289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    pop     %edi
846389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    pop     %ebp
846489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ret                                  # return to dvmMterpStdRun's caller
846589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
846689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
846789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
846889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Strings
846989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
847089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .section    .rodata
847189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrBadEntryPoint:
847289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "Bad entry point %d\n"
847389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
847489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/* File: x86/footer.S */
847589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
847689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
847789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
847889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
847989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * you may not use this file except in compliance with the License.
848089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * You may obtain a copy of the License at
848189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
848289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
848389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
848489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
848589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
848689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
848789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * See the License for the specific language governing permissions and
848889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * limitations under the License.
848989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
849089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
849189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Common subroutines and data.
849289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
849389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
849489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
849589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Common code when a backwards branch is taken
849689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
849789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * On entry:
849889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *   ebx (a.k.a. rINST_FULL) -> PC adjustment in 16-bit words
849989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
850089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_backwardBranch:
850189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
8502c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    call   common_periodicChecks  # Note: expects rPC to be preserved
850389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC_INDEXED(rINST_FULL)
850489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST()
850589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
850689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
8507c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8508c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8509c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch/*
8510c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch * Common code for method invocation with range.
8511c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *
8512c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch * On entry:
8513c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *   eax = Method* methodToCall
8514c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch *   rINST trashed, must reload
8515c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch */
8516c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8517c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birchcommon_invokeMethodRange:
8518c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNewRange:
8519c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8520c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8521c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * prepare to copy args to "outs" area of current frame
8522c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8523c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8524c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- AA
8525c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      4(rPC), %ecx            # %ecx<- CCCC
8526c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SPILL(rPC)
8527c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
8528c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    test        rINST_FULL, rINST_FULL
8529c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- AA
8530c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jz          .LinvokeArgsDone        # no args; jump to args done
8531c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8532c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8533c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8534c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, %ecx=CCCC, LOCAL0_OFFSET(%ebp)=count, %edx=&outs (&stackSaveArea)
8535c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * (very few methods have > 10 args; could unroll for common cases)
8536c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8537c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8538c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ebx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- save %ebx
8539c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         (rFP, %ecx, 4), %ecx    # %ecx<- &vCCCC
8540c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shll        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
8541c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        LOCAL0_OFFSET(%ebp), %edx       # %edx<- update &outs
8542c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shrl        $2, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- offset
8543c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch1:
8544c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (%ecx), %ebx            # %ebx<- vCCCC
8545c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%ecx), %ecx           # %ecx<- &vCCCC++
8546c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        $1, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET<- LOCAL0_OFFSET--
8547c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ebx, (%edx)            # *outs<- vCCCC
8548c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%edx), %edx           # outs++
8549c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         1b                      # loop if count (LOCAL0_OFFSET(%ebp)) not zero
8550c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ebx       # %ebx<- restore %ebx
8551c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp         .LinvokeArgsDone        # continue
8552c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8553c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8554c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax is "Method* methodToCall", the method we're trying to call
8555c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * prepare to copy args to "outs" area of current frame
8556c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8557c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8558c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birchcommon_invokeMethodNoRange:
8559c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNewNoRange:
8560c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- BA
8561c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SPILL(rPC)
8562c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BA
8563c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shrl        $4, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- B
8564c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          .LinvokeArgsDone        # no args; jump to args done
8565c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      4(rPC), %ecx            # %ecx<- GFED
8566c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
8567c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8568c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8569c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, %ecx=GFED, LOCAL0_OFFSET(%ebp)=count, %edx=outs
8570c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8571c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8572c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNonRange:
8573c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $2, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 2
8574c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- GFED
8575c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          1f                      # handle 1 arg
8576c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          2f                      # handle 2 args
8577c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $4, LOCAL0_OFFSET(%ebp)        # compare LOCAL0_OFFSET(%ebp) to 4
8578c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          3f                      # handle 3 args
8579c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    je          4f                      # handle 4 args
8580c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch5:
8581c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    andl        $15, rINST_FULL        # rINST<- A
8582c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8583c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, rINST_FULL, 4), %ecx # %ecx<- vA
8584c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vA
8585c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8586c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch4:
8587c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $12, %ecx              # %ecx<- G
8588c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8589c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vG
8590c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vG
8591c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8592c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch3:
8593c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x0f00, %ecx          # %ecx<- 0F00
8594c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $8, %ecx               # %ecx<- F
8595c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8596c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vF
8597c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vF
8598c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8599c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch2:
8600c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x00f0, %ecx          # %ecx<- 00E0
8601c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shr         $4, %ecx               # %ecx<- E
8602c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
8603c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vE
8604c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, (%edx)            # *outs<- vE
8605c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
8606c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch1:
8607c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    and         $0x000f, %ecx          # %ecx<- 000D
8608c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        (rFP, %ecx, 4), %ecx    # %ecx<- vD
8609c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, -4(%edx)          # *--outs<- vD
8610c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch0:
8611c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8612c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8613c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax is "Method* methodToCall", the method we're trying to call
8614c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * find space for the new stack frame, check for overflow
8615c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8616c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8617c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeArgsDone:
8618c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      offMethod_registersSize(%eax), %edx # %edx<- methodToCall->regsSize
8619c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movzwl      offMethod_outsSize(%eax), %ecx # %ecx<- methodToCall->outsSize
8620c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, LOCAL0_OFFSET(%ebp)       # LOCAL0_OFFSET<- methodToCall
8621c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shl         $2, %edx               # %edx<- update offset
8622c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%eax,rFP)          # %eax<- &StackSaveArea
8623c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        %edx, %eax              # %eax<- newFP; (old savearea - regsSize)
8624c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%edx)                      # %edx<- pMterpGlue
8625c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- &outs
8626c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    subl        $sizeofStackSaveArea, %eax # %eax<- newSaveArea (stack save area using newFP)
8627c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_interpStackEnd(%edx), %edx # %edx<- glue->interpStackEnd
8628c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, LOCAL2_OFFSET(%ebp)       # LOCAL2_OFFSET<- glue->interpStackEnd
8629c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    shl         $2, %ecx               # %ecx<- update offset for outsSize
8630c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, %edx              # %edx<- newSaveArea
8631c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    sub         %ecx, %eax              # %eax<- bottom; (newSaveArea - outsSize)
8632c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         LOCAL2_OFFSET(%ebp), %eax       # compare interpStackEnd and bottom
8633c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL0_OFFSET(%ebp), %eax       # %eax<- restore methodToCall
8634c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jl          .LstackOverflow         # handle frame overflow
8635c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8636c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8637c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * set up newSaveArea
8638c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8639c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8640c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch#ifdef EASY_GDB
8641c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    SAVEAREA_FROM_FP(%ecx,rFP)          # %ecx<- &StackSaveArea
8642c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, offStackSaveArea_prevSave(%edx) # newSaveArea->prevSave<- &outs
8643c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch#endif
8644c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offStackSaveArea_prevFrame(%edx) # newSaveArea->prevFrame<- rFP
8645c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rPC_SPILL(%ebp), %ecx
8646c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, offStackSaveArea_savedPc(%edx) # newSaveArea->savedPc<- rPC
8647c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    testl       $ACC_NATIVE, offMethod_accessFlags(%eax) # check for native call
8648c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, offStackSaveArea_method(%edx) # newSaveArea->method<- method to call
8649c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         .LinvokeNative          # handle native call
8650c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8651c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8652c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * Update "glue" values for the new method
8653c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFp
8654c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8655c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8656c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offMethod_clazz(%eax), %edx # %edx<- method->clazz
8657c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
8658c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex
8659c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, offGlue_method(%ecx) # glue->method<- methodToCall
8660c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, offGlue_methodClassDex(%ecx) # glue->methodClassDex<- method->clazz->pDvmDex
8661c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offMethod_insns(%eax), rPC # rPC<- methodToCall->insns
8662c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%ecx), %eax # %eax<- glue->self
8663c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
8664c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- newFP
8665c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    FETCH_INST()
8666c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GOTO_NEXT                           # jump to methodToCall->insns
8667c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8668c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch   /*
8669c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * Prep for the native call
8670c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    * %eax=methodToCall, LOCAL1_OFFSET(%ebp)=newFP, %edx=newSaveArea
8671c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    */
8672c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8673c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LinvokeNative:
8674c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
8675c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
8676c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%ecx), %ecx        # %ecx<- glue->self
8677c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offThread_jniLocal_nextEntry(%ecx), %eax # %eax<- glue->self->thread->refNext
8678c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, offStackSaveArea_localRefTop(%edx) # newSaveArea->localRefTop<- refNext
8679c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, OUT_ARG4(%esp)    # save newSaveArea
8680c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        LOCAL1_OFFSET(%ebp), %edx # %edx<- newFP
8681c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, offThread_curFrame(%ecx)  # glue->self->curFrame<- newFP
8682c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG3(%esp)    # save glue->self
8683c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG2(%esp)    # push parameter glue->self
8684c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
8685c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG1(%esp), %eax    # %eax<- methodToCall
8686c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         offGlue_retval(%ecx), %ecx # %ecx<- &retval
8687c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %ecx, OUT_ARG0(%esp)    # push parameter pMterpGlue
8688c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    push        %edx                    # push parameter newFP
8689c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8690c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    call        *offMethod_nativeFunc(%eax) # call methodToCall->nativeFunc
8691c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    lea         4(%esp), %esp
8692c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG4(%esp), %ecx    # %ecx<- newSaveArea
8693c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        OUT_ARG3(%esp), %eax    # %eax<- glue->self
8694c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offStackSaveArea_localRefTop(%ecx), %edx # %edx<- newSaveArea->localRefTop
8695c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    cmp         $0, offThread_exception(%eax) # check for exception
8696c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- rFP
8697c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %edx, offThread_jniLocal_nextEntry(%eax) # glue->self<- newSaveArea->localRefTop
8698c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    UNSPILL(rPC)
8699c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jne         common_exceptionThrown  # handle exception
8700c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    FETCH_INST_WORD(3)
8701c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    ADVANCE_PC(3)
8702c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GOTO_NEXT                           # jump to next instruction
8703c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8704c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch.LstackOverflow:
8705c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    GET_GLUE(%eax)                      # %eax<- pMterpGlue
8706c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        offGlue_self(%eax), %eax # %eax<- glue->self
8707c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    movl        %eax, OUT_ARG0(%esp)    # push parameter self
8708c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    call        dvmHandleStackOverflow  # call: (Thread* self)
8709c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    UNSPILL(rPC)                        # return: void
8710c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch    jmp         common_exceptionThrown  # handle exception
8711c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
8712c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch
871389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
871489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Common invoke code (old-style).
871589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * TUNING:  Rewrite along lines of new armv5 code?
871689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
871789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * On entry:
871889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *   eax = Method* methodToCall
871989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *   ecx = bool methodCallRange
872089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *   rINST trashed, must reload
872189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
872289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_invokeOld:
872389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG1(%esp)     # arg1<- methodCallRange
872489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
872589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl  (rPC),rINST_FULL         # recover rINST
872689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG2(%esp)     # arg2<- method
872789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzwl   4(rPC),%eax             # eax<- GFED or CCCC
872889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
872989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
873089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl   rINST_HI,rINST_FULL
873189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     rINST_FULL,OUT_ARG3(%esp)# arg3<- AA
873289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %ecx,OUT_ARG0(%esp)     # arg0<- GLUE
873389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl     %eax,OUT_ARG4(%esp)     # arg4<- GFED/CCCC
873489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     dvmMterp_invokeMethod
873589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp      common_resumeAfterGlueCall
873689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
873789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
873889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
873989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Do we need the thread to be suspended or have debugger/profiling activity?
874089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
874189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * On entry:
874289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *   ebx  -> PC adjustment in 16-bit words (must be preserved)
874389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *   ecx  -> GLUE pointer
874489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
874589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Note: A call will normally kill %eax, rPC/%edx and %ecx.  To
874689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *       streamline the normal case, this routine will preserve rPC and
874789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *       %ecx in addition to the normal caller save regs.  The save/restore
874889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *       is a bit ugly, but will happen in the relatively uncommon path.
874989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * TUNING: Might be worthwhile to inline this.
875089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * TODO: Basic-block style Jit will need a hook here as well.  Fold it into
875189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *       the suspendCount check so we can get both in 1 shot.
875289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
875389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_periodicChecks:
875489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_pSelfSuspendCount(%ecx),%eax    # eax <- &suspendCount
875589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl    $0,(%eax)
875689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne     1f
875789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
875889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
875989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#if defined(WITH_DEBUGGER)
876089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   offGlue_pDebuggerActive(%ecx),%eax      # eax <- &DebuggerActive
876189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#endif
876289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#if defined(WITH_PROFILER)
876389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   offGlue_pActiveProfilers(%ecx),%ecx     # ecx <- &ActiveProfilers
876489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#endif
876589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#if defined(WITH_DEBUGGER) && defined(WITH_PROFILER)
876689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
876789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    orl    (%ecx),%eax             # eax <- debuggerActive || activeProfilers
876889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#elif defined(WITH_DEBUGGER)
876989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movzbl (%eax),%eax             # eax <- debuggerActive (boolean)
877089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#elif defined(WITH_PROFILER)
877189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   (%ecx),%eax             # eax <= activeProfilers
877289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#endif
877389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)                 # restore rGLUE
877489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    testl  %eax,%eax
877589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jne    3f                      # one or both active - switch interp
877689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project#endif
877789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
877889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ret
877989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
878089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Check for suspend */
878189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project1:
878289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /*  At this point, the return pointer to the caller of
878389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  common_periodicChecks is on the top of stack.  We need to preserve
878489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  rPC(edx) and GLUE(ecx).  We'll spill rPC, and reload GLUE.
878589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  The outgoing profile is:
878689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *      bool dvmCheckSuspendPending(Thread* self)
878789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     *  Because we reached here via a call, go ahead and build a new frame.
878889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
878989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_self(%ecx),%eax      # eax<- glue->self
879089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)                      # save edx
879189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    push    %ebp
879289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %esp,%ebp
879389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    subl    $24,%esp
879489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
879589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmCheckSuspendPending
879689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    addl    $24,%esp
879789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    pop     %ebp
879889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
879989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
880089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ret
880189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
880289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Switch interpreters */
880389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Note: %ebx contains the 16-bit word offset to be applied to rPC to
880489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * "complete" the interpretation of backwards branches.  In effect, we
880589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * are completing the interpretation of the branch instruction here,
880689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * and the new interpreter will resume interpretation at the branch
880789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * target. However, a switch request recognized during the handling
880889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * of a return from method instruction results in an immediate abort,
880989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * and the new interpreter will resume by re-interpreting the return
881089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     * instruction.
881189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     */
881289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project3:
881389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    leal    (rPC,%ebx,2),rPC       # adjust pc to show target
881489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)                 # bail expect GLUE already loaded
881589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $1,rINST_FULL         # set changeInterp to true
881689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_gotoBail
881789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
881889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
881989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
882089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Common code for handling a return instruction
882189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
882289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_returnFromMethod:
882389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
882489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* Set entry mode in case we bail */
882589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb    $kInterpEntryReturn,offGlue_entryPoint(%ecx)
882689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl    rINST_FULL,rINST_FULL   # zero offset in case we switch interps
882789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    common_periodicChecks   # Note: expects %ecx to be preserved
882889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
882989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SAVEAREA_FROM_FP(%eax,rFP)                    # eax<- saveArea (old)
883089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offStackSaveArea_prevFrame(%eax),rFP  # rFP<- prevFrame
883189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST_FULL
883289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    cmpl    $0,rINST_FULL                        # break?
883389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    je      common_gotoBail    # break frame, bail out completely
883489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
883589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offStackSaveArea_savedPc(%eax),rPC    # pc<- saveArea->savedPC
883689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offGlue_self(%ecx),%eax               # eax<- self
883789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rINST_FULL,offGlue_method(%ecx)  # glue->method = newSave->meethod
883889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    rFP,offThread_curFrame(%eax)     # self->curFrame = fp
883989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offMethod_clazz(rINST_FULL),%eax # eax<- method->clazz
884089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    FETCH_INST_WORD(3)
884189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    offClassObject_pDvmDex(%eax),%eax # eax<- method->clazz->pDvmDex
884289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    ADVANCE_PC(3)
884389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,offGlue_methodClassDex(%ecx)
884489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    /* not bailing - restore entry mode to default */
884589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movb    $kInterpEntryInstr,offGlue_entryPoint(%ecx)
884689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GOTO_NEXT
884789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
884889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
884989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Prepare to strip the current frame and "longjump" back to caller of
885089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * dvmMterpStdRun.
885189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
885289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * on entry:
885389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *    rINST_FULL holds changeInterp
885489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *    ecx holds glue pointer
885589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
885689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * expected profile: dvmMterpStdBail(MterpGlue *glue, bool changeInterp)
885789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
885889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_gotoBail:
885989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)                # export state to glue
886089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
886189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   %ecx,OUT_ARG0(%esp)           # glue in arg0
886289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl   rINST_FULL,OUT_ARG1(%esp)     # changeInterp in arg1
886389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmMterpStdBail              # bail out....
886489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
886589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
886689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
886789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * After returning from a "glued" function, pull out the updated values
886889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * and start executing at the next instruction.
886989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
887089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project common_resumeAfterGlueCall:
887189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     GET_GLUE(%ecx)
887289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     LOAD_PC_FROM_GLUE(%ecx)
887389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     LOAD_FP_FROM_GLUE(%ecx)
887489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     FETCH_INST()
887589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project     GOTO_NEXT
887689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
887789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
887889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Integer divide or mod by zero
887989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
888089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_errDivideByZero:
888189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
888289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrArithmeticException,%eax
888389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
888489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrDivideByZero,%eax
888589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
888689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
888789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowException
888889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
888989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
889089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
889189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
889289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Attempt to allocate an array with a negative size.
889389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
889489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_errNegativeArraySize:
889589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
889689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrNegativeArraySizeException,%eax
889789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
889889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl    %eax,%eax
889989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
890089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
890189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowException
890289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
890389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
890489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
890589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
890689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Attempt to allocate an array with a negative size.
890789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
890889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_errNoSuchMethod:
890989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
891089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
891189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrNoSuchMethodError,%eax
891289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
891389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl    %eax,%eax
891489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
891589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
891689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowException
891789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
891889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
891989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
892089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
892189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Hit a null object when we weren't expecting one.  Export the PC, throw a
892289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * NullPointerException and goto the exception processing code.
892389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
892489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_errNullObject:
892589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
892689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrNullPointerException,%eax
892789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
892889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl    %eax,%eax
892989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
893089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
893189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowException
893289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
893389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
893489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
893589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
893689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Array index exceeds max.
893789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
893889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_errArrayIndex:
893989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
894089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrArrayIndexException,%eax
894189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
894289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl    %eax,%eax
894389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
894489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
894589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowException
894689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
894789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
894889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
894989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Invalid array value.
895089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
895189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_errArrayStore:
895289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    EXPORT_PC()
895389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $.LstrArrayStoreException,%eax
895489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG0(%esp)
895589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    xorl    %eax,%eax
895689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %eax,OUT_ARG1(%esp)
895789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SPILL(rPC)
895889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmThrowException
895989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    UNSPILL(rPC)
896089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_exceptionThrown
896189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
896289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
896389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Somebody has thrown an exception.  Handle it.
896489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
896589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * If the exception processing code returns to us (instead of falling
896689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
896789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * now happens to be.
896889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project *
896989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * This does not return.
897089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
897189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_exceptionThrown:
897289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    GET_GLUE(%ecx)
897389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SAVE_PC_TO_GLUE(%ecx)
897489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    SAVE_FP_TO_GLUE(%ecx)
897589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    %ecx,OUT_ARG0(%esp)
897689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call    dvmMterp_exceptionThrown
897789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    jmp     common_resumeAfterGlueCall
897889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
897989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Projectcommon_abort:
898089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    movl    $0xdeadf00d,%eax
898189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    call     *%eax
898289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
898389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
898489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project/*
898589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Strings
898689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */
898789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
898889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .section     .rodata
898989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrNullPointerException:
899089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz    "Ljava/lang/NullPointerException;"
899189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrArithmeticException:
899289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "Ljava/lang/ArithmeticException;"
899389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrDivideByZero:
899489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "divide by zero"
899589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrArrayIndexException:
899689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
899789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrArrayStoreException:
899889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "Ljava/lang/ArrayStoreException;"
899989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrNegativeArraySizeException:
900089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "Ljava/lang/NegativeArraySizeException;"
900189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrInstantiationError:
900289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "Ljava/lang/InstantiationError;"
900389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrClassCastException:
900489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "Ljava/lang/ClassCastException;"
900589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrNoSuchMethodError:
900689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "Ljava/lang/NoSuchMethodError;"
900789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrInternalError:
900889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "Ljava/lang/InternalError;"
900989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.LstrFilledNewArrayNotImpl:
901089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project    .asciz  "filled-new-array only implemented for 'int'"
901189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
901289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project
9013