1 //===- X86InstructionInfo.h - X86 Instruction Information ---------*-C++-*-===//
3 // This file contains the X86 implementation of the MachineInstrInfo class.
5 //===----------------------------------------------------------------------===//
7 #ifndef X86INSTRUCTIONINFO_H
8 #define X86INSTRUCTIONINFO_H
10 #include "llvm/Target/MachineInstrInfo.h"
11 #include "X86RegisterInfo.h"
13 /// X86II - This namespace holds all of the target specific flags that
14 /// instruction info tracks.
18 //===------------------------------------------------------------------===//
19 // Instruction types. These are the standard/most common forms for X86
23 /// Other - An instruction gets this form if it doesn't fit any of the
27 /// Raw - This form is for instructions that don't have any operands, so
28 /// they are just a fixed opcode value, like 'leave'.
31 /// AddRegFrm - This form is used for instructions like 'push r32' that have
32 /// their one register operand added to their opcode.
35 /// MRMDestReg - This form is used for instructions that use the Mod/RM byte
36 /// to specify a destination, which in this case is a register.
40 /// MRMDestMem - This form is used for instructions that use the Mod/RM byte
41 /// to specify a destination, which in this case is memory.
45 /// MRMSrcReg - This form is used for instructions that use the Mod/RM byte
46 /// to specify a source, which in this case is a register.
50 /// MRMSrcMem - This form is used for instructions that use the Mod/RM byte
51 /// to specify a source, which in this case is memory.
55 /// TODO: Mod/RM that uses a fixed opcode extension, like /0
59 //===------------------------------------------------------------------===//
62 /// Void - Set if this instruction produces no value
65 // TB - TwoByte - Set if this instruction has a two byte opcode, which
66 // starts with a 0x0F byte before the real opcode.
69 // OpSize - Set if this instruction requires an operand size prefix (0x66),
70 // which most often indicates that the instruction operates on 16 bit data
71 // instead of 32 bit data.
76 class X86InstrInfo : public MachineInstrInfo {
77 const X86RegisterInfo RI;
81 /// getRegisterInfo - MachineInstrInfo is a superset of MRegister info. As
82 /// such, whenever a client has an instance of instruction info, it should
83 /// always be able to get register info as well (through this method).
85 virtual const MRegisterInfo &getRegisterInfo() const { return RI; }
87 /// print - Print out an x86 instruction in intel syntax
89 virtual void print(const MachineInstr *MI, std::ostream &O,
90 const TargetMachine &TM) const;
92 // getBaseOpcodeFor - This function returns the "base" X86 opcode for the
93 // specified opcode number.
95 unsigned char getBaseOpcodeFor(unsigned Opcode) const;
99 //===--------------------------------------------------------------------===//
101 // These are stubs for pure virtual methods that should be factored out of
102 // MachineInstrInfo. We never call them, we don't want them, but we need
103 // stubs so that we can instatiate our class.
105 MachineOpCode getNOPOpCode() const { abort(); }
106 void CreateCodeToLoadConst(const TargetMachine& target, Function* F,
107 Value *V, Instruction *I,
108 std::vector<MachineInstr*>& mvec,
109 MachineCodeForInstruction& mcfi) const { abort(); }
110 void CreateCodeToCopyIntToFloat(const TargetMachine& target,
111 Function* F, Value* val, Instruction* dest,
112 std::vector<MachineInstr*>& mvec,
113 MachineCodeForInstruction& mcfi) const {
116 void CreateCodeToCopyFloatToInt(const TargetMachine& target, Function* F,
117 Value* val, Instruction* dest,
118 std::vector<MachineInstr*>& mvec,
119 MachineCodeForInstruction& mcfi)const {
122 void CreateCopyInstructionsByType(const TargetMachine& target,
123 Function* F, Value* src,
125 std::vector<MachineInstr*>& mvec,
126 MachineCodeForInstruction& mcfi)const {
130 void CreateSignExtensionInstructions(const TargetMachine& target,
131 Function* F, Value* srcVal,
132 Value* destVal, unsigned numLowBits,
133 std::vector<MachineInstr*>& mvec,
134 MachineCodeForInstruction& mcfi) const {
138 void CreateZeroExtensionInstructions(const TargetMachine& target,
139 Function* F, Value* srcVal,
140 Value* destVal, unsigned srcSizeInBits,
141 std::vector<MachineInstr*>& mvec,
142 MachineCodeForInstruction& mcfi) const {