jitciscemitterdefs_cpu.h

来自「This is a resource based on j2me embedde」· C头文件 代码 · 共 400 行

H
400
字号
/* * @(#)jitciscemitterdefs_cpu.h	1.5 06/10/24 *  * Portions Copyright  2000-2008 Sun Microsystems, Inc. All Rights * Reserved.  Use is subject to license terms. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */#ifndef _INCLUDED_X86_JITCISCEMITTERDEFS_CPU_H#define _INCLUDED_X86_JITCISCEMITTERDEFS_CPU_H/* * This file defines all of the emitter types and option definitions that * in a platform indendent way to be used by the common CISC jit back end. * * The exported symbols are prefixed with CVMCPU_.  Other symbols should be * considered private to the X86 specific parts of the jit, including those * with the CVMX86_ prefix. * * This file should be included at the top of jitciscemitter.h. *//* TODO (Mirko): remove this temporary fix! */#include "javavm/include/jit/jitcisc_cpu.h"/************************************************************** * CPU condition codes - The following are definition of the condition * codes that are required by the CISC emitter porting layer. **************************************************************/typedef enum CVMX86Condition {         /* The x86 condition codes used for conditional jumps/moves. */  CVMX86zero          = 0x4,  CVMX86notZero       = 0x5,  CVMX86equal         = 0x4,  CVMX86notEqual      = 0x5,  CVMX86less          = 0xc,  CVMX86lessEqual     = 0xe,  CVMX86greater       = 0xf,  CVMX86greaterEqual  = 0xd,  CVMX86below         = 0x2,  CVMX86belowEqual	  = 0x6,  CVMX86above         = 0x7,  CVMX86aboveEqual	  = 0x3,  CVMX86overflow      = 0x0,  CVMX86noOverflow	  = 0x1,  CVMX86carrySet      = 0x2,  CVMX86carryClear	  = 0x3,  CVMX86negative      = 0x8,  CVMX86positive      = 0x9,  CVMX86parity        = 0xa,  CVMX86noParity      = 0xb,  CVMX86unused        = 0x10} CVMX86Condition;enum CVMCPUCondCode {   CVMCPU_COND_EQ = CVMX86equal,        /* Do when equal */   CVMCPU_COND_NE = CVMX86notEqual,     /* Do when NOT equal */   CVMCPU_COND_MI = CVMX86negative,     /* Do when has minus / negative */   CVMCPU_COND_PL = CVMX86positive,     /* Do when has plus / positive or zero */   CVMCPU_COND_OV = CVMX86overflow,     /* Do when overflowed */   CVMCPU_COND_NO = CVMX86noOverflow,   /* Do when NOT overflowed */   CVMCPU_COND_LT = CVMX86less,         /* Do when signed less than */   CVMCPU_COND_GT = CVMX86greater,      /* Do when signed greater than */   CVMCPU_COND_LE = CVMX86lessEqual,    /* Do when signed less than or equal */   CVMCPU_COND_GE = CVMX86greaterEqual, /* Do when signed greater than or equal */   CVMCPU_COND_LO = CVMX86below,        /* Do when lower / unsigned less than */   CVMCPU_COND_HI = CVMX86above,        /* Do when higher / unsigned greater than */   CVMCPU_COND_LS = CVMX86belowEqual,   /* Do when lower or same / is unsigned <= */   CVMCPU_COND_HS = CVMX86aboveEqual,   /* Do when higher or same / is unsigned >= */   CVMCPU_COND_AL = CVMX86unused,       /* Do always */   CVMCPU_COND_NV = 1+CVMX86unused     /* Do never */   #ifdef CVM_JIT_USE_FP_HARDWARE   /*    * Floating-point condition codes are used when floating point    * hardware is accessible.    *    * If the UNORDERED_LT flag is set, then unordered is treated as    * less than.    *     * If the UNORDERED_LT flag is not set, then unordered is treated    * as greater than.    */#define CVMCPU_COND_UNORDERED_LT	32 /* must be power of 2 that					    * is greater than every					    * condition code. then we					    * can `or' it into the					    * floating point condition					    * code */#define CVMCPU_COND_FFIRST (2+CVMX86unused)   ,   CVMCPU_COND_FEQ = 0+CVMCPU_COND_FFIRST, /* Do when equal */   CVMCPU_COND_FNE = 1+CVMCPU_COND_FFIRST, /* Do when NOT equal */   CVMCPU_COND_FLT = 2+CVMCPU_COND_FFIRST, /* Do when less than */   CVMCPU_COND_FGT = 3+CVMCPU_COND_FFIRST, /* Do when U or greater than */   CVMCPU_COND_FLE = 4+CVMCPU_COND_FFIRST, /* Do when less than or equal */   CVMCPU_COND_FGE = 5+CVMCPU_COND_FFIRST  /* Do when U or greater than or equal */#endif /* CVM_JIT_USE_FP_HARDWARE */};typedef enum CVMCPUCondCode CVMCPUCondCode;enum CVMCPUOpCode{/* Virtual CPU opcodes. These are used in the porting API and are not   actually used for encoding. */      CVMCPU_NOP_INSTRUCTION /* nop */,   /* integer memory access */   CVMCPU_LDR64_OPCODE      /* Load 64 bit value. */,   CVMCPU_STR64_OPCODE      /* Store 64 bit value. */,   CVMCPU_LDR32_OPCODE      /* Load 32 bit value. */,   CVMCPU_STR32_OPCODE      /* Store 32 bit value. */,   CVMCPU_LDR16U_OPCODE     /* Load unsigned 16 bit value. */,   CVMCPU_LDR16_OPCODE      /* Load signed 16 bit value. */,   CVMCPU_STR16_OPCODE      /* Store 16 bit value. */,   CVMCPU_LDR8U_OPCODE      /* Load unsigned 8 bit value. */,   CVMCPU_LDR8_OPCODE       /* Load signed 8 bit value. */,   CVMCPU_STR8_OPCODE       /* Store 8 bit value. */,/* 32 bit integer arithmetic */   CVMCPU_ANDN_OPCODE  /* reg32 <- reg32 AND ~aluRhs32. */,   CVMCPU_BIC_OPCODE = CVMCPU_ANDN_OPCODE /* reg32 <- reg32 AND ~aluRhs32*/,   CVMCPU_ADD_OPCODE   /* reg32 <- reg32 + aluRhs32. */,   CVMCPU_CMN_OPCODE = CVMCPU_ADD_OPCODE /* cmp reg32, -aluRhs32; set cc */,    CVMCPU_SUB_OPCODE   /* reg32 <- reg32 - aluRhs32. */,   CVMCPU_CMP_OPCODE = CVMCPU_SUB_OPCODE /* cmp reg32, aluRhs32; set cc */,   CVMCPU_AND_OPCODE   /* reg32 <- reg32 AND aluRhs32. */,   CVMCPU_OR_OPCODE    /* reg32 <- reg32 OR aluRhs32. */,   CVMCPU_XOR_OPCODE   /* reg32 <- reg32 XOR aluRhs32. */,   CVMCPU_MOV_OPCODE   /* reg32 <- aluRhs32. */,   CVMCPU_NEG_OPCODE   /* reg32 <- -reg32. */,   CVMCPU_NOT_OPCODE   /* reg32 <- (reg32 == 0) ? 1 : 0. */,   CVMCPU_INT2BIT_OPCODE /* reg32 <- (reg32 != 0) ? 1 : 0. */,   CVMCPU_SLL_OPCODE   /* Shift Left Logical */,   CVMCPU_SRL_OPCODE   /* Shift Right Logical */,   CVMCPU_SRA_OPCODE   /* Shift Right Arithmetic */,   CVMCPU_MULL_OPCODE  /* reg32 <- LO32(reg32 * reg32). */,   CVMCPU_MULH_OPCODE  /* reg32 <- HI32(reg32 * reg32). */,   CVMCPU_DIV_OPCODE,   CVMCPU_REM_OPCODE,/* 64 bit integer arithmetic */#if 0 /* not used by current X86 port */   CVMCPU_MUL64_OPCODE,   CVMCPU_DIV64_OPCODE,   CVMCPU_REM64_OPCODE,#endif   CVMCPU_ADD64_OPCODE,   CVMCPU_AND64_OPCODE,   CVMCPU_CMP64_OPCODE,   CVMCPU_NEG64_OPCODE,   CVMCPU_OR64_OPCODE,   CVMCPU_SLL64_OPCODE   /* Shift Left Logical */,   CVMCPU_SRL64_OPCODE   /* Shift Right Logical */,   CVMCPU_SRA64_OPCODE   /* Shift Right Arithmetic */,   CVMCPU_SUB64_OPCODE,   CVMCPU_XOR64_OPCODE#ifdef CVM_JIT_USE_FP_HARDWARE   ,/* 32-bit floating point memory access */   CVMCPU_FLDR32_OPCODE	 /* Load float 32 bit value */,   CVMCPU_FSTR32_OPCODE	 /* Store float 32 bit value */,/* 32-bit floating point arithmetic */   CVMCPU_FADD_OPCODE,   CVMCPU_FSUB_OPCODE,   CVMCPU_FMUL_OPCODE,   CVMCPU_FDIV_OPCODE,   CVMCPU_FCMP_OPCODE,   CVMCPU_FNEG_OPCODE,   CVMCPU_FMOV_OPCODE,/* 64-bit floating point memory access */   CVMCPU_FLDR64_OPCODE	 /* Load float 64 bit value */,   CVMCPU_FSTR64_OPCODE	 /* Store float 64 bit value */,/* 64-bit floating point arithmetic */   CVMCPU_DADD_OPCODE,   CVMCPU_DSUB_OPCODE,   CVMCPU_DMUL_OPCODE,   CVMCPU_DDIV_OPCODE,   CVMCPU_DCMP_OPCODE,   CVMCPU_DNEG_OPCODE,/* floating point conversion. */   CVMCPU_I2F_OPCODE,   CVMCPU_L2F_OPCODE,   CVMCPU_F2I_OPCODE,   CVMCPU_F2L_OPCODE,   CVMCPU_I2D_OPCODE,   CVMCPU_L2D_OPCODE,   CVMCPU_D2I_OPCODE,   CVMCPU_D2L_OPCODE,   CVMCPU_F2D_OPCODE,   CVMCPU_D2F_OPCODE#endif /* CVM_JIT_USE_FP_HARDWARE */};typedef enum CVMCPUOpCode CVMCPUOpCode;#define CVMCPU_LDRADDR_OPCODE   CVMCPU_LDR32_OPCODE      /* Load address value. */#define CVMCPU_STRADDR_OPCODE   CVMCPU_STR32_OPCODE      /* Store address value. *//************************************************************** * CPU ALURhs and associated types - The following are definition * of the types for the ALURhs abstraction required by the CISC * emitter porting layer. **************************************************************//*  * X86 addressing modes: *     - register + register *     - register + immediate */enum CVMCPUALURhsType {    CVMCPU_ALURHS_REGISTER,    CVMCPU_ALURHS_CONSTANT};typedef enum CVMCPUALURhsType CVMCPUALURhsType;/* * We could use a union to make this more compact, * but at much loss of clarity. */typedef struct CVMCPUALURhs CVMCPUALURhs;struct CVMCPUALURhs {    CVMCPUALURhsType  type;    CVMInt32            constValue;    CVMRMResource*      r;};typedef struct CVMCPUALURhsTokenStruct {  CVMCPUALURhsType  type;  CVMInt32  con;  CVMInt32  reg;} *CVMCPUALURhsToken;extern struct CVMCPUALURhsTokenStruct CVMCPUALURhsTokenStructConstZero;#define CVMCPUALURhsTokenConstZero (&CVMCPUALURhsTokenStructConstZero) /************************************************************** * CPU MemSpec and associated types - The following are definition * of the types for the MemSpec abstraction required by the CISC * emitter porting layer. **************************************************************/enum CVMCPUMemSpecType {  CVMCPU_MEMSPEC_REG_OFFSET = 0,              /* basereg + indexreg */  CVMCPU_MEMSPEC_IMMEDIATE_OFFSET = 1,        /* basereg + displacement */  CVMCPU_MEMSPEC_ABSOLUTE,                    /* absolute_address */  CVMCPU_MEMSPEC_SCALED_REG_OFFSET,           /* basereg + indexreg*scale */  CVMCPU_MEMSPEC_SCALED_REG_IMMEDIATE_OFFSET, /* basereg + indexreg*scale + displacement */  /* NOTE: X86 does not support post-increment and pre-decrement     memory access. Extra add/sub instruction is emitted in order to     achieve it. */   CVMCPU_MEMSPEC_PREDECREMENT_IMMEDIATE_OFFSET};typedef enum CVMCPUMemSpecType CVMCPUMemSpecType;/* Class: CVMCPUMemSpec   Purpose: Encapsulates the parameters for encoding a memory access            specification for the use of a memory reference instruction.   However, a base register is always specified outside of the CVMCPUMemSpec!   A more appropriate name would have been CVMCPUOffsetSpec. Anyway, no   base register is inserted for X86 for this reason.*/typedef struct CVMCPUMemSpec CVMCPUMemSpec;struct CVMCPUMemSpec {  CVMCPUMemSpecType     type;  /* Used in:     o CVMCPU_MEMSPEC_REG_OFFSET as only entry     o CVMCPU_MEMSPEC_SCALED_REG_OFFSET together with scale     o CVMCPU_MEMSPEC_SCALED_REG_IMMEDIATE_OFFSET together with scale and offsetValue */  CVMRMResource  *offsetReg;   /* The X86 index register. */  /* Used in:     o CVMCPU_MEMSPEC_IMMEDIATE_OFFSET as only entry     o CVMCPU_MEMSPEC_SCALED_REG_IMMEDIATE_OFFSET together with scale and offsetReg */  CVMInt32       offsetValue;  int            scale;        /* New for X86. */};typedef struct CVMCPUMemSpecTokenStruct {  CVMCPUMemSpecType     type;  CVMInt32              offset;  CVMInt32              regid;  CVMInt32              scale;} *CVMCPUMemSpecToken;/************************************************************** * CPU register and addressing types.  The following are definition of * the types for the MemSpec abstraction required by the CISC emitter * porting layer. **************************************************************/typedef unsigned char* CVMX86address;typedef enum CVMX86Prefix {  /* segment overrides */  CVMX86CS_segment = 0x2e,  CVMX86SS_segment = 0x36,  CVMX86DS_segment = 0x3e,  CVMX86ES_segment = 0x26,  CVMX86FS_segment = 0x64,  CVMX86GS_segment = 0x65} CVMX86Prefix;typedef enum CVMX86ScaleFactor {  CVMX86no_scale = -1,  CVMX86times_1  =  0,  CVMX86times_2  =  1,  CVMX86times_4  =  2,  CVMX86times_8  =  3} CVMX86ScaleFactor;typedef enum CVMX86Register {  CVMX86no_reg = CVMCPU_INVALID_REG,  CVMX86eax    = CVMX86_EAX,  CVMX86ebx    = CVMX86_EBX,  CVMX86ecx    = CVMX86_ECX,  CVMX86edx    = CVMX86_EDX,  CVMX86esi    = CVMX86_ESI,  CVMX86edi    = CVMX86_EDI,  CVMX86ebp    = CVMX86_EBP,  CVMX86esp    = CVMX86_ESP,  CVMX86eflags = CVMX86_EFLAGS} CVMX86Register;typedef struct CVMX86Address {  CVMX86Register         _base;  CVMX86Register         _index;  CVMX86ScaleFactor      _scale;  int                    _disp;  CVMCPUMemSpecType      _type; } CVMX86Address;/* export some types */typedef enum CVMX86ScaleFactor CVMCPUScaleFactor;typedef enum CVMX86Register CVMCPURegister;typedef struct CVMX86Address CVMCPUAddress;/************************************************************** * CPU emitter options **************************************************************//* ===== Optional Advanced Emitter APIs =================================== */#undef CVMCPU_HAVE_MUL_BY_CONST_POWER_OF_2_PLUS_1/************************************************************** * CPU C Call convention abstraction - The following are prototypes of calling * convention support functions required by the CISC emitter porting layer. **************************************************************/#define CVMCPU_HAVE_PLATFORM_SPECIFIC_C_CALL_CONVENTION/* define our own CVMCPUCallContext */typedef CVMUint32 CVMCPUCallContext;/* the IA-32 backend needs to know, whether the code it is producing belongs to a method using float registers. turning this switch on will provide the information in the compilation context. */#define CVM_JIT_DETECT_FLOAT_CODE#ifdef CVMJIT_TRAP_BASED_GC_CHECKS#define CVMCPU_GC_REG CVMCPU_ARG1_REG#define CVMCPU_GCTRAP_INSTRUCTION 0x00408b#define CVMCPU_GCTRAP_INSTRUCTION_MASK 0x00ffff#endif#endif /* _INCLUDED_X86_JITCISCEMITTERDEFS_CPU_H */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?