Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1518 lines
46 KiB

/*
* Copyright (c) 2000, Intel Corporation
* All rights reserved.
*
* WARRANTY DISCLAIMER
*
* THESE MATERIALS ARE PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THESE
* MATERIALS, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Intel Corporation is the author of the Materials, and requests that all
* problem reports or change requests be submitted to it directly at
* http://developer.intel.com/opensource.
*/
#ifndef EM_DECODER_H
#define EM_DECODER_H
#include "inst_ids.h"
#include "emdb_types.h"
#include "EM.h"
#define EM_DECODER_INST_NONE EM_INST_NONE
typedef Inst_id_t EM_Decoder_Inst_Id;
typedef unsigned char EM_Decoder_imp_oper_t;
#include "EM_tools.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum em_cmp_rel_s
{
EM_CMP_REL_NONE = 0,
EM_CMP_REL_GEU = 1,
EM_CMP_REL_LTU = 2,
EM_CMP_REL_EQ = 3,
EM_CMP_REL_NE = 4,
EM_CMP_REL_LT = 5,
EM_CMP_REL_GE = 6,
EM_CMP_REL_GT = 7,
EM_CMP_REL_LE = 8,
EM_CMP_REL_UNORD = 9,
EM_CMP_REL_ORD = 10,
EM_CMP_REL_NEQ = 11,
EM_CMP_REL_NLT = 12,
EM_CMP_REL_NLE = 13,
EM_CMP_REL_LAST = 14
} EM_cmp_rel_t;
typedef enum em_fp_precision_s
{
EM_FP_PRECISION_NONE = 0,
EM_FP_PRECISION_SINGLE = 1,
EM_FP_PRECISION_DOUBLE = 2,
EM_FP_PRECISION_DYNAMIC = 3,
EM_FP_PRECISION_LAST = 4
} EM_fp_precision_t;
typedef enum em_fp_status_s
{
EM_FP_STATUS_NONE = 0,
EM_FP_STATUS_S0 = 1,
EM_FP_STATUS_S1 = 2,
EM_FP_STATUS_S2 = 3,
EM_FP_STATUS_S3 = 4,
EM_FP_STATUS_LAST = 5
} EM_fp_status_t;
typedef enum EM_decoder_imp_operand
{
EM_DECODER_IMP_OPERAND_NONE = 0,
EM_DECODER_IMP_OPERAND_AR_LC,
EM_DECODER_IMP_OPERAND_RR,
EM_DECODER_IMP_OPERAND_AR_BSPSTORE,
EM_DECODER_IMP_OPERAND_APP_REG_GRP_HIGH,
EM_DECODER_IMP_OPERAND_DTR,
EM_DECODER_IMP_OPERAND_AR_UNAT,
EM_DECODER_IMP_OPERAND_CR_IIM,
EM_DECODER_IMP_OPERAND_PSR,
EM_DECODER_IMP_OPERAND_CFM,
EM_DECODER_IMP_OPERAND_CR_IFS,
EM_DECODER_IMP_OPERAND_CR_ISR,
EM_DECODER_IMP_OPERAND_AR_BSP,
EM_DECODER_IMP_OPERAND_AR_RSC,
EM_DECODER_IMP_OPERAND_AR_EC,
EM_DECODER_IMP_OPERAND_AR_PFS,
EM_DECODER_IMP_OPERAND_FPSR,
EM_DECODER_IMP_OPERAND_APP_CCV,
EM_DECODER_IMP_OPERAND_PR63,
EM_DECODER_IMP_OPERAND_DCR,
EM_DECODER_IMP_OPERAND_CR_IIP,
EM_DECODER_IMP_OPERAND_IPSR,
EM_DECODER_IMP_OPERAND_CSD,
EM_DECODER_IMP_OPERAND_IP,
EM_DECODER_IMP_OPERAND_EIP,
EM_DECODER_IMP_OPERAND_MSR_XIP,
EM_DECODER_IMP_OPERAND_MSR_XPSR,
EM_DECODER_IMP_OPERAND_MSR_XFS,
EM_DECODER_IMP_OPERAND_AR_ITC,
EM_DECODER_IMP_OPERAND_AR_RNAT,
EM_DECODER_IMP_OPERAND_AR_RCS,
EM_DECODER_IMP_OPERAND_CR_CMCV,
EM_DECODER_IMP_OPERAND_CR_EOI,
EM_DECODER_IMP_OPERAND_CR_GPTA,
EM_DECODER_IMP_OPERAND_CR_IFA,
EM_DECODER_IMP_OPERAND_CR_IHA,
EM_DECODER_IMP_OPERAND_CR_IIPA,
EM_DECODER_IMP_OPERAND_CR_ITIR,
EM_DECODER_IMP_OPERAND_CR_ITM,
EM_DECODER_IMP_OPERAND_CR_ITV,
EM_DECODER_IMP_OPERAND_CR_IVA,
EM_DECODER_IMP_OPERAND_CR_IVR,
EM_DECODER_IMP_OPERAND_CR_LID,
EM_DECODER_IMP_OPERAND_CR_PMV,
EM_DECODER_IMP_OPERAND_CR_PTA,
EM_DECODER_IMP_OPERAND_CR_TPR,
EM_DECODER_IMP_OPERAND_LAST
} EM_Decoder_Imp_Operand;
typedef enum EM_decoder_err
{
EM_DECODER_NO_ERROR = 0,
EM_DECODER_INVALID_SLOT_BRANCH_INST,
EM_DECODER_MUST_BE_GROUP_LAST,
EM_DECODER_BASE_EQUAL_DEST,
EM_DECODER_EQUAL_DESTS,
EM_DECODER_ODD_EVEN_DESTS,
EM_DECODER_WRITE_TO_ZERO_REGISTER,
EM_DECODER_WRITE_TO_SPECIAL_FP_REGISTER,
EM_DECODER_REGISTER_VALUE_OUT_OF_RANGE,
EM_DECODER_REGISTER_RESERVED_VALUE,
EM_DECODER_IMMEDIATE_VALUE_OUT_OF_RANGE,
EM_DECODER_IMMEDIATE_INVALID_VALUE,
EM_DECODER_STACK_FRAME_SIZE_OUT_OF_RANGE,
EM_DECODER_LOCALS_SIZE_LARGER_STACK_FRAME,
EM_DECODER_ROTATING_SIZE_LARGER_STACK_FRAME,
EM_DECODER_HARD_CODED_PREDICATE_INVALID_VALUE,
EM_DECODER_FIRST_FATAL_INST_ERROR,
EM_DECODER_INVALID_PRM_OPCODE = EM_DECODER_FIRST_FATAL_INST_ERROR,
EM_DECODER_INVALID_INST_SLOT,
EM_DECODER_FIRST_FATAL_ERROR,
EM_DECODER_INVALID_TEMPLATE = EM_DECODER_FIRST_FATAL_ERROR,
EM_DECODER_INVALID_CLIENT_ID,
EM_DECODER_NULL_PTR,
EM_DECODER_TOO_SHORT_ERR,
EM_DECODER_ASSOCIATE_MISS,
EM_DECODER_INVALID_INST_ID,
EM_DECODER_INVALID_MACHINE_MODE,
EM_DECODER_INVALID_MACHINE_TYPE,
EM_DECODER_INTERNAL_ERROR,
EM_DECODER_LAST_ERROR
} EM_Decoder_Err;
typedef EM_Decoder_Err DecErr();
typedef enum EM_decoder_machine_type
{
EM_DECODER_CPU_NO_CHANGE=0,
EM_DECODER_CPU_DEFAULT,
EM_DECODER_CPU_P7 = 4,
EM_DECODER_CPU_LAST = 7
} EM_Decoder_Machine_Type;
typedef enum EM_decoder_machine_mode
{
EM_DECODER_MODE_NO_CHANGE = 0,
EM_DECODER_MODE_DEFAULT,
EM_DECODER_MODE_EM = 8,
EM_DECODER_MODE_LAST = 9
} EM_Decoder_Machine_Mode;
typedef enum EM_decoder_operand_type
{
EM_DECODER_NO_OPER = 0,
EM_DECODER_REGISTER,
EM_DECODER_MEMORY,
EM_DECODER_IMMEDIATE,
EM_DECODER_IP_RELATIVE,
EM_DECODER_REGFILE,
EM_DECODER_OPERAND_LAST
} EM_Decoder_Operand_Type;
typedef enum EM_decoder_reg_type
{
EM_DECODER_NO_REG_TYPE = 0,
EM_DECODER_INT_REG = 7,
EM_DECODER_FP_REG,
EM_DECODER_APP_REG,
EM_DECODER_BR_REG,
EM_DECODER_PRED_REG = 13,
EM_DECODER_CR_REG,
EM_DECODER_APP_CCV_REG,
EM_DECODER_APP_PFS_REG,
EM_DECODER_PR_REG,
EM_DECODER_PR_ROT_REG,
EM_DECODER_PSR_REG,
EM_DECODER_PSR_L_REG,
EM_DECODER_PSR_UM_REG = 20,
EM_DECODER_IP_REG, /* IP register type */
EM_DECODER_REG_TYPE_LAST
} EM_Decoder_Reg_Type;
typedef enum EM_decoder_reg_name
{
EM_DECODER_NO_REG=0,
EM_DECODER_REG_R0 = 98,
EM_DECODER_REG_R1,
EM_DECODER_REG_R2,
EM_DECODER_REG_R3,
EM_DECODER_REG_R4,
EM_DECODER_REG_R5,
EM_DECODER_REG_R6,
EM_DECODER_REG_R7,
EM_DECODER_REG_R8,
EM_DECODER_REG_R9,
EM_DECODER_REG_R10,
EM_DECODER_REG_R11,
EM_DECODER_REG_R12,
EM_DECODER_REG_R13,
EM_DECODER_REG_R14,
EM_DECODER_REG_R15,
EM_DECODER_REG_R16,
EM_DECODER_REG_R17,
EM_DECODER_REG_R18,
EM_DECODER_REG_R19,
EM_DECODER_REG_R20,
EM_DECODER_REG_R21,
EM_DECODER_REG_R22,
EM_DECODER_REG_R23,
EM_DECODER_REG_R24,
EM_DECODER_REG_R25,
EM_DECODER_REG_R26,
EM_DECODER_REG_R27,
EM_DECODER_REG_R28,
EM_DECODER_REG_R29,
EM_DECODER_REG_R30,
EM_DECODER_REG_R31,
EM_DECODER_REG_R32,
EM_DECODER_REG_R33,
EM_DECODER_REG_R34,
EM_DECODER_REG_R35,
EM_DECODER_REG_R36,
EM_DECODER_REG_R37,
EM_DECODER_REG_R38,
EM_DECODER_REG_R39,
EM_DECODER_REG_R40,
EM_DECODER_REG_R41,
EM_DECODER_REG_R42,
EM_DECODER_REG_R43,
EM_DECODER_REG_R44,
EM_DECODER_REG_R45,
EM_DECODER_REG_R46,
EM_DECODER_REG_R47,
EM_DECODER_REG_R48,
EM_DECODER_REG_R49,
EM_DECODER_REG_R50,
EM_DECODER_REG_R51,
EM_DECODER_REG_R52,
EM_DECODER_REG_R53,
EM_DECODER_REG_R54,
EM_DECODER_REG_R55,
EM_DECODER_REG_R56,
EM_DECODER_REG_R57,
EM_DECODER_REG_R58,
EM_DECODER_REG_R59,
EM_DECODER_REG_R60,
EM_DECODER_REG_R61,
EM_DECODER_REG_R62,
EM_DECODER_REG_R63,
EM_DECODER_REG_R64,
EM_DECODER_REG_R65,
EM_DECODER_REG_R66,
EM_DECODER_REG_R67,
EM_DECODER_REG_R68,
EM_DECODER_REG_R69,
EM_DECODER_REG_R70,
EM_DECODER_REG_R71,
EM_DECODER_REG_R72,
EM_DECODER_REG_R73,
EM_DECODER_REG_R74,
EM_DECODER_REG_R75,
EM_DECODER_REG_R76,
EM_DECODER_REG_R77,
EM_DECODER_REG_R78,
EM_DECODER_REG_R79,
EM_DECODER_REG_R80,
EM_DECODER_REG_R81,
EM_DECODER_REG_R82,
EM_DECODER_REG_R83,
EM_DECODER_REG_R84,
EM_DECODER_REG_R85,
EM_DECODER_REG_R86,
EM_DECODER_REG_R87,
EM_DECODER_REG_R88,
EM_DECODER_REG_R89,
EM_DECODER_REG_R90,
EM_DECODER_REG_R91,
EM_DECODER_REG_R92,
EM_DECODER_REG_R93,
EM_DECODER_REG_R94,
EM_DECODER_REG_R95,
EM_DECODER_REG_R96,
EM_DECODER_REG_R97,
EM_DECODER_REG_R98,
EM_DECODER_REG_R99,
EM_DECODER_REG_R100,
EM_DECODER_REG_R101,
EM_DECODER_REG_R102,
EM_DECODER_REG_R103,
EM_DECODER_REG_R104,
EM_DECODER_REG_R105,
EM_DECODER_REG_R106,
EM_DECODER_REG_R107,
EM_DECODER_REG_R108,
EM_DECODER_REG_R109,
EM_DECODER_REG_R110,
EM_DECODER_REG_R111,
EM_DECODER_REG_R112,
EM_DECODER_REG_R113,
EM_DECODER_REG_R114,
EM_DECODER_REG_R115,
EM_DECODER_REG_R116,
EM_DECODER_REG_R117,
EM_DECODER_REG_R118,
EM_DECODER_REG_R119,
EM_DECODER_REG_R120,
EM_DECODER_REG_R121,
EM_DECODER_REG_R122,
EM_DECODER_REG_R123,
EM_DECODER_REG_R124,
EM_DECODER_REG_R125,
EM_DECODER_REG_R126,
EM_DECODER_REG_R127,
EM_DECODER_REG_F0,
EM_DECODER_REG_F1,
EM_DECODER_REG_F2,
EM_DECODER_REG_F3,
EM_DECODER_REG_F4,
EM_DECODER_REG_F5,
EM_DECODER_REG_F6,
EM_DECODER_REG_F7,
EM_DECODER_REG_F8,
EM_DECODER_REG_F9,
EM_DECODER_REG_F10,
EM_DECODER_REG_F11,
EM_DECODER_REG_F12,
EM_DECODER_REG_F13,
EM_DECODER_REG_F14,
EM_DECODER_REG_F15,
EM_DECODER_REG_F16,
EM_DECODER_REG_F17,
EM_DECODER_REG_F18,
EM_DECODER_REG_F19,
EM_DECODER_REG_F20,
EM_DECODER_REG_F21,
EM_DECODER_REG_F22,
EM_DECODER_REG_F23,
EM_DECODER_REG_F24,
EM_DECODER_REG_F25,
EM_DECODER_REG_F26,
EM_DECODER_REG_F27,
EM_DECODER_REG_F28,
EM_DECODER_REG_F29,
EM_DECODER_REG_F30,
EM_DECODER_REG_F31,
EM_DECODER_REG_F32,
EM_DECODER_REG_F33,
EM_DECODER_REG_F34,
EM_DECODER_REG_F35,
EM_DECODER_REG_F36,
EM_DECODER_REG_F37,
EM_DECODER_REG_F38,
EM_DECODER_REG_F39,
EM_DECODER_REG_F40,
EM_DECODER_REG_F41,
EM_DECODER_REG_F42,
EM_DECODER_REG_F43,
EM_DECODER_REG_F44,
EM_DECODER_REG_F45,
EM_DECODER_REG_F46,
EM_DECODER_REG_F47,
EM_DECODER_REG_F48,
EM_DECODER_REG_F49,
EM_DECODER_REG_F50,
EM_DECODER_REG_F51,
EM_DECODER_REG_F52,
EM_DECODER_REG_F53,
EM_DECODER_REG_F54,
EM_DECODER_REG_F55,
EM_DECODER_REG_F56,
EM_DECODER_REG_F57,
EM_DECODER_REG_F58,
EM_DECODER_REG_F59,
EM_DECODER_REG_F60,
EM_DECODER_REG_F61,
EM_DECODER_REG_F62,
EM_DECODER_REG_F63,
EM_DECODER_REG_F64,
EM_DECODER_REG_F65,
EM_DECODER_REG_F66,
EM_DECODER_REG_F67,
EM_DECODER_REG_F68,
EM_DECODER_REG_F69,
EM_DECODER_REG_F70,
EM_DECODER_REG_F71,
EM_DECODER_REG_F72,
EM_DECODER_REG_F73,
EM_DECODER_REG_F74,
EM_DECODER_REG_F75,
EM_DECODER_REG_F76,
EM_DECODER_REG_F77,
EM_DECODER_REG_F78,
EM_DECODER_REG_F79,
EM_DECODER_REG_F80,
EM_DECODER_REG_F81,
EM_DECODER_REG_F82,
EM_DECODER_REG_F83,
EM_DECODER_REG_F84,
EM_DECODER_REG_F85,
EM_DECODER_REG_F86,
EM_DECODER_REG_F87,
EM_DECODER_REG_F88,
EM_DECODER_REG_F89,
EM_DECODER_REG_F90,
EM_DECODER_REG_F91,
EM_DECODER_REG_F92,
EM_DECODER_REG_F93,
EM_DECODER_REG_F94,
EM_DECODER_REG_F95,
EM_DECODER_REG_F96,
EM_DECODER_REG_F97,
EM_DECODER_REG_F98,
EM_DECODER_REG_F99,
EM_DECODER_REG_F100,
EM_DECODER_REG_F101,
EM_DECODER_REG_F102,
EM_DECODER_REG_F103,
EM_DECODER_REG_F104,
EM_DECODER_REG_F105,
EM_DECODER_REG_F106,
EM_DECODER_REG_F107,
EM_DECODER_REG_F108,
EM_DECODER_REG_F109,
EM_DECODER_REG_F110,
EM_DECODER_REG_F111,
EM_DECODER_REG_F112,
EM_DECODER_REG_F113,
EM_DECODER_REG_F114,
EM_DECODER_REG_F115,
EM_DECODER_REG_F116,
EM_DECODER_REG_F117,
EM_DECODER_REG_F118,
EM_DECODER_REG_F119,
EM_DECODER_REG_F120,
EM_DECODER_REG_F121,
EM_DECODER_REG_F122,
EM_DECODER_REG_F123,
EM_DECODER_REG_F124,
EM_DECODER_REG_F125,
EM_DECODER_REG_F126,
EM_DECODER_REG_F127,
EM_DECODER_REG_AR0,
EM_DECODER_REG_AR1,
EM_DECODER_REG_AR2,
EM_DECODER_REG_AR3,
EM_DECODER_REG_AR4,
EM_DECODER_REG_AR5,
EM_DECODER_REG_AR6,
EM_DECODER_REG_AR7,
EM_DECODER_REG_AR8,
EM_DECODER_REG_AR9,
EM_DECODER_REG_AR10,
EM_DECODER_REG_AR11,
EM_DECODER_REG_AR12,
EM_DECODER_REG_AR13,
EM_DECODER_REG_AR14,
EM_DECODER_REG_AR15,
EM_DECODER_REG_AR16,
EM_DECODER_REG_AR17,
EM_DECODER_REG_AR18,
EM_DECODER_REG_AR19,
EM_DECODER_REG_AR20,
EM_DECODER_REG_AR21,
EM_DECODER_REG_AR22,
EM_DECODER_REG_AR23,
EM_DECODER_REG_AR24,
EM_DECODER_REG_AR25,
EM_DECODER_REG_AR26,
EM_DECODER_REG_AR27,
EM_DECODER_REG_AR28,
EM_DECODER_REG_AR29,
EM_DECODER_REG_AR30,
EM_DECODER_REG_AR31,
EM_DECODER_REG_AR32,
EM_DECODER_REG_AR33,
EM_DECODER_REG_AR34,
EM_DECODER_REG_AR35,
EM_DECODER_REG_AR36,
EM_DECODER_REG_AR37,
EM_DECODER_REG_AR38,
EM_DECODER_REG_AR39,
EM_DECODER_REG_AR40,
EM_DECODER_REG_AR41,
EM_DECODER_REG_AR42,
EM_DECODER_REG_AR43,
EM_DECODER_REG_AR44,
EM_DECODER_REG_AR45,
EM_DECODER_REG_AR46,
EM_DECODER_REG_AR47,
EM_DECODER_REG_AR48,
EM_DECODER_REG_AR49,
EM_DECODER_REG_AR50,
EM_DECODER_REG_AR51,
EM_DECODER_REG_AR52,
EM_DECODER_REG_AR53,
EM_DECODER_REG_AR54,
EM_DECODER_REG_AR55,
EM_DECODER_REG_AR56,
EM_DECODER_REG_AR57,
EM_DECODER_REG_AR58,
EM_DECODER_REG_AR59,
EM_DECODER_REG_AR60,
EM_DECODER_REG_AR61,
EM_DECODER_REG_AR62,
EM_DECODER_REG_AR63,
EM_DECODER_REG_AR64,
EM_DECODER_REG_AR65,
EM_DECODER_REG_AR66,
EM_DECODER_REG_AR67,
EM_DECODER_REG_AR68,
EM_DECODER_REG_AR69,
EM_DECODER_REG_AR70,
EM_DECODER_REG_AR71,
EM_DECODER_REG_AR72,
EM_DECODER_REG_AR73,
EM_DECODER_REG_AR74,
EM_DECODER_REG_AR75,
EM_DECODER_REG_AR76,
EM_DECODER_REG_AR77,
EM_DECODER_REG_AR78,
EM_DECODER_REG_AR79,
EM_DECODER_REG_AR80,
EM_DECODER_REG_AR81,
EM_DECODER_REG_AR82,
EM_DECODER_REG_AR83,
EM_DECODER_REG_AR84,
EM_DECODER_REG_AR85,
EM_DECODER_REG_AR86,
EM_DECODER_REG_AR87,
EM_DECODER_REG_AR88,
EM_DECODER_REG_AR89,
EM_DECODER_REG_AR90,
EM_DECODER_REG_AR91,
EM_DECODER_REG_AR92,
EM_DECODER_REG_AR93,
EM_DECODER_REG_AR94,
EM_DECODER_REG_AR95,
EM_DECODER_REG_AR96,
EM_DECODER_REG_AR97,
EM_DECODER_REG_AR98,
EM_DECODER_REG_AR99,
EM_DECODER_REG_AR100,
EM_DECODER_REG_AR101,
EM_DECODER_REG_AR102,
EM_DECODER_REG_AR103,
EM_DECODER_REG_AR104,
EM_DECODER_REG_AR105,
EM_DECODER_REG_AR106,
EM_DECODER_REG_AR107,
EM_DECODER_REG_AR108,
EM_DECODER_REG_AR109,
EM_DECODER_REG_AR110,
EM_DECODER_REG_AR111,
EM_DECODER_REG_AR112,
EM_DECODER_REG_AR113,
EM_DECODER_REG_AR114,
EM_DECODER_REG_AR115,
EM_DECODER_REG_AR116,
EM_DECODER_REG_AR117,
EM_DECODER_REG_AR118,
EM_DECODER_REG_AR119,
EM_DECODER_REG_AR120,
EM_DECODER_REG_AR121,
EM_DECODER_REG_AR122,
EM_DECODER_REG_AR123,
EM_DECODER_REG_AR124,
EM_DECODER_REG_AR125,
EM_DECODER_REG_AR126,
EM_DECODER_REG_AR127,
EM_DECODER_REG_P0,
EM_DECODER_REG_P1,
EM_DECODER_REG_P2,
EM_DECODER_REG_P3,
EM_DECODER_REG_P4,
EM_DECODER_REG_P5,
EM_DECODER_REG_P6,
EM_DECODER_REG_P7,
EM_DECODER_REG_P8,
EM_DECODER_REG_P9,
EM_DECODER_REG_P10,
EM_DECODER_REG_P11,
EM_DECODER_REG_P12,
EM_DECODER_REG_P13,
EM_DECODER_REG_P14,
EM_DECODER_REG_P15,
EM_DECODER_REG_P16,
EM_DECODER_REG_P17,
EM_DECODER_REG_P18,
EM_DECODER_REG_P19,
EM_DECODER_REG_P20,
EM_DECODER_REG_P21,
EM_DECODER_REG_P22,
EM_DECODER_REG_P23,
EM_DECODER_REG_P24,
EM_DECODER_REG_P25,
EM_DECODER_REG_P26,
EM_DECODER_REG_P27,
EM_DECODER_REG_P28,
EM_DECODER_REG_P29,
EM_DECODER_REG_P30,
EM_DECODER_REG_P31,
EM_DECODER_REG_P32,
EM_DECODER_REG_P33,
EM_DECODER_REG_P34,
EM_DECODER_REG_P35,
EM_DECODER_REG_P36,
EM_DECODER_REG_P37,
EM_DECODER_REG_P38,
EM_DECODER_REG_P39,
EM_DECODER_REG_P40,
EM_DECODER_REG_P41,
EM_DECODER_REG_P42,
EM_DECODER_REG_P43,
EM_DECODER_REG_P44,
EM_DECODER_REG_P45,
EM_DECODER_REG_P46,
EM_DECODER_REG_P47,
EM_DECODER_REG_P48,
EM_DECODER_REG_P49,
EM_DECODER_REG_P50,
EM_DECODER_REG_P51,
EM_DECODER_REG_P52,
EM_DECODER_REG_P53,
EM_DECODER_REG_P54,
EM_DECODER_REG_P55,
EM_DECODER_REG_P56,
EM_DECODER_REG_P57,
EM_DECODER_REG_P58,
EM_DECODER_REG_P59,
EM_DECODER_REG_P60,
EM_DECODER_REG_P61,
EM_DECODER_REG_P62,
EM_DECODER_REG_P63,
EM_DECODER_REG_BR0 ,
EM_DECODER_REG_BR1,
EM_DECODER_REG_BR2,
EM_DECODER_REG_BR3,
EM_DECODER_REG_BR4,
EM_DECODER_REG_BR5,
EM_DECODER_REG_BR6,
EM_DECODER_REG_BR7,
EM_DECODER_REG_PR,
EM_DECODER_REG_PR_ROT,
EM_DECODER_REG_CR0,
EM_DECODER_REG_CR1,
EM_DECODER_REG_CR2,
EM_DECODER_REG_CR3,
EM_DECODER_REG_CR4,
EM_DECODER_REG_CR5,
EM_DECODER_REG_CR6,
EM_DECODER_REG_CR7,
EM_DECODER_REG_CR8,
EM_DECODER_REG_CR9,
EM_DECODER_REG_CR10,
EM_DECODER_REG_CR11,
EM_DECODER_REG_CR12,
EM_DECODER_REG_CR13,
EM_DECODER_REG_CR14,
EM_DECODER_REG_CR15,
EM_DECODER_REG_CR16,
EM_DECODER_REG_CR17,
EM_DECODER_REG_CR18,
EM_DECODER_REG_CR19,
EM_DECODER_REG_CR20,
EM_DECODER_REG_CR21,
EM_DECODER_REG_CR22,
EM_DECODER_REG_CR23,
EM_DECODER_REG_CR24,
EM_DECODER_REG_CR25,
EM_DECODER_REG_CR26,
EM_DECODER_REG_CR27,
EM_DECODER_REG_CR28,
EM_DECODER_REG_CR29,
EM_DECODER_REG_CR30,
EM_DECODER_REG_CR31,
EM_DECODER_REG_CR32,
EM_DECODER_REG_CR33,
EM_DECODER_REG_CR34,
EM_DECODER_REG_CR35,
EM_DECODER_REG_CR36,
EM_DECODER_REG_CR37,
EM_DECODER_REG_CR38,
EM_DECODER_REG_CR39,
EM_DECODER_REG_CR40,
EM_DECODER_REG_CR41,
EM_DECODER_REG_CR42,
EM_DECODER_REG_CR43,
EM_DECODER_REG_CR44,
EM_DECODER_REG_CR45,
EM_DECODER_REG_CR46,
EM_DECODER_REG_CR47,
EM_DECODER_REG_CR48,
EM_DECODER_REG_CR49,
EM_DECODER_REG_CR50,
EM_DECODER_REG_CR51,
EM_DECODER_REG_CR52,
EM_DECODER_REG_CR53,
EM_DECODER_REG_CR54,
EM_DECODER_REG_CR55,
EM_DECODER_REG_CR56,
EM_DECODER_REG_CR57,
EM_DECODER_REG_CR58,
EM_DECODER_REG_CR59,
EM_DECODER_REG_CR60,
EM_DECODER_REG_CR61,
EM_DECODER_REG_CR62,
EM_DECODER_REG_CR63,
EM_DECODER_REG_CR64,
EM_DECODER_REG_CR65,
EM_DECODER_REG_CR66,
EM_DECODER_REG_CR67,
EM_DECODER_REG_CR68,
EM_DECODER_REG_CR69,
EM_DECODER_REG_CR70,
EM_DECODER_REG_CR71,
EM_DECODER_REG_CR72,
EM_DECODER_REG_CR73,
EM_DECODER_REG_CR74,
EM_DECODER_REG_CR75,
EM_DECODER_REG_CR76,
EM_DECODER_REG_CR77,
EM_DECODER_REG_CR78,
EM_DECODER_REG_CR79,
EM_DECODER_REG_CR80,
EM_DECODER_REG_CR81,
EM_DECODER_REG_CR82,
EM_DECODER_REG_CR83,
EM_DECODER_REG_CR84,
EM_DECODER_REG_CR85,
EM_DECODER_REG_CR86,
EM_DECODER_REG_CR87,
EM_DECODER_REG_CR88,
EM_DECODER_REG_CR89,
EM_DECODER_REG_CR90,
EM_DECODER_REG_CR91,
EM_DECODER_REG_CR92,
EM_DECODER_REG_CR93,
EM_DECODER_REG_CR94,
EM_DECODER_REG_CR95,
EM_DECODER_REG_CR96,
EM_DECODER_REG_CR97,
EM_DECODER_REG_CR98,
EM_DECODER_REG_CR99,
EM_DECODER_REG_CR100,
EM_DECODER_REG_CR101,
EM_DECODER_REG_CR102,
EM_DECODER_REG_CR103,
EM_DECODER_REG_CR104,
EM_DECODER_REG_CR105,
EM_DECODER_REG_CR106,
EM_DECODER_REG_CR107,
EM_DECODER_REG_CR108,
EM_DECODER_REG_CR109,
EM_DECODER_REG_CR110,
EM_DECODER_REG_CR111,
EM_DECODER_REG_CR112,
EM_DECODER_REG_CR113,
EM_DECODER_REG_CR114,
EM_DECODER_REG_CR115,
EM_DECODER_REG_CR116,
EM_DECODER_REG_CR117,
EM_DECODER_REG_CR118,
EM_DECODER_REG_CR119,
EM_DECODER_REG_CR120,
EM_DECODER_REG_CR121,
EM_DECODER_REG_CR122,
EM_DECODER_REG_CR123,
EM_DECODER_REG_CR124,
EM_DECODER_REG_CR125,
EM_DECODER_REG_CR126,
EM_DECODER_REG_CR127,
EM_DECODER_REG_PSR,
EM_DECODER_REG_PSR_L,
EM_DECODER_REG_PSR_UM,
EM_DECODER_REG_IP, /* register IP name */
EM_DECODER_EM_REG_LAST,
EM_DECODER_REG_AR_K0 = EM_DECODER_REG_AR0+EM_AR_KR0,
EM_DECODER_REG_AR_K1 = EM_DECODER_REG_AR0+EM_AR_KR1,
EM_DECODER_REG_AR_K2 = EM_DECODER_REG_AR0+EM_AR_KR2,
EM_DECODER_REG_AR_K3 = EM_DECODER_REG_AR0+EM_AR_KR3,
EM_DECODER_REG_AR_K4 = EM_DECODER_REG_AR0+EM_AR_KR4, /* added AR_K4-7 */
EM_DECODER_REG_AR_K5 = EM_DECODER_REG_AR0+EM_AR_KR5,
EM_DECODER_REG_AR_K6 = EM_DECODER_REG_AR0+EM_AR_KR6,
EM_DECODER_REG_AR_K7 = EM_DECODER_REG_AR0+EM_AR_KR7,
EM_DECODER_REG_AR_RSC = EM_DECODER_REG_AR0+EM_AR_RSC,
EM_DECODER_REG_AR_BSP = EM_DECODER_REG_AR0+EM_AR_BSP,
EM_DECODER_REG_AR_BSPSTORE = EM_DECODER_REG_AR0+EM_AR_BSPSTORE,
EM_DECODER_REG_AR_RNAT = EM_DECODER_REG_AR0+EM_AR_RNAT,
EM_DECODER_REG_AR_EFLAG= EM_DECODER_REG_AR0+EM_AR_EFLAG,
EM_DECODER_REG_AR_CSD = EM_DECODER_REG_AR0+EM_AR_CSD,
EM_DECODER_REG_AR_SSD = EM_DECODER_REG_AR0+EM_AR_SSD,
EM_DECODER_REG_AR_CFLG = EM_DECODER_REG_AR0+EM_AR_CFLG,
EM_DECODER_REG_AR_FSR = EM_DECODER_REG_AR0+EM_AR_FSR,
EM_DECODER_REG_AR_FIR = EM_DECODER_REG_AR0+EM_AR_FIR,
EM_DECODER_REG_AR_FDR = EM_DECODER_REG_AR0+EM_AR_FDR,
EM_DECODER_REG_AR_CCV = EM_DECODER_REG_AR0+EM_AR_CCV,
EM_DECODER_REG_AR_UNAT = EM_DECODER_REG_AR0+EM_AR_UNAT,
EM_DECODER_REG_AR_FPSR = EM_DECODER_REG_AR0+EM_AR_FPSR,
EM_DECODER_REG_AR_ITC = EM_DECODER_REG_AR0+EM_AR_ITC,
EM_DECODER_REG_AR_PFS = EM_DECODER_REG_AR0+EM_AR_PFS,
EM_DECODER_REG_AR_LC = EM_DECODER_REG_AR0+EM_AR_LC,
EM_DECODER_REG_AR_EC = EM_DECODER_REG_AR0+EM_AR_EC,
EM_DECODER_REG_CR_DCR = EM_DECODER_REG_CR0+EM_CR_DCR,
EM_DECODER_REG_CR_ITM = EM_DECODER_REG_CR0+EM_CR_ITM,
EM_DECODER_REG_CR_IVA = EM_DECODER_REG_CR0+EM_CR_IVA,
EM_DECODER_REG_CR_PTA = EM_DECODER_REG_CR0+EM_CR_PTA,
EM_DECODER_REG_CR_GPTA = EM_DECODER_REG_CR0+EM_CR_GPTA,
EM_DECODER_REG_CR_IPSR = EM_DECODER_REG_CR0+EM_CR_IPSR,
EM_DECODER_REG_CR_ISR = EM_DECODER_REG_CR0+EM_CR_ISR,
EM_DECODER_REG_CR_IIP = EM_DECODER_REG_CR0+EM_CR_IIP,
EM_DECODER_REG_CR_IFA = EM_DECODER_REG_CR0+EM_CR_IFA,
EM_DECODER_REG_CR_ITIR = EM_DECODER_REG_CR0+EM_CR_ITIR,
EM_DECODER_REG_CR_IIPA = EM_DECODER_REG_CR0+EM_CR_IIPA,
EM_DECODER_REG_CR_IFS = EM_DECODER_REG_CR0+EM_CR_IFS,
EM_DECODER_REG_CR_IIM = EM_DECODER_REG_CR0+EM_CR_IIM,
EM_DECODER_REG_CR_IHA = EM_DECODER_REG_CR0+EM_CR_IHA,
EM_DECODER_REG_CR_LID = EM_DECODER_REG_CR0+EM_CR_LID,
EM_DECODER_REG_CR_IVR = EM_DECODER_REG_CR0+EM_CR_IVR,
EM_DECODER_REG_CR_TPR = EM_DECODER_REG_CR0+EM_CR_TPR,
EM_DECODER_REG_CR_EOI = EM_DECODER_REG_CR0+EM_CR_EOI,
EM_DECODER_REG_CR_IRR0 = EM_DECODER_REG_CR0+EM_CR_IRR0,
EM_DECODER_REG_CR_IRR1 = EM_DECODER_REG_CR0+EM_CR_IRR1,
EM_DECODER_REG_CR_IRR2 = EM_DECODER_REG_CR0+EM_CR_IRR2,
EM_DECODER_REG_CR_IRR3 = EM_DECODER_REG_CR0+EM_CR_IRR3,
EM_DECODER_REG_CR_ITV = EM_DECODER_REG_CR0+EM_CR_ITV,
EM_DECODER_REG_CR_PMV = EM_DECODER_REG_CR0+EM_CR_PMV,
EM_DECODER_REG_CR_LRR0 = EM_DECODER_REG_CR0+EM_CR_LRR0,
EM_DECODER_REG_CR_LRR1 = EM_DECODER_REG_CR0+EM_CR_LRR1,
EM_DECODER_REG_CR_CMCV = EM_DECODER_REG_CR0+EM_CR_CMCV,
/************************************************************/
EM_DECODER_REG_LAST
} EM_Decoder_Reg_Name;
typedef struct EM_decoder_reg_info
{
int valid;
EM_Decoder_Reg_Type type;
EM_Decoder_Reg_Name name;
long value;
} EM_Decoder_Reg_Info;
typedef enum EM_DECODER_regfile_name
{
EM_DECODER_NO_REGFILE = 0,
EM_DECODER_REGFILE_PMC,
EM_DECODER_REGFILE_PMD,
EM_DECODER_REGFILE_PKR,
EM_DECODER_REGFILE_RR,
EM_DECODER_REGFILE_IBR,
EM_DECODER_REGFILE_DBR,
EM_DECODER_REGFILE_ITR,
EM_DECODER_REGFILE_DTR,
EM_DECODER_REGFILE_MSR,
EM_DECODER_REGFILE_CPUID,
EM_DECODER_REGFILE_LAST
} EM_Decoder_Regfile_Name;
typedef enum EM_decoder_operand_2nd_role
{
EM_DECODER_OPER_2ND_ROLE_NONE = 0,
EM_DECODER_OPER_2ND_ROLE_SRC,
EM_DECODER_OPER_2ND_ROLE_DST
} EM_Decoder_Operand_2nd_Role;
typedef enum EM_decoder_oper_size
{
EM_DECODER_OPER_NO_SIZE = 0,
EM_DECODER_OPER_SIZE_1 = 1,
EM_DECODER_OPER_SIZE_2 = 2,
EM_DECODER_OPER_SIZE_4 = 4,
EM_DECODER_OPER_SIZE_8 = 8,
EM_DECODER_OPER_SIZE_10 = 10,
EM_DECODER_OPER_SIZE_16 = 16,
EM_DECODER_OPER_SIZE_20 = 20,
EM_DECODER_OPER_SIZE_22 = 22,
EM_DECODER_OPER_SIZE_24 = 24,
EM_DECODER_OPER_SIZE_32 = 32,
EM_DECODER_OPER_SIZE_64 = 64
} EM_Decoder_Oper_Size;
typedef enum EM_decoder_imm_type
{
EM_DECODER_IMM_NONE,
EM_DECODER_IMM_SIGNED,
EM_DECODER_IMM_UNSIGNED,
EM_DECODER_IMM_FCLASS,
EM_DECODER_IMM_MUX1,
EM_DECODER_IMM_LAST
} EM_Decoder_Imm_Type;
typedef enum EM_decoder_slot
{
EM_DECODER_SLOT_0 = 0,
EM_DECODER_SLOT_1 = 1,
EM_DECODER_SLOT_2 = 2,
EM_DECODER_SLOT_LAST = 2
} EM_Decoder_Slot;
/***** EM_decoder Structure Defenition ****/
typedef struct EM_decoder_modifiers_s
{
EM_cmp_type_t cmp_type;
EM_cmp_rel_t cmp_rel;
EM_branch_type_t branch_type;
EM_branch_hint_t branch_hint;
EM_fp_precision_t fp_precision;
EM_fp_status_t fp_status;
EM_memory_access_hint_t mem_access_hint;
} EM_Decoder_modifiers_t;
typedef struct EM_decoder_oper_static_s
{
Operand_role_t role;
Operand_type_t type;
unsigned long flags;
} EM_Decoder_oper_static_t;
#define EM_DECODER_MAX_EXP_DST (2)
#define EM_DECODER_MAX_EXP_SRC (5)
#define EM_DECODER_MAX_IMP_DST (8)
#define EM_DECODER_MAX_IMP_SRC (8)
typedef struct EM_decoder_static_info_s
{
Mnemonic_t mnemonic;
Template_role_t template_role;
EM_Decoder_oper_static_t explicit_dst[EM_DECODER_MAX_EXP_DST];
EM_Decoder_oper_static_t explicit_src[EM_DECODER_MAX_EXP_SRC];
EM_Decoder_imp_oper_t implicit_dst[EM_DECODER_MAX_IMP_DST];
EM_Decoder_imp_oper_t implicit_src[EM_DECODER_MAX_IMP_SRC];
EM_Decoder_modifiers_t modifiers;
Flags_t flags;
} EM_Decoder_static_info_t;
extern const EM_Decoder_static_info_t em_decoder_static_info[];
typedef struct EM_decoder_regfile_info
{
EM_Decoder_Regfile_Name name;
EM_Decoder_Reg_Info index;
} EM_Decoder_Regfile_Info;
typedef struct EM_decoder_imm_info
{
EM_Decoder_Imm_Type imm_type;
unsigned int size;
U64 val64;
} EM_Decoder_Imm_Info;
typedef struct EM_decoder_mem_info
{
EM_Decoder_Reg_Info mem_base;
EM_Decoder_Oper_Size size;
} EM_Decoder_Mem_Info;
typedef struct em_decoder_em_bundle_info
{
EM_template_t b_template;
unsigned long flags;
} EM_Decoder_EM_Bundle_Info;
typedef struct em_decoder_em_info
{
EM_Decoder_EM_Bundle_Info em_bundle_info;
EM_Decoder_Slot slot_no;
Template_role_t eut;
unsigned long em_flags;
} EM_Decoder_EM_Info;
typedef struct EM_decoder_inst_static_info
{
void * client_info;
const EM_Decoder_static_info_t *static_info;
unsigned long flags;
} EM_Decoder_Inst_Static_Info;
typedef struct EM_decoder_operand_info
{
EM_Decoder_Operand_Type type;
EM_Decoder_Regfile_Info regfile_info;
EM_Decoder_Reg_Info reg_info;
EM_Decoder_Mem_Info mem_info;
EM_Decoder_Imm_Info imm_info;
long ip_relative_offset;
unsigned long oper_flags;
} EM_Decoder_Operand_Info;
typedef struct em_decoder_info
{
EM_Decoder_Inst_Id inst;
EM_Decoder_Reg_Info pred;
EM_Decoder_Operand_Info src1;
EM_Decoder_Operand_Info src2;
EM_Decoder_Operand_Info src3;
EM_Decoder_Operand_Info src4;
EM_Decoder_Operand_Info src5;
EM_Decoder_Operand_Info dst1;
EM_Decoder_Operand_Info dst2;
EM_Decoder_EM_Info EM_info;
void * client_info;
unsigned long flags;
unsigned char size;
const EM_Decoder_static_info_t *static_info;
} EM_Decoder_Info;
typedef struct em_decoder_bundle_info
{
unsigned int inst_num;
EM_Decoder_EM_Bundle_Info em_bundle_info;
EM_Decoder_Err error[3];
EM_Decoder_Info inst_info[3];
} EM_Decoder_Bundle_Info;
typedef int EM_Decoder_Id;
/***********************************************/
/*** Setup flags ***/
/***********************************************/
#define EM_DECODER_FLAG_NO_MEMSET 0X00000001
extern const U32 em_decoder_bundle_size;
EM_Decoder_Id em_decoder_open(void);
EM_Decoder_Err em_decoder_associate_one(const EM_Decoder_Id id,
const EM_Decoder_Inst_Id inst,
const void * client_info);
EM_Decoder_Err em_decoder_associate_check(const EM_Decoder_Id id,
EM_Decoder_Inst_Id * inst);
EM_Decoder_Err em_decoder_setenv(const EM_Decoder_Id,
const EM_Decoder_Machine_Type,
const EM_Decoder_Machine_Mode);
EM_Decoder_Err em_decoder_setup(const EM_Decoder_Id,
const EM_Decoder_Machine_Type,
const EM_Decoder_Machine_Mode,
unsigned long flags);
EM_Decoder_Err em_decoder_close(const EM_Decoder_Id);
EM_Decoder_Err em_decoder_decode(const EM_Decoder_Id id,
const unsigned char * code,
const int max_code_size,
const EM_IL location,
EM_Decoder_Info * decoder_info);
EM_Decoder_Err em_decoder_inst_static_info(const EM_Decoder_Id,
const EM_Decoder_Inst_Id,
EM_Decoder_Inst_Static_Info *);
const char* em_decoder_ver_str(void);
void em_decoder_get_version(EM_library_version_t * dec_version);
const char* em_decoder_err_msg(EM_Decoder_Err error);
EM_Decoder_Err em_decoder_decode_bundle(const EM_Decoder_Id id,
const unsigned char * code,
const int max_size,
EM_Decoder_Bundle_Info * bundle_info);
/********************** GET next IL *************************/
#define EM_DECODER_NEXT(IL, decoder_info) \
{ \
U32 rem_size; \
int slot_no = EM_IL_GET_SLOT_NO(IL), \
size = (decoder_info)->size; \
switch (slot_no) \
{ \
case 0: \
break; \
case 1: \
if (size < 2) \
break; /*** else fall-through ***/ \
case 2: \
size = EM_BUNDLE_SIZE - slot_no; \
} \
IEL_CONVERT1(rem_size, size); \
IEL_ADDU(IL, IL, rem_size); \
}
#define EM_DECODER_BUNDLE_NEXT(addr) \
{ \
IEL_ADDU(addr, addr, em_decoder_bundle_size); \
}
#define EM_DECODER_ERROR_IS_FATAL(_Err) \
((_Err) >= EM_DECODER_FIRST_FATAL_ERROR)
#define EM_DECODER_ERROR_IS_INST_FATAL(_Err) \
(((_Err) >= EM_DECODER_FIRST_FATAL_INST_ERROR) && ((_Err) < EM_DECODER_FIRST_FATAL_ERROR))
/************* EM Instruction Flags Related Macros ***************/
/*** EM_decoder and static infos flags ***/
/* Flags that copied directly from EMDB */
#define EM_DECODER_BIT_PREDICATE EM_FLAG_PRED /* The instruction can get pred */
#define EM_DECODER_BIT_PRIVILEGED EM_FLAG_PRIVILEGED /* The instruction is privileged */
#define EM_DECODER_BIT_LMEM EM_FLAG_LMEM /* The instuction is a load inst */
#define EM_DECODER_BIT_SMEM EM_FLAG_SMEM /* The instruction is a store */
#define EM_DECODER_BIT_CHECK_BASE_EQ_DST EM_FLAG_CHECK_BASE_EQ_DST /* Base value must differ from destination's */
#define EM_DECODER_BIT_GROUP_FIRST EM_FLAG_FIRST_IN_INSTRUCTION_GROUP /* Instruction must be the first in instruction group */
#define EM_DECODER_BIT_GROUP_LAST EM_FLAG_LAST_IN_INSTRUCTION_GROUP /* Instruction must be the last in instruction group */
#define EM_DECODER_BIT_CHECK_SAME_DSTS EM_FLAG_CHECK_SAME_DSTS /* Two destinations should have different values */
#define EM_DECODER_BIT_SLOT2_ONLY EM_FLAG_SLOT2_ONLY /* The instruction is allowed in the last slot of bundle */
#define EM_DECODER_BIT_TWO_SLOT EM_FLAG_TWO_SLOT /* The instruction is long (2 slots length) */
#define EM_DECODER_BIT_OK_IN_MLX EM_FLAG_OK_IN_MLX
#define EM_DECODER_BIT_CHECK_EVEN_ODD_FREGS EM_FLAG_CHECK_EVEN_ODD_FREGS
#define EM_DECODER_BIT_CTYPE_UNC EM_FLAG_CTYPE_UNC /* If two destinations are equal the instruction
allways causes illegal operation fault */
#define EM_DECODER_BIT_UNUSED_HINT_ALIAS EM_FLAG_UNUSED_HINT_ALIAS
#define EM_DECODER_BIT_ILLEGAL_OP EM_FLAG_ILLEGAL_OP
#define EM_DECODER_BIT_IGNORED_OP EM_FLAG_IGNORED_OP
#define EM_DECODER_BIT_ENDS_GROUP EM_FLAG_ENDS_INSTRUCTION_GROUP
/* Others */
#define EM_DECODER_BIT_SPECULATION (EMDB_LAST_FLAG << 1) /* Speculative form of instruction */
#define EM_DECODER_BIT_POSTINCREMENT (EMDB_LAST_FLAG << 2) /* Post increment form of instruction */
#define EM_DECODER_BIT_FALSE_PRED_EXEC (EMDB_LAST_FLAG << 3) /* Instruction executed when predicate is false */
#define EM_DECODER_BIT_BR_HINT (EMDB_LAST_FLAG << 4) /* Branch-hint form of instruction */
#define EM_DECODER_BIT_BR (EMDB_LAST_FLAG << 5) /* Branch instruction */
#define EM_DECODER_BIT_ADV_LOAD (EMDB_LAST_FLAG << 6) /* Instruction is an advanced or speculative advanced load */
#define EM_DECODER_BIT_CONTROL_TRANSFER (EMDB_LAST_FLAG << 7) /* Instruction violates sequential control flow */
#define EM_DECODER_BIT_UNC_ILLEGAL_FAULT (EMDB_LAST_FLAG << 8) /* Illegal opcode causes illegal operation fault
undependent on predicate value */
/* Flags that depend on the current bundle encoding */
/* in em_flags: */
#define EM_DECODER_BIT_CYCLE_BREAK 0x10000 /*Inst is last in its group */
#define EM_DECODER_BIT_LAST_INST 0x20000 /*Last instruction in bundle */
/* Static flags (depend only on inst id) */
#define EM_DECODER_BIT_LONG_INST 0x40000 /* 2 slots Inst */
/* in em_bundle_info flags */
#define EM_DECODER_BIT_BUNDLE_STOP 0x80000 /*Stop bit is set in bundle*/
#define EM_DECODER_PREDICATE(di) (EM_DECODER_BIT_PREDICATE & ((di)->flags))
#define EM_DECODER_PRIVILEGED(di) (EM_DECODER_BIT_PRIVILEGED & ((di)->flags))
#define EM_DECODER_LMEM(di) (EM_DECODER_BIT_LMEM & ((di)->flags))
#define EM_DECODER_SMEM(di) (EM_DECODER_BIT_SMEM & ((di)->flags))
#define EM_DECODER_CHECK_BASE_EQ_DST(di) (EM_DECODER_BIT_CHECK_BASE_EQ_DST & ((di)->flags))
#define EM_DECODER_CHECK_SPECULATION(di) (EM_DECODER_BIT_SPECULATION & ((di)->flags))
#define EM_DECODER_CHECK_POSTINCREMENT(di) (EM_DECODER_BIT_POSTINCREMENT & ((di)->flags))
#define EM_DECODER_CHECK_FALSE_PRED_EXEC(di) (EM_DECODER_BIT_FALSE_PRED_EXEC & ((di)->flags))
#define EM_DECODER_CHECK_BR_HINT(di) (EM_DECODER_BIT_BR_HINT & ((di)->flags))
#define EM_DECODER_CHECK_BR(di) (EM_DECODER_BIT_BR & ((di)->flags))
#define EM_DECODER_CHECK_GROUP_FIRST(di) (EM_DECODER_BIT_GROUP_FIRST & ((di)->flags))
#define EM_DECODER_CHECK_GROUP_LAST(di) (EM_DECODER_BIT_GROUP_LAST & ((di)->flags))
#define EM_DECODER_CHECK_SAME_DSTS(di) (EM_DECODER_BIT_CHECK_SAME_DSTS & ((di)->flags))
#define EM_DECODER_CHECK_SLOT2_ONLY(di) (EM_DECODER_BIT_SLOT2_ONLY & ((di)->flags))
#define EM_DECODER_CHECK_TWO_SLOT(di) (EM_DECODER_BIT_TWO_SLOT & ((di)->flags))
#define EM_DECODER_CHECK_ADV_LOAD(di) (EM_DECODER_BIT_ADV_LOAD & ((di)->flags))
#define EM_DECODER_CHECK_CONTROL_TRANSFER(di) (EM_DECODER_BIT_CONTROL_TRANSFER & ((di)->flags))
#define EM_DECODER_CHECK_UNC_ILLEGAL_FAULT(di) (EM_DECODER_BIT_CTYPE_UNC & ((di)->flags))
#define EM_DECODER_CHECK_OK_IN_MLX(di) (EM_DECODER_BIT_OK_IN_MLX & ((di)->flags))
#define EM_DECODER_CHECK_UNUSED_HINT_ALIAS(di) (EM_DECODER_BIT_UNUSED_HINT_ALIAS & ((di)->flags))
#define EM_DECODER_CHECK_ILLEGAL_OP(di) (EM_DECODER_BIT_ILLEGAL_OP & ((di)->flags))
#define EM_DECODER_CHECK_IGNORED_OP(di) (EM_DECODER_BIT_IGNORED_OP & ((di)->flags))
#define EM_DECODER_CHECK_ENDS_GROUP(di) (EM_DECODER_BIT_ENDS_GROUP & ((di)->flags))
#define EM_DECODER_LONG_INST(di) \
(EM_DECODER_BIT_LONG_INST & (((di)->EM_info).em_flags))
#define EM_DECODER_LAST_INST(di) \
(EM_DECODER_BIT_LAST_INST & (((di)->EM_info).em_flags))
#define EM_DECODER_CYCLE_BREAK(di) \
(EM_DECODER_BIT_CYCLE_BREAK & (((di)->EM_info).em_flags))
#define EM_DECODER_BUNDLE_STOP(di) \
(EM_DECODER_BIT_BUNDLE_STOP & \
(((di)->EM_info).em_bundle_info.flags))
/************** Operand Related macros ****************/
#define EM_DECODER_OPER_2ND_ROLE_SRC_BIT 0x00000001 /* Oper second role: src */
#define EM_DECODER_OPER_2ND_ROLE_DST_BIT 0x00000002 /* Oper second role: dest */
#define EM_DECODER_OPER_IMM_IREG_BIT 0x00000040 /* Operand type is IREG_NUM */
#define EM_DECODER_OPER_IMM_FREG_BIT 0x00000080 /* Operand type is FREG_NUM */
#define EM_DECODER_OPER_2ND_ROLE_SRC(oi) \
(((oi)->oper_flags) & EM_DECODER_OPER_2ND_ROLE_SRC_BIT)
#define EM_DECODER_OPER_2ND_ROLE_DST(oi) \
(((oi)->oper_flags) & EM_DECODER_OPER_2ND_ROLE_DST_BIT)
#define EM_DECODER_OPER_NOT_TRUE_SRC(oi) \
(((oi)->oper_flags) & EM_DECODER_OPER_NOT_TRUE_SRC_BIT)
#define EM_DECODER_OPER_IMP_ENCODED(oi) \
(((oi)->oper_flags) & EM_DECODER_OPER_IMP_ENCODED_BIT)
#define EM_DECODER_OPER_IMM_REG(oi) \
(((oi)->oper_flags) & (EM_DECODER_OPER_IMM_IREG_BIT | \
EM_DECODER_OPER_IMM_FREG_BIT))
#define EM_DECODER_OPER_IMM_IREG(oi) \
(((oi)->oper_flags) & EM_DECODER_OPER_IMM_IREG_BIT)
#define EM_DECODER_OPER_IMM_FREG(oi) \
(((oi)->oper_flags) & EM_DECODER_OPER_IMM_FREG_BIT)
/************* EM_decoder Static Info Related macros ************/
/****** Macros receive pointer to modifiers ******/
#define EM_DECODER_MODIFIERS_CMP_TYPE(Mo) \
((Mo)->cmp_type)
#define EM_DECODER_MODIFIERS_CMP_REL(Mo) \
((Mo)->cmp_rel)
#define EM_DECODER_MODIFIERS_BRANCH_TYPE(Mo) \
((Mo)->branch_type)
#define EM_DECODER_MODIFIERS_BRANCH_HINT(Mo) \
((Mo)->branch_hint)
#define EM_DECODER_MODIFIERS_FP_PRECISION(Mo) \
((Mo)->fp_precision)
#define EM_DECODER_MODIFIERS_FP_STATUS(Mo) \
((Mo)->fp_status)
#define EM_DECODER_MODIFIERS_MEMORY_ACCESS_HINT(Mo) \
((Mo)->mem_access_hint)
/****** Macros receive operand flags value ******/
#define EM_DECODER_OPER_FLAGS_2ND_ROLE_SRC(of) \
((of) & EM_DECODER_OPER_2ND_ROLE_SRC_BIT)
#define EM_DECODER_OPER_FLAGS_2ND_ROLE_DST(of) \
((of) & EM_DECODER_OPER_2ND_ROLE_DST_BIT)
#define EM_DECODER_OPER_FLAGS_IMM_REG(of) \
((of) & (EM_DECODER_OPER_IMM_IREG_BIT | \
EM_DECODER_OPER_IMM_FREG_BIT))
#define EM_DECODER_OPER_FLAGS_IMM_IREG(of) \
((of) & EM_DECODER_OPER_IMM_IREG_BIT)
#define EM_DECODER_OPER_FLAGS_IMM_FREG(of) \
((of) & EM_DECODER_OPER_IMM_FREG_BIT)
/****** Macros receive pointer to operand ******/
#define EM_DECODER_OPER_STAT_2ND_ROLE_SRC(oi) \
EM_DECODER_OPER_FLAGS_2ND_ROLE_SRC((oi)->flags)
#define EM_DECODER_OPER_STAT_2ND_ROLE_DST(oi) \
EM_DECODER_OPER_FLAGS_2ND_ROLE_DST((oi)->flags)
#define EM_DECODER_OPER_STAT_IMM_REG(oi) \
EM_DECODER_OPER_FLAGS_IMM_REG((oi)->flags)
#define EM_DECODER_OPER_STAT_IMM_BREG(oi) \
EM_DECODER_OPER_FLAGS_IMM_BREG((oi)->flags)
#define EM_DECODER_OPER_STAT_IMM_IREG(oi) \
EM_DECODER_OPER_FLAGS_IMM_IREG((oi)->flags)
#define EM_DECODER_OPER_STAT_IMM_FREG(oi) \
EM_DECODER_OPER_FLAGS_IMM_FREG((oi)->flags)
#define EM_DECODER_OPER_ROLE(oi) \
((oi)->role)
#define EM_DECODER_OPER_TYPE(oi) \
((oi)->type)
#define EM_DECODER_OPER_FLAGS(oi) \
((oi)->flags)
/****** Macros receive instruction flags value ******/
#define EM_DECODER_FLAGS_FLAG_PRED(if) \
((if) & EM_DECODER_BIT_PREDICATE)
#define EM_DECODER_FLAGS_FLAG_PRIVILEGED(if) \
((if) & EM_DECODER_BIT_PRIVILEGED)
#define EM_DECODER_FLAGS_FLAG_LMEM(if) \
((if) & EM_DECODER_BIT_LMEM)
#define EM_DECODER_FLAGS_FLAG_SMEM(if) \
((if) & EM_DECODER_BIT_SMEM)
#define EM_DECODER_FLAGS_FLAG_CHECK_BASE_EQ_DST(if) \
((if) & EM_DECODER_BIT_CHECK_BASE_EQ_DST)
#define EM_DECODER_FLAGS_FLAG_SPECULATION(if) \
((if) & EM_DECODER_BIT_SPECULATION)
#define EM_DECODER_FLAGS_FLAG_POSTINCREMENT(if) \
((if) & EM_DECODER_BIT_POSTINCREMENT)
#define EM_DECODER_FLAGS_FLAG_FALSE_PRED_EXEC(if) \
((if) & EM_DECODER_BIT_FALSE_PRED_EXEC)
#define EM_DECODER_FLAGS_FLAG_BR_HINT(if) \
((if) & EM_DECODER_BIT_BR_HINT)
#define EM_DECODER_FLAGS_FLAG_BR(if) \
((if) & EM_DECODER_BIT_BR)
#define EM_DECODER_FLAGS_FLAG_ADV_LOAD(if) \
((if) & EM_DECODER_CHECK_ADV_LOAD)
#define EM_DECODER_FLAGS_FLAG_GROUP_FIRST(if) \
((if) & EM_DECODER_BIT_GROUP_FIRST)
#define EM_DECODER_FLAGS_FLAG_GROUP_LAST(if) \
((if) & EM_DECODER_BIT_GROUP_LAST)
#define EM_DECODER_FLAGS_FLAG_CHECK_SAME_DSTS(if) \
((if) & EM_DECODER_BIT_CHECK_SAME_DSTS)
#define EM_DECODER_FLAGS_FLAG_CONTROL_TRANSFER(if) \
((if) & EM_DECODER_BIT_CONTROL_TRANSFER)
#define EM_DECODER_FLAGS_FLAG_UNUSED_HINT_ALIAS(if) \
((if) & EM_DECODER_BIT_UNUSED_HINT_ALIAS)
#define EM_DECODER_FLAGS_FLAG_ILLEGAL_OP(if) \
((if) & EM_DECODER_BIT_ILLEGAL_OP)
#define EM_DECODER_FLAGS_FLAG_IGNORED_OP(if) \
((if) & EM_DECODER_BIT_IGNORED_OP)
#define EM_DECODER_FLAGS_FLAG_ENDS_GROUP(if) \
((if) & EM_DECODER_BIT_ENDS_GROUP)
/****** Macros receive pointer to EM_decoder static info ******/
#define EM_DECODER_STATIC_MNEMONIC(si) \
((si)->mnemonic)
#define EM_DECODER_STATIC_TEMPLATE_ROLE(si) \
((si)->template_role)
#define EM_DECODER_STATIC_EXP_DST_ROLE(si, n) \
EM_DECODER_OPER_ROLE(((si)->explicit_dst) + (n))
#define EM_DECODER_STATIC_EXP_DST_TYPE(si, n) \
EM_DECODER_OPER_TYPE(((si)->explicit_dst) + (n))
#define EM_DECODER_STATIC_EXP_DST_FLAGS(si, n) \
EM_DECODER_OPER_FLAGS(((si)->explicit_dst) + (n))
#define EM_DECODER_STATIC_EXP_SRC_ROLE(si, n) \
EM_DECODER_OPER_ROLE(((si)->explicit_src) + (n))
#define EM_DECODER_STATIC_EXP_SRC_TYPE(si, n) \
EM_DECODER_OPER_TYPE(((si)->explicit_src) + (n))
#define EM_DECODER_STATIC_EXP_SRC_FLAGS(si, n) \
EM_DECODER_OPER_FLAGS(((si)->explicit_src) + (n))
#define EM_DECODER_STATIC_IMP_DST(si, n) \
((si)->implicit_dst[(n)])
#define EM_DECODER_STATIC_IMP_SRC(si, n) \
((si)->implicit_src[(n)])
#define EM_DECODER_STATIC_CMP_TYPE(si) \
EM_DECODER_MODIFIERS_CMP_TYPE(&((si)->modifiers))
#define EM_DECODER_STATIC_CMP_REL(si) \
EM_DECODER_MODIFIERS_CMP_REL(&((si)->modifiers))
#define EM_DECODER_STATIC_BRANCH_TYPE(si) \
EM_DECODER_MODIFIERS_BRANCH_TYPE(&((si)->modifiers))
#define EM_DECODER_STATIC_BRANCH_HINT(si) \
EM_DECODER_MODIFIERS_BRANCH_HINT(&((si)->modifiers))
#define EM_DECODER_STATIC_FP_PRECISION(si) \
EM_DECODER_MODIFIERS_FP_PRECISION(&((si)->modifiers))
#define EM_DECODER_STATIC_FP_STATUS(si) \
EM_DECODER_MODIFIERS_FP_STATUS(&((si)->modifiers))
#define EM_DECODER_STATIC_MEMORY_ACCESS_HINT(si) \
EM_DECODER_MODIFIERS_MEMORY_ACCESS_HINT(&((si)->modifiers))
#define EM_DECODER_STATIC_FLAGS(si) \
((si)->flags)
#define EM_DECODER_STATIC_FLAG_PRED(si) \
EM_DECODER_FLAGS_FLAG_PRED((si)->flags)
#define EM_DECODER_STATIC_FLAG_PRIVILEGED(si) \
EM_DECODER_FLAGS_FLAG_PRIVILEGED((si)->flags)
#define EM_DECODER_STATIC_FLAG_LMEM(si) \
EM_DECODER_FLAGS_FLAG_LMEM((si)->flags)
#define EM_DECODER_STATIC_FLAG_SMEM(si) \
EM_DECODER_FLAGS_FLAG_SMEM((si)->flags)
#define EM_DECODER_STATIC_FLAG_CHECK_BASE_EQ_DST(si) \
EM_DECODER_FLAGS_FLAG_CHECK_BASE_EQ_DST((si)->flags)
#define EM_DECODER_STATIC_FLAG_SPECULATION(si) \
EM_DECODER_FLAGS_FLAG_SPECULATION((si)->flags)
#define EM_DECODER_STATIC_FLAG_POSTINCREMENT(si) \
EM_DECODER_FLAGS_FLAG_POSTINCREMENT((si)->flags)
#define EM_DECODER_STATIC_FLAG_FALSE_PRED_EXEC(si) \
EM_DECODER_FLAGS_FLAG_FALSE_PRED_EXEC((si)->flags)
#define EM_DECODER_STATIC_FLAG_BR_HINT(si) \
EM_DECODER_FLAGS_FLAG_BR_HINT((si)->flags)
#define EM_DECODER_STATIC_FLAG_BR(si) \
EM_DECODER_FLAGS_FLAG_BR((si)->flags)
#define EM_DECODER_STATIC_FLAG_GROUP_FIRST(si) \
EM_DECODER_FLAGS_FLAG_GROUP_FIRST((si)->flags)
#define EM_DECODER_STATIC_FLAG_GROUP_LAST(si) \
EM_DECODER_FLAGS_FLAG_GROUP_LAST((si)->flags)
#define EM_DECODER_STATIC_FLAG_CHECK_SAME_DSTS(si) \
EM_DECODER_FLAGS_FLAG_CHECK_SAME_DSTS((si)->flags)
#define EM_DECODER_STATIC_FLAG_CONTROL_TRANSFER(si) \
EM_DECODER_FLAGS_FLAG_CONTROL_TRANSFER((si)->flags)
#ifdef __cplusplus
}
#endif
#endif /*** EM_DECODER_H ***/