1*03ce13f7SAndroid Build Coastguard Worker//===- subzero/src/IceInstX8632.def - X-macros for x86-32 insts -*- C++ -*-===// 2*03ce13f7SAndroid Build Coastguard Worker// 3*03ce13f7SAndroid Build Coastguard Worker// The Subzero Code Generator 4*03ce13f7SAndroid Build Coastguard Worker// 5*03ce13f7SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*03ce13f7SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*03ce13f7SAndroid Build Coastguard Worker// 8*03ce13f7SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*03ce13f7SAndroid Build Coastguard Worker// 10*03ce13f7SAndroid Build Coastguard Worker// This file defines properties of lowered x86-32 instructions in the 11*03ce13f7SAndroid Build Coastguard Worker// form of x-macros. 12*03ce13f7SAndroid Build Coastguard Worker// 13*03ce13f7SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 14*03ce13f7SAndroid Build Coastguard Worker 15*03ce13f7SAndroid Build Coastguard Worker#ifndef SUBZERO_SRC_ICEINSTX8632_DEF 16*03ce13f7SAndroid Build Coastguard Worker#define SUBZERO_SRC_ICEINSTX8632_DEF 17*03ce13f7SAndroid Build Coastguard Worker 18*03ce13f7SAndroid Build Coastguard Worker#include "IceRegList.h" 19*03ce13f7SAndroid Build Coastguard Worker 20*03ce13f7SAndroid Build Coastguard Worker// x86-32 ABI: 21*03ce13f7SAndroid Build Coastguard Worker// Scratch GPRs: eax, ecx, edx 22*03ce13f7SAndroid Build Coastguard Worker// Callee-save GPRs: ebx, ebp, esi, edi 23*03ce13f7SAndroid Build Coastguard Worker// Scratch XMMs: xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7 24*03ce13f7SAndroid Build Coastguard Worker// Key to table columns: 25*03ce13f7SAndroid Build Coastguard Worker// val: Enum value, when a specific register is needed during lowering. 26*03ce13f7SAndroid Build Coastguard Worker// encode: Encoding in the integrated assembler. 27*03ce13f7SAndroid Build Coastguard Worker// name: Name used for the external assembler. 28*03ce13f7SAndroid Build Coastguard Worker// scratch: Scratch (caller-save) register. 29*03ce13f7SAndroid Build Coastguard Worker// preserved: Preserved (callee-save) register. 30*03ce13f7SAndroid Build Coastguard Worker// stackptr: This register is used as the stack pointer. 31*03ce13f7SAndroid Build Coastguard Worker// frameptr: This register is used as the frame pointer if needed. 32*03ce13f7SAndroid Build Coastguard Worker// isGPR: This is a GPR (integer-type). 33*03ce13f7SAndroid Build Coastguard Worker// is64: This is a 64-bit GPR. 34*03ce13f7SAndroid Build Coastguard Worker// is32: This is a 32-bit GPR. 35*03ce13f7SAndroid Build Coastguard Worker// is16: This is a 16-bit GPR. 36*03ce13f7SAndroid Build Coastguard Worker// is8: This is an 8-bit GPR. 37*03ce13f7SAndroid Build Coastguard Worker// isXmm: This is an XMM register for FP and vector ops. 38*03ce13f7SAndroid Build Coastguard Worker// is64To8: A 64-bit GPR truncable to 8-bit. 39*03ce13f7SAndroid Build Coastguard Worker// is32To8: A 32-bit GPR truncable to 8-bit. 40*03ce13f7SAndroid Build Coastguard Worker// is16To8: A 16-bit GPR truncable to 8-bit. 41*03ce13f7SAndroid Build Coastguard Worker// isTrunc8Rcvr: An 8-bit GPR that a wider GPR trivially truncates to. 42*03ce13f7SAndroid Build Coastguard Worker// isAhRcvr: An 8-bit GPR that register "ah" can be assigned to. 43*03ce13f7SAndroid Build Coastguard Worker// aliases: List of register aliases, which need not include this register. 44*03ce13f7SAndroid Build Coastguard Worker#define REGX8632_BYTEREG_TABLE \ 45*03ce13f7SAndroid Build Coastguard Worker /* val, encode, name, base, scratch,preserved,stackptr,frameptr, \ 46*03ce13f7SAndroid Build Coastguard Worker isGPR,is64,is32,is16,is8, isXmm, \ 47*03ce13f7SAndroid Build Coastguard Worker is64To8,is32To8,is16To8,isTrunc8Rcvr,isAhRcvr, aliases */ \ 48*03ce13f7SAndroid Build Coastguard Worker /* 8-bit registers */ \ 49*03ce13f7SAndroid Build Coastguard Worker X(Reg_al, 0, "al", Reg_eax, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,1,1, \ 50*03ce13f7SAndroid Build Coastguard Worker REGLIST2(RegX8632, eax, ax)) \ 51*03ce13f7SAndroid Build Coastguard Worker X(Reg_cl, 1, "cl", Reg_ecx, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,1,1, \ 52*03ce13f7SAndroid Build Coastguard Worker REGLIST2(RegX8632, ecx, cx)) \ 53*03ce13f7SAndroid Build Coastguard Worker X(Reg_dl, 2, "dl", Reg_edx, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,1,1, \ 54*03ce13f7SAndroid Build Coastguard Worker REGLIST2(RegX8632, edx, dx)) \ 55*03ce13f7SAndroid Build Coastguard Worker X(Reg_bl, 3, "bl", Reg_ebx, 0,1,0,0, 1,0,0,0,1, 0, 0,0,0,1,1, \ 56*03ce13f7SAndroid Build Coastguard Worker REGLIST2(RegX8632, ebx, bx)) \ 57*03ce13f7SAndroid Build Coastguard Worker /* High 8-bit registers */ \ 58*03ce13f7SAndroid Build Coastguard Worker X(Reg_ah, 4, "ah", Reg_eax, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,0,1, \ 59*03ce13f7SAndroid Build Coastguard Worker REGLIST2(RegX8632, eax, ax)) \ 60*03ce13f7SAndroid Build Coastguard Worker X(Reg_ch, 5, "ch", Reg_ecx, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,0,1, \ 61*03ce13f7SAndroid Build Coastguard Worker REGLIST2(RegX8632, ecx, cx)) \ 62*03ce13f7SAndroid Build Coastguard Worker X(Reg_dh, 6, "dh", Reg_edx, 1,0,0,0, 1,0,0,0,1, 0, 0,0,0,0,1, \ 63*03ce13f7SAndroid Build Coastguard Worker REGLIST2(RegX8632, edx, dx)) \ 64*03ce13f7SAndroid Build Coastguard Worker X(Reg_bh, 7, "bh", Reg_ebx, 0,1,0,0, 1,0,0,0,1, 0, 0,0,0,0,1, \ 65*03ce13f7SAndroid Build Coastguard Worker REGLIST2(RegX8632, ebx, bx)) \ 66*03ce13f7SAndroid Build Coastguard Worker /* End of 8-bit register set */ 67*03ce13f7SAndroid Build Coastguard Worker//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, 68*03ce13f7SAndroid Build Coastguard Worker// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, 69*03ce13f7SAndroid Build Coastguard Worker// isTrunc8Rcvr, isAhRcvr, aliases) 70*03ce13f7SAndroid Build Coastguard Worker 71*03ce13f7SAndroid Build Coastguard Worker#define REGX8632_GPR_TABLE \ 72*03ce13f7SAndroid Build Coastguard Worker /* val, encode, name, base, scratch,preserved,stackptr,frameptr, \ 73*03ce13f7SAndroid Build Coastguard Worker isGPR,is64,is32,is16,is8, isXmm, \ 74*03ce13f7SAndroid Build Coastguard Worker is64To8,is32To8,is16To8,isTrunc8Rcvr,isAhRcvr, aliases */ \ 75*03ce13f7SAndroid Build Coastguard Worker /* 32-bit registers */ \ 76*03ce13f7SAndroid Build Coastguard Worker X(Reg_eax, 0, "eax", Reg_eax, 1,0,0,0, 1,0,1,0,0, 0, 0,1,0,0,0, \ 77*03ce13f7SAndroid Build Coastguard Worker REGLIST3(RegX8632, ax, al, ah)) \ 78*03ce13f7SAndroid Build Coastguard Worker X(Reg_ecx, 1, "ecx", Reg_ecx, 1,0,0,0, 1,0,1,0,0, 0, 0,1,0,0,0, \ 79*03ce13f7SAndroid Build Coastguard Worker REGLIST3(RegX8632, cx, cl, ch)) \ 80*03ce13f7SAndroid Build Coastguard Worker X(Reg_edx, 2, "edx", Reg_edx, 1,0,0,0, 1,0,1,0,0, 0, 0,1,0,0,0, \ 81*03ce13f7SAndroid Build Coastguard Worker REGLIST3(RegX8632, dx, dl, dh)) \ 82*03ce13f7SAndroid Build Coastguard Worker X(Reg_ebx, 3, "ebx", Reg_ebx, 0,1,0,0, 1,0,1,0,0, 0, 0,1,0,0,0, \ 83*03ce13f7SAndroid Build Coastguard Worker REGLIST3(RegX8632, bx, bl, bh)) \ 84*03ce13f7SAndroid Build Coastguard Worker X(Reg_esp, 4, "esp", Reg_esp, 0,0,1,0, 1,0,0,0,0, 0, 0,0,0,0,0, \ 85*03ce13f7SAndroid Build Coastguard Worker REGLIST1(RegX8632, sp)) \ 86*03ce13f7SAndroid Build Coastguard Worker X(Reg_ebp, 5, "ebp", Reg_ebp, 0,1,0,1, 1,0,1,0,0, 0, 0,0,0,0,0, \ 87*03ce13f7SAndroid Build Coastguard Worker REGLIST1(RegX8632, bp)) \ 88*03ce13f7SAndroid Build Coastguard Worker X(Reg_esi, 6, "esi", Reg_esi, 0,1,0,0, 1,0,1,0,0, 0, 0,0,0,0,0, \ 89*03ce13f7SAndroid Build Coastguard Worker REGLIST1(RegX8632, si)) \ 90*03ce13f7SAndroid Build Coastguard Worker X(Reg_edi, 7, "edi", Reg_edi, 0,1,0,0, 1,0,1,0,0, 0, 0,0,0,0,0, \ 91*03ce13f7SAndroid Build Coastguard Worker REGLIST1(RegX8632, di)) \ 92*03ce13f7SAndroid Build Coastguard Worker /* 16-bit registers */ \ 93*03ce13f7SAndroid Build Coastguard Worker X(Reg_ax, 0, "ax", Reg_eax, 1,0,0,0, 1,0,0,1,0, 0, 0,0,1,0,0, \ 94*03ce13f7SAndroid Build Coastguard Worker REGLIST3(RegX8632, eax, al, ah)) \ 95*03ce13f7SAndroid Build Coastguard Worker X(Reg_cx, 1, "cx", Reg_ecx, 1,0,0,0, 1,0,0,1,0, 0, 0,0,1,0,0, \ 96*03ce13f7SAndroid Build Coastguard Worker REGLIST3(RegX8632, ecx, cl, ch)) \ 97*03ce13f7SAndroid Build Coastguard Worker X(Reg_dx, 2, "dx", Reg_edx, 1,0,0,0, 1,0,0,1,0, 0, 0,0,1,0,0, \ 98*03ce13f7SAndroid Build Coastguard Worker REGLIST3(RegX8632, edx, dl, dh)) \ 99*03ce13f7SAndroid Build Coastguard Worker X(Reg_bx, 3, "bx", Reg_ebx, 0,1,0,0, 1,0,0,1,0, 0, 0,0,1,0,0, \ 100*03ce13f7SAndroid Build Coastguard Worker REGLIST3(RegX8632, ebx, bl, bh)) \ 101*03ce13f7SAndroid Build Coastguard Worker X(Reg_sp, 4, "sp", Reg_esp, 0,0,1,0, 1,0,0,0,0, 0, 0,0,0,0,0, \ 102*03ce13f7SAndroid Build Coastguard Worker REGLIST1(RegX8632, esp)) \ 103*03ce13f7SAndroid Build Coastguard Worker X(Reg_bp, 5, "bp", Reg_ebp, 0,1,0,1, 1,0,0,1,0, 0, 0,0,0,0,0, \ 104*03ce13f7SAndroid Build Coastguard Worker REGLIST1(RegX8632, ebp)) \ 105*03ce13f7SAndroid Build Coastguard Worker X(Reg_si, 6, "si", Reg_esi, 0,1,0,0, 1,0,0,1,0, 0, 0,0,0,0,0, \ 106*03ce13f7SAndroid Build Coastguard Worker REGLIST1(RegX8632, esi)) \ 107*03ce13f7SAndroid Build Coastguard Worker X(Reg_di, 7, "di", Reg_edi, 0,1,0,0, 1,0,0,1,0, 0, 0,0,0,0,0, \ 108*03ce13f7SAndroid Build Coastguard Worker REGLIST1(RegX8632, edi)) \ 109*03ce13f7SAndroid Build Coastguard Worker /* 8-bit registers */ \ 110*03ce13f7SAndroid Build Coastguard Worker REGX8632_BYTEREG_TABLE \ 111*03ce13f7SAndroid Build Coastguard Worker /* End of GPR register set */ 112*03ce13f7SAndroid Build Coastguard Worker//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, 113*03ce13f7SAndroid Build Coastguard Worker// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, 114*03ce13f7SAndroid Build Coastguard Worker// isTrunc8Rcvr, isAhRcvr, aliases) 115*03ce13f7SAndroid Build Coastguard Worker 116*03ce13f7SAndroid Build Coastguard Worker// Note: It would be more appropriate to list the xmm register aliases as 117*03ce13f7SAndroid Build Coastguard Worker// REGLIST0(), but the corresponding empty initializer gives a syntax error, so 118*03ce13f7SAndroid Build Coastguard Worker// we use REGLIST1() to redundantly assign the register itself as an alias. 119*03ce13f7SAndroid Build Coastguard Worker#define REGX8632_XMM_TABLE \ 120*03ce13f7SAndroid Build Coastguard Worker /* val, encode, name, base, scratch,preserved,stackptr,frameptr, \ 121*03ce13f7SAndroid Build Coastguard Worker isGPR,is64,is32,is16,is8, isXmm, \ 122*03ce13f7SAndroid Build Coastguard Worker is64To8,is32To8,is16To8,isTrunc8Rcvr,isAhRcvr, aliases */ \ 123*03ce13f7SAndroid Build Coastguard Worker /* xmm registers */ \ 124*03ce13f7SAndroid Build Coastguard Worker X(Reg_xmm0, 0, "xmm0", Reg_xmm0, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \ 125*03ce13f7SAndroid Build Coastguard Worker NO_ALIASES()) \ 126*03ce13f7SAndroid Build Coastguard Worker X(Reg_xmm1, 1, "xmm1", Reg_xmm1, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \ 127*03ce13f7SAndroid Build Coastguard Worker NO_ALIASES()) \ 128*03ce13f7SAndroid Build Coastguard Worker X(Reg_xmm2, 2, "xmm2", Reg_xmm2, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \ 129*03ce13f7SAndroid Build Coastguard Worker NO_ALIASES()) \ 130*03ce13f7SAndroid Build Coastguard Worker X(Reg_xmm3, 3, "xmm3", Reg_xmm3, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \ 131*03ce13f7SAndroid Build Coastguard Worker NO_ALIASES()) \ 132*03ce13f7SAndroid Build Coastguard Worker X(Reg_xmm4, 4, "xmm4", Reg_xmm4, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \ 133*03ce13f7SAndroid Build Coastguard Worker NO_ALIASES()) \ 134*03ce13f7SAndroid Build Coastguard Worker X(Reg_xmm5, 5, "xmm5", Reg_xmm5, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \ 135*03ce13f7SAndroid Build Coastguard Worker NO_ALIASES()) \ 136*03ce13f7SAndroid Build Coastguard Worker X(Reg_xmm6, 6, "xmm6", Reg_xmm6, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \ 137*03ce13f7SAndroid Build Coastguard Worker NO_ALIASES()) \ 138*03ce13f7SAndroid Build Coastguard Worker X(Reg_xmm7, 7, "xmm7", Reg_xmm7, 1,0,0,0, 0,0,0,0,0, 1, 0,0,0,0,0, \ 139*03ce13f7SAndroid Build Coastguard Worker NO_ALIASES()) \ 140*03ce13f7SAndroid Build Coastguard Worker /* End of xmm register set */ 141*03ce13f7SAndroid Build Coastguard Worker//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, 142*03ce13f7SAndroid Build Coastguard Worker// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, 143*03ce13f7SAndroid Build Coastguard Worker// isTrunc8Rcvr, isAhRcvr, aliases) 144*03ce13f7SAndroid Build Coastguard Worker 145*03ce13f7SAndroid Build Coastguard Worker// We also provide a combined table, so that there is a namespace where 146*03ce13f7SAndroid Build Coastguard Worker// all of the registers are considered and have distinct numberings. 147*03ce13f7SAndroid Build Coastguard Worker// This is in contrast to the above, where the "encode" is based on how 148*03ce13f7SAndroid Build Coastguard Worker// the register numbers will be encoded in binaries and values can overlap. 149*03ce13f7SAndroid Build Coastguard Worker#define REGX8632_TABLE \ 150*03ce13f7SAndroid Build Coastguard Worker REGX8632_GPR_TABLE \ 151*03ce13f7SAndroid Build Coastguard Worker REGX8632_XMM_TABLE 152*03ce13f7SAndroid Build Coastguard Worker//#define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, 153*03ce13f7SAndroid Build Coastguard Worker// isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, 154*03ce13f7SAndroid Build Coastguard Worker// isTrunc8Rcvr, isAhRcvr, aliases) 155*03ce13f7SAndroid Build Coastguard Worker 156*03ce13f7SAndroid Build Coastguard Worker// X86 segment registers. 157*03ce13f7SAndroid Build Coastguard Worker#define SEG_REGX8632_TABLE \ 158*03ce13f7SAndroid Build Coastguard Worker /* val, name, prefix */ \ 159*03ce13f7SAndroid Build Coastguard Worker X(SegReg_CS, "cs", 0x2E) \ 160*03ce13f7SAndroid Build Coastguard Worker X(SegReg_DS, "ds", 0x3E) \ 161*03ce13f7SAndroid Build Coastguard Worker X(SegReg_ES, "es", 0x26) \ 162*03ce13f7SAndroid Build Coastguard Worker X(SegReg_SS, "ss", 0x36) \ 163*03ce13f7SAndroid Build Coastguard Worker X(SegReg_FS, "fs", 0x64) \ 164*03ce13f7SAndroid Build Coastguard Worker X(SegReg_GS, "gs", 0x65) 165*03ce13f7SAndroid Build Coastguard Worker//#define X(val, name, prefix) 166*03ce13f7SAndroid Build Coastguard Worker 167*03ce13f7SAndroid Build Coastguard Worker// X87 ST(n) registers. 168*03ce13f7SAndroid Build Coastguard Worker#define X87ST_REGX8632_TABLE \ 169*03ce13f7SAndroid Build Coastguard Worker /* val, encode, name */ \ 170*03ce13f7SAndroid Build Coastguard Worker X(X87ST_First, 0, "st(0)") \ 171*03ce13f7SAndroid Build Coastguard Worker X(X87ST_0, 0, "st(0)") \ 172*03ce13f7SAndroid Build Coastguard Worker X(X87ST_1, 1, "st(1)") \ 173*03ce13f7SAndroid Build Coastguard Worker X(X87ST_2, 2, "st(2)") \ 174*03ce13f7SAndroid Build Coastguard Worker X(X87ST_3, 3, "st(3)") \ 175*03ce13f7SAndroid Build Coastguard Worker X(X87ST_4, 4, "st(4)") \ 176*03ce13f7SAndroid Build Coastguard Worker X(X87ST_5, 5, "st(5)") \ 177*03ce13f7SAndroid Build Coastguard Worker X(X87ST_6, 6, "st(6)") \ 178*03ce13f7SAndroid Build Coastguard Worker X(X87ST_7, 7, "st(7)") \ 179*03ce13f7SAndroid Build Coastguard Worker X(X87ST_Last, 7, "st(7)") 180*03ce13f7SAndroid Build Coastguard Worker//#define X(val, encode, name) 181*03ce13f7SAndroid Build Coastguard Worker 182*03ce13f7SAndroid Build Coastguard Worker#endif // SUBZERO_SRC_ICEINSTX8632_DEF 183