xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceInstX8632.def (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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