blob: 566d21d03d7c851add9834325c2b4ede87b8ad17 [file] [log] [blame]
//===- 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
#include "IceRegList.h"
// x86-32 ABI:
// Scratch GPRs: eax, ecx, edx
// Callee-save GPRs: ebx, ebp, esi, edi
// Scratch XMMs: xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
// Key to table columns:
// val: Enum value, when a specific register is needed during lowering.
// encode: Encoding in the integrated assembler.
// name: Name used for the external assembler.
// scratch: Scratch (caller-save) register.
// preserved: Preserved (callee-save) register.
// stackptr: This register is used as the stack pointer.
// frameptr: This register is used as the frame pointer if needed.
// isGPR: This is a GPR (integer-type).
// is64: This is a 64-bit GPR.
// is32: This is a 32-bit GPR.
// is16: This is a 16-bit GPR.
// is8: This is an 8-bit GPR.
// isXmm: This is an XMM register for FP and vector ops.
// is64To8: A 64-bit GPR truncable to 8-bit.
// is32To8: A 32-bit GPR truncable to 8-bit.
// is16To8: A 16-bit GPR truncable to 8-bit.
// isTrunc8Rcvr: An 8-bit GPR that a wider GPR trivially truncates to.
// isAhRcvr: An 8-bit GPR that register "ah" can be assigned to.
// aliases: List of register aliases, which need not include this register.
#define REGX8632_BYTEREG_TABLE \
/* val, encode, name, base, scratch,preserved,stackptr,frameptr, \
isGPR,is64,is32,is16,is8, isXmm, \
is64To8,is32To8,is16To8,isTrunc8Rcvr,isAhRcvr, aliases */ \
/* 8-bit registers */ \
X(Reg_al, 0, "al", Reg_eax, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,1,1, \
REGLIST2(RegX8632, eax, ax)) \
X(Reg_cl, 1, "cl", Reg_ecx, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,1,1, \
REGLIST2(RegX8632, ecx, cx)) \
X(Reg_dl, 2, "dl", Reg_edx, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,1,1, \
REGLIST2(RegX8632, edx, dx)) \
X(Reg_bl, 3, "bl", Reg_ebx, 0,1,0,0, 1,0,0,0,1, 0, 0,0,0,1,1, \
REGLIST2(RegX8632, ebx, bx)) \
/* High 8-bit registers */ \
X(Reg_ah, 4, "ah", Reg_eax, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,0,1, \
REGLIST2(RegX8632, eax, ax)) \
X(Reg_ch, 5, "ch", Reg_ecx, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,0,1, \
REGLIST2(RegX8632, ecx, cx)) \
X(Reg_dh, 6, "dh", Reg_edx, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,0,1, \
REGLIST2(RegX8632, edx, dx)) \
X(Reg_bh, 7, "bh", Reg_ebx, 0,1,0,0, 1,0,0,0,1, 0, 0,0,0,0,1, \
REGLIST2(RegX8632, ebx, bx)) \
/* End of 8-bit register set */
//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr,
// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8,
// isTrunc8Rcvr, isAhRcvr, aliases)
#define REGX8632_GPR_TABLE \
/* val, encode, name, base, scratch,preserved,stackptr,frameptr, \
isGPR,is64,is32,is16,is8, isXmm, \
is64To8,is32To8,is16To8,isTrunc8Rcvr,isAhRcvr, aliases */ \
/* 32-bit registers */ \
X(Reg_eax, 0, "eax", Reg_eax, 1,0,0,0, 1,0,1,0,0, 0, 0,1,0,0,0, \
REGLIST3(RegX8632, ax, al, ah)) \
X(Reg_ecx, 1, "ecx", Reg_ecx, 1,0,0,0, 1,0,1,0,0, 0, 0,1,0,0,0, \
REGLIST3(RegX8632, cx, cl, ch)) \
X(Reg_edx, 2, "edx", Reg_edx, 1,0,0,0, 1,0,1,0,0, 0, 0,1,0,0,0, \
REGLIST3(RegX8632, dx, dl, dh)) \
X(Reg_ebx, 3, "ebx", Reg_ebx, 0,1,0,0, 1,0,1,0,0, 0, 0,1,0,0,0, \
REGLIST3(RegX8632, bx, bl, bh)) \
X(Reg_esp, 4, "esp", Reg_esp, 0,0,1,0, 1,0,0,0,0, 0, 0,0,0,0,0, \
REGLIST1(RegX8632, sp)) \
X(Reg_ebp, 5, "ebp", Reg_ebp, 0,1,0,1, 1,0,1,0,0, 0, 0,0,0,0,0, \
REGLIST1(RegX8632, bp)) \
X(Reg_esi, 6, "esi", Reg_esi, 0,1,0,0, 1,0,1,0,0, 0, 0,0,0,0,0, \
REGLIST1(RegX8632, si)) \
X(Reg_edi, 7, "edi", Reg_edi, 0,1,0,0, 1,0,1,0,0, 0, 0,0,0,0,0, \
REGLIST1(RegX8632, di)) \
/* 16-bit registers */ \
X(Reg_ax, 0, "ax", Reg_eax, 1,0,0,0, 1,0,0,1,0, 0, 0,0,1,0,0, \
REGLIST3(RegX8632, eax, al, ah)) \
X(Reg_cx, 1, "cx", Reg_ecx, 1,0,0,0, 1,0,0,1,0, 0, 0,0,1,0,0, \
REGLIST3(RegX8632, ecx, cl, ch)) \
X(Reg_dx, 2, "dx", Reg_edx, 1,0,0,0, 1,0,0,1,0, 0, 0,0,1,0,0, \
REGLIST3(RegX8632, edx, dl, dh)) \
X(Reg_bx, 3, "bx", Reg_ebx, 0,1,0,0, 1,0,0,1,0, 0, 0,0,1,0,0, \
REGLIST3(RegX8632, ebx, bl, bh)) \
X(Reg_sp, 4, "sp", Reg_esp, 0,0,1,0, 1,0,0,0,0, 0, 0,0,0,0,0, \
REGLIST1(RegX8632, esp)) \
X(Reg_bp, 5, "bp", Reg_ebp, 0,1,0,1, 1,0,0,1,0, 0, 0,0,0,0,0, \
REGLIST1(RegX8632, ebp)) \
X(Reg_si, 6, "si", Reg_esi, 0,1,0,0, 1,0,0,1,0, 0, 0,0,0,0,0, \
REGLIST1(RegX8632, esi)) \
X(Reg_di, 7, "di", Reg_edi, 0,1,0,0, 1,0,0,1,0, 0, 0,0,0,0,0, \
REGLIST1(RegX8632, edi)) \
/* 8-bit registers */ \
REGX8632_BYTEREG_TABLE \
/* End of GPR register set */
//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr,
// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8,
// isTrunc8Rcvr, isAhRcvr, aliases)
// Note: It would be more appropriate to list the xmm register aliases as
// REGLIST0(), but the corresponding empty initializer gives a syntax error, so
// we use REGLIST1() to redundantly assign the register itself as an alias.
#define REGX8632_XMM_TABLE \
/* val, encode, name, base, scratch,preserved,stackptr,frameptr, \
isGPR,is64,is32,is16,is8, isXmm, \
is64To8,is32To8,is16To8,isTrunc8Rcvr,isAhRcvr, aliases */ \
/* xmm registers */ \
X(Reg_xmm0, 0, "xmm0", Reg_xmm0, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
NO_ALIASES()) \
X(Reg_xmm1, 1, "xmm1", Reg_xmm1, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
NO_ALIASES()) \
X(Reg_xmm2, 2, "xmm2", Reg_xmm2, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
NO_ALIASES()) \
X(Reg_xmm3, 3, "xmm3", Reg_xmm3, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
NO_ALIASES()) \
X(Reg_xmm4, 4, "xmm4", Reg_xmm4, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
NO_ALIASES()) \
X(Reg_xmm5, 5, "xmm5", Reg_xmm5, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
NO_ALIASES()) \
X(Reg_xmm6, 6, "xmm6", Reg_xmm6, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
NO_ALIASES()) \
X(Reg_xmm7, 7, "xmm7", Reg_xmm7, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \
NO_ALIASES()) \
/* End of xmm register set */
//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr,
// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8,
// isTrunc8Rcvr, isAhRcvr, aliases)
// 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 \
REGX8632_GPR_TABLE \
REGX8632_XMM_TABLE
//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr,
// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8,
// isTrunc8Rcvr, isAhRcvr, aliases)
// X86 segment registers.
#define SEG_REGX8632_TABLE \
/* val, 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 \
/* val, 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)
#endif // SUBZERO_SRC_ICEINSTX8632_DEF