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.
71 class X86InstrInfo : public MachineInstrInfo {
72 const X86RegisterInfo RI;
76 /// getRegisterInfo - MachineInstrInfo is a superset of MRegister info. As
77 /// such, whenever a client has an instance of instruction info, it should
78 /// always be able to get register info as well (through this method).
80 virtual const MRegisterInfo &getRegisterInfo() const { return RI; }
82 /// print - Print out an x86 instruction in intel syntax
84 virtual void print(const MachineInstr *MI, std::ostream &O,
85 const TargetMachine &TM) const;
87 // getBaseOpcodeFor - This function returns the "base" X86 opcode for the
88 // specified opcode number.
90 unsigned char getBaseOpcodeFor(unsigned Opcode) const;
94 //===--------------------------------------------------------------------===//
96 // These are stubs for pure virtual methods that should be factored out of
97 // MachineInstrInfo. We never call them, we don't want them, but we need
98 // stubs so that we can instatiate our class.
100 MachineOpCode getNOPOpCode() const { abort(); }
101 void CreateCodeToLoadConst(const TargetMachine& target, Function* F,
102 Value *V, Instruction *I,
103 std::vector<MachineInstr*>& mvec,
104 MachineCodeForInstruction& mcfi) const { abort(); }
105 void CreateCodeToCopyIntToFloat(const TargetMachine& target,
106 Function* F, Value* val, Instruction* dest,
107 std::vector<MachineInstr*>& mvec,
108 MachineCodeForInstruction& mcfi) const {
111 void CreateCodeToCopyFloatToInt(const TargetMachine& target, Function* F,
112 Value* val, Instruction* dest,
113 std::vector<MachineInstr*>& mvec,
114 MachineCodeForInstruction& mcfi)const {
117 void CreateCopyInstructionsByType(const TargetMachine& target,
118 Function* F, Value* src,
120 std::vector<MachineInstr*>& mvec,
121 MachineCodeForInstruction& mcfi)const {
125 void CreateSignExtensionInstructions(const TargetMachine& target,
126 Function* F, Value* srcVal,
127 Value* destVal, unsigned numLowBits,
128 std::vector<MachineInstr*>& mvec,
129 MachineCodeForInstruction& mcfi) const {
133 void CreateZeroExtensionInstructions(const TargetMachine& target,
134 Function* F, Value* srcVal,
135 Value* destVal, unsigned srcSizeInBits,
136 std::vector<MachineInstr*>& mvec,
137 MachineCodeForInstruction& mcfi) const {