122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* Copyright (C) 2008 The Android Open Source Project 222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Licensed under the Apache License, Version 2.0 (the "License"); 422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * you may not use this file except in compliance with the License. 522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * You may obtain a copy of the License at 622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * http://www.apache.org/licenses/LICENSE-2.0 822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Unless required by applicable law or agreed to in writing, software 1022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * distributed under the License is distributed on an "AS IS" BASIS, 1122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * See the License for the specific language governing permissions and 1322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * limitations under the License. 1422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 1522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 1622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 1722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * File: header.S 1822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 1922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 2022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 2122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * IA32 calling convention and general notes: 2222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 2322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * EAX, ECX, EDX - general purpose scratch registers (caller-saved); 2422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 2522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * The stack (%esp) - used to pass arguments to functions 2622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 2722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * EAX - holds the first 4 bytes of a return 2822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * EDX - holds the second 4 bytes of a return 2922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 3022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * EBX, ESI, EDI, EBP - are callee saved 3122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 3222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * CS, DS, SS - are segment registers 3322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * ES, FS, GS - are segment registers. We will try to avoid using these registers 3422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 3522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * The stack is "full descending". Only the arguments that do not fit * in the first two arg registers are placed on the stack. 3622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * "%esp" points to the first stacked argument (i.e. the 3rd arg). 3722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 3822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 3922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 4022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Mterp and IA32 notes 4122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 4222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * mem nick purpose 4322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * (%ebp) rGLUE InterpState base pointer (A.K.A. MterpGlue Pointer) 4422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * %esi rPC interpreted program counter, used for fetching 4522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * instructions 4622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * %ebx rINST first 16-bit code unit of current instruction 4722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * %edi rFP interpreted frame pointer, used for accessing 4822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * locals and args 4922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 5022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 5122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 5222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Includes 5322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 5422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 5522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#include "../common/asm-constants.h" 5622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 5722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 5822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Reserved registers 5922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 6022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 6122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rGLUE (%ebp) 6222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rINST %ebx 6322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rINSTbl %bl 6422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rINSTbh %bh 6522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rINSTw %bx 6622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rPC %esi 6722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rFP %edi 6822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 6922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 7022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Temporary register used when finishing an opcode 7122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 7222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 7322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define rFinish %edx 7422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 7522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 7622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Stack locations used for temporary data. For convenience. 7722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 7822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 7922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define sReg0 4(%ebp) 8022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define sReg1 8(%ebp) 8122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define sReg2 12(%ebp) 8222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch#define sReg3 16(%ebp) 8322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 8422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 8522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Save the PC and FP to the glue struct 8622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 8722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 8822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro SAVE_PC_FP_TO_GLUE _reg 8922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movl rGLUE, \_reg 9022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movl rPC, offGlue_pc(\_reg) 9122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movl rFP, offGlue_fp(\_reg) 9222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 9322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 9422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 9522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Restore the PC and FP from the glue struct 9622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 9722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 9822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro LOAD_PC_FP_FROM_GLUE 9922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movl rGLUE, rFP 10022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movl offGlue_pc(rFP), rPC 10122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movl offGlue_fp(rFP), rFP 10222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 10322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 10422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 10522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * "Export" the PC to the stack frame, f/b/o future exception objects. This must 10622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * be done *before* something calls dvmThrowException. 10722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 10822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e. 10922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc) 11022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 11122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * It's okay to do this more than once. 11222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 11322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 11422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro EXPORT_PC 11522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movl rPC, (-sizeofStackSaveArea + offStackSaveArea_currentPc)(rFP) 11622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 11722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 11822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 11922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Given a frame pointer, find the stack save area. 12022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * In C this is "((StackSaveArea*)(_fp) -1)". 12122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 12222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 12322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro SAVEAREA_FROM_FP _reg 12422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch lea -sizeofStackSaveArea(rFP), \_reg 12522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 12622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 12722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 12822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Get the 32-bit value from a dalvik register. 12922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 13022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 13122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro GET_VREG _vreg 13222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movl (rFP,\_vreg, 4), \_vreg 13322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 13422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 13522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 13622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Set the 32-bit value from a dalvik register. 13722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 13822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 13922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro SET_VREG _reg _vreg 14022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movl \_reg, (rFP,\_vreg, 4) 14122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 14222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 14322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 14422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Fetch the next instruction from rPC into rINST. Does not advance rPC. 14522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 14622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 14722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FETCH_INST 14822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzwl (rPC), rINST 14922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 15022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 15122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 15222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Fetch the next instruction from the specified offset. Advances rPC 15322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * to point to the next instruction. "_count" is in 16-bit code units. 15422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * 15522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * This must come AFTER anything that can throw an exception, or the 15622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * exception catch may miss. (This also implies that it must come after 15722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * EXPORT_PC()) 15822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 15922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 16022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FETCH_ADVANCE_INST _count 16122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch add $$(\_count*2), rPC 16222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzwl (rPC), rINST 16322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 16422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 16522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 16622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Fetch the next instruction from an offset specified by _reg. Updates 16722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * rPC to point to the next instruction. "_reg" must specify the distance 16822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * in bytes, *not* 16-bit code units, and may be a signed value. 16922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 17022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 17122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FETCH_ADVANCE_INST_RB _reg 17222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch addl \_reg, rPC 17322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzwl (rPC), rINST 17422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 17522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 17622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 17722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Fetch a half-word code unit from an offset past the current PC. The 17822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * "_count" value is in 16-bit code units. Does not advance rPC. 17922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * For example, given instruction of format: AA|op BBBB, it 18022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * fetches BBBB. 18122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 18222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 18322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FETCH _count _reg 18422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzwl (\_count*2)(rPC), \_reg 18522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 18622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 18722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 18822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Fetch a half-word code unit from an offset past the current PC. The 18922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * "_count" value is in 16-bit code units. Does not advance rPC. 19022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * This variant treats the value as signed. 19122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 19222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 19322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FETCHs _count _reg 19422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movswl (\_count*2)(rPC), \_reg 19522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 19622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 19722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 19822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Fetch the first byte from an offset past the current PC. The 19922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * "_count" value is in 16-bit code units. Does not advance rPC. 20022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * For example, given instruction of format: AA|op CC|BB, it 20122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * fetches BB. 20222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 20322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 20422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FETCH_BB _count _reg 20522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_count*2)(rPC), \_reg 20622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 20722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 20822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 20922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Fetch the second byte from an offset past the current PC. The 21022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * "_count" value is in 16-bit code units. Does not advance rPC. 21122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * For example, given instruction of format: AA|op CC|BB, it 21222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * fetches CC. 21322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 21422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 21522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FETCH_CC _count _reg 21622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_count*2 + 1)(rPC), \_reg 21722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 21822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 21922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 22022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Fetch the second byte from an offset past the current PC. The 22122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * "_count" value is in 16-bit code units. Does not advance rPC. 22222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * This variant treats the value as signed. 22322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 22422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 22522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FETCH_CCs _count _reg 22622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movsbl (\_count*2 + 1)(rPC), \_reg 22722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 22822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 22922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 23022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 23122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Fetch one byte from an offset past the current PC. Pass in the same 23222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * "_count" as you would for FETCH, and an additional 0/1 indicating which 23322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * byte of the halfword you want (lo/hi). 23422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 23522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 23622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FETCH_B _reg _count _byte 23722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_count*2+\_byte)(rPC), \_reg 23822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 23922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 24022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 24122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Put the instruction's opcode field into the specified register. 24222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 24322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 24422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro GET_INST_OPCODE _reg 24522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl rINSTbl, \_reg 24622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 24722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 24822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 24922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Begin executing the opcode in _reg. 25022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 25122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 25222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro GOTO_OPCODE _reg 25322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch shl $$${handler_size_bits}, \_reg 25422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch addl $$dvmAsmInstructionStart,\_reg 25522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch jmp *\_reg 25622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 25722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 25822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 25922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 26022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 26122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Macros pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE 26222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * by using a jump table. _rFinish should must be the same register for 26322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * both macros. 26422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 26522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 26622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FFETCH _rFinish 26722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (rPC), \_rFinish 26822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 26922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 27022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FGETOP_JMPa _rFinish 27122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl 1(rPC), rINST 27222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) 27322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 27422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 27522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 27622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE 27722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * by using a jump table. _rFinish and _count should must be the same register for 27822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * both macros. 27922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 28022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 28122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FFETCH_ADV _count _rFinish 28222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_count*2)(rPC), \_rFinish 28322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 28422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 28522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FGETOP_JMP _count _rFinish 28622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_count*2 + 1)(rPC), rINST 28722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch addl $$(\_count*2), rPC 28822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) 28922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 29022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 29122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 29222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE 29322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * by using a jump table. _rFinish and _reg should must be the same register for 29422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * both macros. 29522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 29622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 29722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FFETCH_ADV_RB _reg _rFinish 29822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_reg, rPC), \_rFinish 29922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 30022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 30122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FGETOP_RB_JMP _reg _rFinish 30222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl 1(\_reg, rPC), rINST 30322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch addl \_reg, rPC 30422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) 30522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 30622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 30722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 30822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Attempts to speed up FETCH_INST, GET_INST_OPCODE using 30922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * a jump table. This macro should be called before FINISH_JMP where 31022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * rFinish should be the same register containing the opcode value. 31122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * This is an attempt to split up FINISH in order to reduce or remove 31222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * potential stalls due to the wait for rFINISH. 31322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 31422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 31522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FINISH_FETCH _rFinish 31622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (rPC), \_rFinish 31722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl 1(rPC), rINST 31822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 31922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 32022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 32122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 32222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE using 32322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * a jump table. This macro should be called before FINISH_JMP where 32422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * rFinish should be the same register containing the opcode value. 32522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * This is an attempt to split up FINISH in order to reduce or remove 32622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * potential stalls due to the wait for rFINISH. 32722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 32822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 32922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FINISH_FETCH_ADVANCE _count _rFinish 33022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_count*2)(rPC), \_rFinish 33122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_count*2 + 1)(rPC), rINST 33222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch addl $$(\_count*2), rPC 33322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 33422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 33522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 33622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE using 33722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * a jump table. This macro should be called before FINISH_JMP where 33822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * rFinish should be the same register containing the opcode value. 33922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * This is an attempt to split up FINISH in order to reduce or remove 34022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * potential stalls due to the wait for rFINISH. 34122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 34222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 34322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FINISH_FETCH_ADVANCE_RB _reg _rFinish 34422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_reg, rPC), \_rFinish 34522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl 1(\_reg, rPC), rINST 34622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch addl \_reg, rPC 34722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 34822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 34922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 35022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Attempts to speed up GOTO_OPCODE using a jump table. This macro should 35122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * be called after a FINISH_FETCH* instruction where rFinish should be the 35222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * same register containing the opcode value. This is an attempt to split up 35322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * FINISH in order to reduce or remove potential stalls due to the wait for rFINISH. 35422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 35522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 35622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FINISH_JMP _rFinish 35722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) 35822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 35922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 36022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 36122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Attempts to speed up FETCH_INST, GET_INST_OPCODE, GOTO_OPCODE by using 36222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * a jump table. Uses a single macro - but it should be faster if we 36322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * split up the fetch for rFinish and the jump using rFinish. 36422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 36522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 36622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FINISH_A 36722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (rPC), rFinish 36822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl 1(rPC), rINST 36922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch jmp *dvmAsmInstructionJmpTable(,rFinish, 4) 37022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 37122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 37222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 37322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE, 37422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * GOTO_OPCODE by using a jump table. Uses a single macro - 37522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * but it should be faster if we split up the fetch for rFinish 37622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * and the jump using rFinish. 37722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 37822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 37922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FINISH _count 38022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_count*2)(rPC), rFinish 38122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_count*2 + 1)(rPC), rINST 38222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch addl $$(\_count*2), rPC 38322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch jmp *dvmAsmInstructionJmpTable(,rFinish, 4) 38422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 38522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 38622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 38722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE, 38822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * GOTO_OPCODE by using a jump table. Uses a single macro - 38922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * but it should be faster if we split up the fetch for rFinish 39022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * and the jump using rFinish. 39122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 39222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 39322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .macro FINISH_RB _reg _rFinish 39422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl (\_reg, rPC), \_rFinish 39522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch movzbl 1(\_reg, rPC), rINST 39622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch addl \_reg, rPC 39722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) 39822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .endm 39922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 40022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch /* 40122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch * Hard coded helper values. 40222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch */ 40322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 40422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.balign 16 40522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 40622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LdoubNeg: 40722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .quad 0x8000000000000000 40822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 40922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.L64bits: 41022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .quad 0xFFFFFFFFFFFFFFFF 41122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 41222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LshiftMask2: 41322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .quad 0x0000000000000000 41422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LshiftMask: 41522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .quad 0x000000000000003F 41622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 41722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.Lvalue64: 41822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .quad 0x0000000000000040 41922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 42022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LvaluePosInfLong: 42122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .quad 0x7FFFFFFFFFFFFFFF 42222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 42322d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LvalueNegInfLong: 42422d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .quad 0x8000000000000000 42522d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 42622d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LvalueNanLong: 42722d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch .quad 0x0000000000000000 42822d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 42922d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LintMin: 43022d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.long 0x80000000 43122d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch 43222d404a75a00cda0b0ebed1034c2808ba060b05fJohnnie Birch.LintMax: 433f8f23d402dc1eef107995b29ad4d91ee5b4e1c34Johnnie Birch.long 0x7FFFFFFF 434