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