|  | //===- subzero/src/IceInstX8632.def - X-macros for x86-32 insts -*- C++ -*-===// | 
|  | // | 
|  | //                        The Subzero Code Generator | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file defines properties of lowered x86-32 instructions in the | 
|  | // form of x-macros. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef SUBZERO_SRC_ICEINSTX8632_DEF | 
|  | #define SUBZERO_SRC_ICEINSTX8632_DEF | 
|  |  | 
|  | // NOTE: esp is not considered isInt, to avoid register allocating it. | 
|  | #define REGX8632_GPR_TABLE                                              \ | 
|  | /* val, encode, name, name16, name8, scratch, preserved, stackptr,    \ | 
|  | frameptr, isI8, isInt, isFP */                                     \ | 
|  | X(Reg_eax, = 0,             "eax",  "ax", "al", 1, 0, 0, 0, 1, 1, 0)  \ | 
|  | X(Reg_ecx, = Reg_eax + 1,   "ecx",  "cx", "cl", 1, 0, 0, 0, 1, 1, 0)  \ | 
|  | X(Reg_edx, = Reg_eax + 2,   "edx",  "dx", "dl", 1, 0, 0, 0, 1, 1, 0)  \ | 
|  | X(Reg_ebx, = Reg_eax + 3,   "ebx",  "bx", "bl", 0, 1, 0, 0, 1, 1, 0)  \ | 
|  | X(Reg_esp, = Reg_eax + 4,   "esp",  "sp", ""  , 0, 0, 1, 0, 0, 0, 0)  \ | 
|  | X(Reg_ebp, = Reg_eax + 5,   "ebp",  "bp", ""  , 0, 1, 0, 1, 0, 1, 0)  \ | 
|  | X(Reg_esi, = Reg_eax + 6,   "esi",  "si", ""  , 0, 1, 0, 0, 0, 1, 0)  \ | 
|  | X(Reg_edi, = Reg_eax + 7,   "edi",  "di", ""  , 0, 1, 0, 0, 0, 1, 0) | 
|  |  | 
|  | #define REGX8632_XMM_TABLE                                              \ | 
|  | X(Reg_xmm0, = 0,            "xmm0", ""  , ""  , 1, 0, 0, 0, 0, 0, 1)  \ | 
|  | X(Reg_xmm1, = Reg_xmm0 + 1, "xmm1", ""  , ""  , 1, 0, 0, 0, 0, 0, 1)  \ | 
|  | X(Reg_xmm2, = Reg_xmm0 + 2, "xmm2", ""  , ""  , 1, 0, 0, 0, 0, 0, 1)  \ | 
|  | X(Reg_xmm3, = Reg_xmm0 + 3, "xmm3", ""  , ""  , 1, 0, 0, 0, 0, 0, 1)  \ | 
|  | X(Reg_xmm4, = Reg_xmm0 + 4, "xmm4", ""  , ""  , 1, 0, 0, 0, 0, 0, 1)  \ | 
|  | X(Reg_xmm5, = Reg_xmm0 + 5, "xmm5", ""  , ""  , 1, 0, 0, 0, 0, 0, 1)  \ | 
|  | X(Reg_xmm6, = Reg_xmm0 + 6, "xmm6", ""  , ""  , 1, 0, 0, 0, 0, 0, 1)  \ | 
|  | X(Reg_xmm7, = Reg_xmm0 + 7, "xmm7", ""  , ""  , 1, 0, 0, 0, 0, 0, 1)  \ | 
|  | //#define X(val, encode, name, name16, name8, scratch, preserved, stackptr, | 
|  | //          frameptr, isI8, isInt, isFP) | 
|  |  | 
|  | // We also provide a combined table, so that there is a namespace where | 
|  | // all of the registers are considered and have distinct numberings. | 
|  | // This is in contrast to the above, where the "encode" is based on how | 
|  | // the register numbers will be encoded in binaries and values can overlap. | 
|  | // Note that the isI8 attributed of Reg_ah is not set.  In general we | 
|  | // don't want the register allocator choosing Reg_ah, in particular | 
|  | // for lowering insertelement to pinsrb where internally we use an | 
|  | // 8-bit operand but externally pinsrb uses a 32-bit register, in | 
|  | // which Reg_ah doesn't map to eax. | 
|  | #define REGX8632_TABLE                                                  \ | 
|  | /* val, encode, name, name16, name8, scratch, preserved, stackptr,    \ | 
|  | frameptr, isI8, isInt, isFP */                                     \ | 
|  | REGX8632_GPR_TABLE                                                    \ | 
|  | X(Reg_ah,  = Reg_eax + 4,   "???",  ""  , "ah", 0, 0, 0, 0, 0, 0, 0)  \ | 
|  | REGX8632_XMM_TABLE | 
|  | //#define X(val, encode, name, name16, name8, scratch, preserved, stackptr, | 
|  | //          frameptr, isI8, isInt, isFP) | 
|  |  | 
|  | #define REGX8632_TABLE_BOUNDS                                           \ | 
|  | /* val, init */                                                       \ | 
|  | X(Reg_GPR_First, = Reg_eax)                                           \ | 
|  | X(Reg_GPR_Last,  = Reg_edi)                                           \ | 
|  | X(Reg_XMM_First, = Reg_xmm0)                                          \ | 
|  | X(Reg_XMM_Last,  = Reg_xmm7)                                          \ | 
|  | //define X(val, init) | 
|  |  | 
|  | // We also need the encodings for the Byte registers (other info overlaps | 
|  | // what is in the REGX8632_GPR_TABLE). | 
|  | #define REGX8632_BYTEREG_TABLE                                          \ | 
|  | /* val, encode */                                                     \ | 
|  | X(Reg_al, = 0) \ | 
|  | X(Reg_cl, = 1) \ | 
|  | X(Reg_dl, = 2) \ | 
|  | X(Reg_bl, = 3) \ | 
|  | X(Reg_ah, = 4) | 
|  | //#define X(val, encode) | 
|  |  | 
|  | // X86 segment registers. | 
|  | #define SEG_REGX8632_TABLE         \ | 
|  | /* enum value, name, prefix */   \ | 
|  | X(SegReg_CS, "cs", 0x2E)         \ | 
|  | X(SegReg_DS, "ds", 0x3E)         \ | 
|  | X(SegReg_ES, "es", 0x26)         \ | 
|  | X(SegReg_SS, "ss", 0x36)         \ | 
|  | X(SegReg_FS, "fs", 0x64)         \ | 
|  | X(SegReg_GS, "gs", 0x65)         \ | 
|  | //#define X(val, name, prefix) | 
|  |  | 
|  | // X87 ST(n) registers. | 
|  | #define X87ST_REGX8632_TABLE         \ | 
|  | /* enum value, encode, name */     \ | 
|  | X(X87ST_First, = 0, "st(0)")       \ | 
|  | X(X87ST_0, = 0, "st(0)")           \ | 
|  | X(X87ST_1, = 1, "st(1)")           \ | 
|  | X(X87ST_2, = 2, "st(2)")           \ | 
|  | X(X87ST_3, = 3, "st(3)")           \ | 
|  | X(X87ST_4, = 4, "st(4)")           \ | 
|  | X(X87ST_5, = 5, "st(5)")           \ | 
|  | X(X87ST_6, = 6, "st(6)")           \ | 
|  | X(X87ST_7, = 7, "st(7)")           \ | 
|  | X(X87ST_Last, = 7, "st(7)")        \ | 
|  | //#define X(val, encode, name) | 
|  |  | 
|  | #define ICEINSTX8632BR_TABLE   \ | 
|  | /* enum value, encode, opposite, dump, emit */ \ | 
|  | X(Br_o,  = 0,       Br_no,    "o",  "jo")                \ | 
|  | X(Br_no, = 1,       Br_o,     "no", "jno")               \ | 
|  | X(Br_b,  = 2,       Br_ae,    "b",  "jb")                \ | 
|  | X(Br_ae, = 3,       Br_b,     "ae", "jae")               \ | 
|  | X(Br_e,  = 4,       Br_ne,    "e",  "je")                \ | 
|  | X(Br_ne, = 5,       Br_e,     "ne", "jne")               \ | 
|  | X(Br_be, = 6,       Br_a,     "be", "jbe")               \ | 
|  | X(Br_a,  = 7,       Br_be,    "a",  "ja")                \ | 
|  | X(Br_s,  = 8,       Br_ns,    "s",  "js")                \ | 
|  | X(Br_ns, = 9,       Br_s,     "ns", "jns")               \ | 
|  | X(Br_p,  = 10,      Br_np,    "p",  "jp")                \ | 
|  | X(Br_np, = 11,      Br_p,     "np", "jnp")               \ | 
|  | X(Br_l,  = 12,      Br_ge,    "l",  "jl")                \ | 
|  | X(Br_ge, = 13,      Br_l,     "ge", "jge")               \ | 
|  | X(Br_le, = 14,      Br_g,     "le", "jle")               \ | 
|  | X(Br_g,  = 15,      Br_le,    "g",  "jg")                \ | 
|  | //#define X(tag, encode, opp, dump, emit) | 
|  |  | 
|  | #define ICEINSTX8632CMPPS_TABLE \ | 
|  | /* enum value, emit */        \ | 
|  | X(Cmpps_eq,    "eq")          \ | 
|  | X(Cmpps_lt,    "lt")          \ | 
|  | X(Cmpps_le,    "le")          \ | 
|  | X(Cmpps_unord, "unord")       \ | 
|  | X(Cmpps_neq,   "neq")         \ | 
|  | X(Cmpps_nlt,   "nlt")         \ | 
|  | X(Cmpps_nle,   "nle")         \ | 
|  | X(Cmpps_ord,   "ord")         \ | 
|  | //#define X(tag, emit) | 
|  |  | 
|  | #define ICETYPEX8632_TABLE                                       \ | 
|  | /* tag,          element type, cvt, sdss,  pack, width, fld */ \ | 
|  | X(IceType_void,  IceType_void, "?" , ""  , "" ,  "",  "")      \ | 
|  | X(IceType_i1,    IceType_void, "si", ""  , "" ,  "b", "")      \ | 
|  | X(IceType_i8,    IceType_void, "si", ""  , "" ,  "b", "")      \ | 
|  | X(IceType_i16,   IceType_void, "si", ""  , "" ,  "w", "")      \ | 
|  | X(IceType_i32,   IceType_void, "si", ""  , "" ,  "l", "")      \ | 
|  | X(IceType_i64,   IceType_void, "si", ""  , "" ,  "q", "")      \ | 
|  | X(IceType_f32,   IceType_void, "ss", "ss", "d",  "",  "s")     \ | 
|  | X(IceType_f64,   IceType_void, "sd", "sd", "q",  "",  "l")     \ | 
|  | X(IceType_v4i1,  IceType_i32 , "?" , ""  , "d",  "",  "")      \ | 
|  | X(IceType_v8i1,  IceType_i16 , "?" , ""  , "w",  "",  "")      \ | 
|  | X(IceType_v16i1, IceType_i8  , "?" , ""  , "b",  "",  "")      \ | 
|  | X(IceType_v16i8, IceType_i8  , "?" , ""  , "b",  "",  "")      \ | 
|  | X(IceType_v8i16, IceType_i16 , "?" , ""  , "w",  "",  "")      \ | 
|  | X(IceType_v4i32, IceType_i32 , "dq", ""  , "d",  "",  "")      \ | 
|  | X(IceType_v4f32, IceType_f32 , "ps", ""  , "d",  "",  "")      \ | 
|  | //#define X(tag, elementty, cvt, sdss, pack, width, fld) | 
|  |  | 
|  | #endif // SUBZERO_SRC_ICEINSTX8632_DEF |