| //===- 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, 1, "ecx", "cx", "cl", 1, 0, 0, 0, 1, 1, 0) \ |
| X(Reg_edx, 2, "edx", "dx", "dl", 1, 0, 0, 0, 1, 1, 0) \ |
| X(Reg_ebx, 3, "ebx", "bx", "bl", 0, 1, 0, 0, 1, 1, 0) \ |
| X(Reg_esp, 4, "esp", "sp", "" , 0, 0, 1, 0, 0, 0, 0) \ |
| X(Reg_ebp, 5, "ebp", "bp", "" , 0, 1, 0, 1, 0, 1, 0) \ |
| X(Reg_esi, 6, "esi", "si", "" , 0, 1, 0, 0, 0, 1, 0) \ |
| X(Reg_edi, 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, 1, "xmm1", "" , "" , 1, 0, 0, 0, 0, 0, 1) \ |
| X(Reg_xmm2, 2, "xmm2", "" , "" , 1, 0, 0, 0, 0, 0, 1) \ |
| X(Reg_xmm3, 3, "xmm3", "" , "" , 1, 0, 0, 0, 0, 0, 1) \ |
| X(Reg_xmm4, 4, "xmm4", "" , "" , 1, 0, 0, 0, 0, 0, 1) \ |
| X(Reg_xmm5, 5, "xmm5", "" , "" , 1, 0, 0, 0, 0, 0, 1) \ |
| X(Reg_xmm6, 6, "xmm6", "" , "" , 1, 0, 0, 0, 0, 0, 1) \ |
| X(Reg_xmm7, 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. |
| #define REGX8632_TABLE \ |
| /* val, encode, name, name16, name8, scratch, preserved, stackptr, \ |
| frameptr, isI8, isInt, isFP */ \ |
| REGX8632_GPR_TABLE \ |
| 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) |
| //#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 |