host_x86_defs.h revision 35421a3cfd43bc829d27ee15bd34bbc7cb690805
1c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
2c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/*---------------------------------------------------------------*/
3c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/*---                                                         ---*/
4c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/*--- This file (x86h_defs.h) is                              ---*/
5c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/*--- Copyright (c) 2004 OpenWorks LLP.  All rights reserved. ---*/
6c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/*---                                                         ---*/
7c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/*---------------------------------------------------------------*/
8c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
9ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj#ifndef __LIBJIT_X86H_DEFS_H
10ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj#define __LIBJIT_X86H_DEFS_H
11c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
12c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
13c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/* --------- Registers. --------- */
14c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
15c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/* The usual HReg abstraction.  There are 8 real int regs,
16c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   6 real float regs, and 0 real vector regs.
17c97096c44637ae5775ed305b19f16f0b505f17d8sewardj*/
18c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
1935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjextern void ppHRegX86 ( HReg );
20c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
2153f85a90d36368f5d045d0a5590054fe741dc042sewardjextern HReg hregX86_EAX ( void );
222cd80dc9ea9dc0f30a2b2671125bbd2dc8fed85esewardjextern HReg hregX86_EBX ( void );
2353f85a90d36368f5d045d0a5590054fe741dc042sewardjextern HReg hregX86_ECX ( void );
242cd80dc9ea9dc0f30a2b2671125bbd2dc8fed85esewardjextern HReg hregX86_EDX ( void );
2553f85a90d36368f5d045d0a5590054fe741dc042sewardjextern HReg hregX86_EBP ( void );
2653f85a90d36368f5d045d0a5590054fe741dc042sewardj
27c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
28c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/* --------- Memory address expressions (amodes). --------- */
29c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
30c97096c44637ae5775ed305b19f16f0b505f17d8sewardjtypedef
31c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   enum {
3266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj     Xam_IR,        /* Immediate + Reg */
3366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj     Xam_IRRS       /* Immediate + Reg1 + (Reg2 << Shift) */
34c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   }
35c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   X86AModeTag;
36c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
37c97096c44637ae5775ed305b19f16f0b505f17d8sewardjtypedef
38c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   struct {
39c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      X86AModeTag tag;
40c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      union {
41c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         struct {
42c97096c44637ae5775ed305b19f16f0b505f17d8sewardj            UInt imm;
43c97096c44637ae5775ed305b19f16f0b505f17d8sewardj            HReg reg;
44c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         } IR;
45c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         struct {
46c97096c44637ae5775ed305b19f16f0b505f17d8sewardj            UInt imm;
47c97096c44637ae5775ed305b19f16f0b505f17d8sewardj            HReg base;
48c97096c44637ae5775ed305b19f16f0b505f17d8sewardj            HReg index;
49c97096c44637ae5775ed305b19f16f0b505f17d8sewardj            Int  shift; /* 0, 1, 2 or 3 only */
50c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         } IRRS;
51c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      } Xam;
52c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   }
53c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   X86AMode;
54c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
55c97096c44637ae5775ed305b19f16f0b505f17d8sewardjextern X86AMode* X86AMode_IR   ( UInt, HReg );
56c97096c44637ae5775ed305b19f16f0b505f17d8sewardjextern X86AMode* X86AMode_IRRS ( UInt, HReg, HReg, Int );
57c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
5835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjextern void ppX86AMode ( X86AMode* );
59c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
60c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
6166f2f79812f39ed7cdeedd11d1d40711f3999106sewardj/* --------- Operand, which can be reg, immediate or memory. --------- */
62c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
63c97096c44637ae5775ed305b19f16f0b505f17d8sewardjtypedef
64c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   enum {
6566f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xrmi_Imm,
6666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xrmi_Reg,
6766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xrmi_Mem
68c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   }
6966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   X86RMITag;
70c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
71c97096c44637ae5775ed305b19f16f0b505f17d8sewardjtypedef
72c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   struct {
7366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      X86RMITag tag;
74c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      union {
75c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         struct {
76c97096c44637ae5775ed305b19f16f0b505f17d8sewardj            UInt imm32;
77c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         } Imm;
78c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         struct {
79c97096c44637ae5775ed305b19f16f0b505f17d8sewardj            HReg reg;
80c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         } Reg;
81c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         struct {
82c97096c44637ae5775ed305b19f16f0b505f17d8sewardj            X86AMode* am;
83c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         } Mem;
84c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      }
8566f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xrmi;
86c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   }
8766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   X86RMI;
88c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
8966f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86RMI* X86RMI_Imm ( UInt );
9066f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86RMI* X86RMI_Reg ( HReg );
9166f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86RMI* X86RMI_Mem ( X86AMode* );
92c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
9335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjextern void ppX86RMI ( X86RMI* );
9466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
9566f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
9666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj/* --------- Operand, which can be reg or immediate only. --------- */
9766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
9866f2f79812f39ed7cdeedd11d1d40711f3999106sewardjtypedef
9966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   enum {
10066f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xri_Imm,
10166f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xri_Reg
10266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   }
10366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   X86RITag;
10466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
10566f2f79812f39ed7cdeedd11d1d40711f3999106sewardjtypedef
10666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   struct {
10766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      X86RITag tag;
10866f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      union {
10966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         struct {
11066f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            UInt imm32;
11166f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         } Imm;
11266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         struct {
11366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            HReg reg;
11466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         } Reg;
11566f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      }
11666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xri;
11766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   }
11866f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   X86RI;
11966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
12066f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86RI* X86RI_Imm ( UInt );
12166f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86RI* X86RI_Reg ( HReg );
12266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
12335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjextern void ppX86RI ( X86RI* );
12466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
12566f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
12666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj/* --------- Operand, which can be reg or memory only. --------- */
12766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
12866f2f79812f39ed7cdeedd11d1d40711f3999106sewardjtypedef
12966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   enum {
13066f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xrm_Reg,
13166f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xrm_Mem
13266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   }
13366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   X86RMTag;
13466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
13566f2f79812f39ed7cdeedd11d1d40711f3999106sewardjtypedef
13666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   struct {
13766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      X86RMTag tag;
13866f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      union {
13966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         struct {
14066f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            HReg reg;
14166f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         } Reg;
14266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         struct {
14366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            X86AMode* am;
14466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         } Mem;
14566f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      }
14666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xrm;
14766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   }
14866f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   X86RM;
14966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
15066f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86RM* X86RM_Reg ( HReg );
15166f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86RM* X86RM_Mem ( X86AMode* );
15266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
15335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjextern void ppX86RM ( X86RM* );
154c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
155c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
156c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/* --------- Instructions. --------- */
157c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
15866f2f79812f39ed7cdeedd11d1d40711f3999106sewardj/* --------- */
159c97096c44637ae5775ed305b19f16f0b505f17d8sewardjtypedef
16066f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   enum {
16166f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xalu_MOV,
16266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xalu_ADD, Xalu_SUB, Xalu_ADC, Xalu_SBB,
16366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xalu_AND, Xalu_OR, Xalu_XOR
16466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   }
165c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   X86AluOp;
166c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
16735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjextern void ppX86AluOp ( X86AluOp );
168c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
169c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
17066f2f79812f39ed7cdeedd11d1d40711f3999106sewardj/* --------- */
17166f2f79812f39ed7cdeedd11d1d40711f3999106sewardjtypedef
17266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   enum {
17366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xsh_SHL, Xsh_SHR, Xsh_SAR,
17466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xsh_ROL, Xsh_ROR
17566f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   }
17666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj   X86ShiftOp;
17766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
17835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjextern void ppX86ShiftOp ( X86ShiftOp );
17966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
18066f2f79812f39ed7cdeedd11d1d40711f3999106sewardj
18166f2f79812f39ed7cdeedd11d1d40711f3999106sewardj/* --------- */
182c97096c44637ae5775ed305b19f16f0b505f17d8sewardjtypedef
183c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   enum {
18466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xin_Alu32R,    /* 32-bit mov/arith/logical, dst=REG */
18566f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xin_Alu32M,    /* 32-bit mov/arith/logical, dst=MEM */
18666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xin_Sh32,      /* 32-bit shift/rotate, dst=REG or MEM */
18766f2f79812f39ed7cdeedd11d1d40711f3999106sewardj      Xin_RET
188c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   }
189c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   X86InstrTag;
190c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
191c97096c44637ae5775ed305b19f16f0b505f17d8sewardj/* Destinations are on the RIGHT (second operand). */
192c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
193c97096c44637ae5775ed305b19f16f0b505f17d8sewardjtypedef
194c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   struct {
195c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      X86InstrTag tag;
196c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      union {
197c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         struct {
19866f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            X86AluOp op;
19966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            X86RMI*  src;
20066f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            HReg     dst;
20166f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         } Alu32R;
202c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         struct {
20366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            X86AluOp  op;
20466f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            X86RI*    src;
20566f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            X86AMode* dst;
20666f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         } Alu32M;
207c97096c44637ae5775ed305b19f16f0b505f17d8sewardj         struct {
20866f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            X86ShiftOp op;
20966f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            UInt       src;  /* shift amount, or 0 means %cl */
21066f2f79812f39ed7cdeedd11d1d40711f3999106sewardj            X86RM*     dst;
21166f2f79812f39ed7cdeedd11d1d40711f3999106sewardj         } Sh32;
21266f2f79812f39ed7cdeedd11d1d40711f3999106sewardj 	 struct {
21366f2f79812f39ed7cdeedd11d1d40711f3999106sewardj	 } RET;
214c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      } Xin;
215c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   }
216c97096c44637ae5775ed305b19f16f0b505f17d8sewardj   X86Instr;
217c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
21866f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86Instr* X86Instr_Alu32R ( X86AluOp, X86RMI*, HReg );
21966f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86Instr* X86Instr_Alu32M ( X86AluOp, X86RI*,  X86AMode* );
22066f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86Instr* X86Instr_Sh32   ( X86ShiftOp, UInt, X86RM* );
22166f2f79812f39ed7cdeedd11d1d40711f3999106sewardjextern X86Instr* X86Instr_RET    ( void );
222c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
22335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjextern void ppX86Instr ( X86Instr* );
224c97096c44637ae5775ed305b19f16f0b505f17d8sewardj
225194d54a15ba7eb6b76afe56b8774689c50485354sewardj/* Five functions that insulate the register allocator from details
226194d54a15ba7eb6b76afe56b8774689c50485354sewardj   of the underlying instruction set. */
227194d54a15ba7eb6b76afe56b8774689c50485354sewardjextern void      getRegUsage_X86Instr ( HRegUsage*, X86Instr* );
228194d54a15ba7eb6b76afe56b8774689c50485354sewardjextern void      mapRegs_X86Instr     ( HRegRemap*, X86Instr* );
229194d54a15ba7eb6b76afe56b8774689c50485354sewardjextern Bool      isMove_X86Instr      ( X86Instr*, HReg*, HReg* );
230194d54a15ba7eb6b76afe56b8774689c50485354sewardjextern X86Instr* genSpill_X86         ( HReg rreg, Int offset );
231194d54a15ba7eb6b76afe56b8774689c50485354sewardjextern X86Instr* genReload_X86        ( HReg rreg, Int offset );
2326c77c95467b9b9bbb24ac645ea1a167c9e25e33asewardj
2336c77c95467b9b9bbb24ac645ea1a167c9e25e33asewardj
234ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj#endif /* ndef __LIBJIT_X86H_DEFS_H */
235