OLD | NEW |
1 //===- R600MCCodeEmitter.cpp - Code Emitter for R600->Cayman GPU families -===// | 1 //===- R600MCCodeEmitter.cpp - Code Emitter for R600->Cayman GPU families -===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 /// \file | 10 /// \file |
(...skipping 18 matching lines...) Expand all Loading... |
29 using namespace llvm; | 29 using namespace llvm; |
30 | 30 |
31 namespace { | 31 namespace { |
32 | 32 |
33 class R600MCCodeEmitter : public AMDGPUMCCodeEmitter { | 33 class R600MCCodeEmitter : public AMDGPUMCCodeEmitter { |
34 R600MCCodeEmitter(const R600MCCodeEmitter &) LLVM_DELETED_FUNCTION; | 34 R600MCCodeEmitter(const R600MCCodeEmitter &) LLVM_DELETED_FUNCTION; |
35 void operator=(const R600MCCodeEmitter &) LLVM_DELETED_FUNCTION; | 35 void operator=(const R600MCCodeEmitter &) LLVM_DELETED_FUNCTION; |
36 const MCInstrInfo &MCII; | 36 const MCInstrInfo &MCII; |
37 const MCRegisterInfo &MRI; | 37 const MCRegisterInfo &MRI; |
38 const MCSubtargetInfo &STI; | 38 const MCSubtargetInfo &STI; |
| 39 MCContext &Ctx; |
39 | 40 |
40 public: | 41 public: |
41 | 42 |
42 R600MCCodeEmitter(const MCInstrInfo &mcii, const MCRegisterInfo &mri, | 43 R600MCCodeEmitter(const MCInstrInfo &mcii, const MCRegisterInfo &mri, |
43 const MCSubtargetInfo &sti) | 44 const MCSubtargetInfo &sti, MCContext &ctx) |
44 : MCII(mcii), MRI(mri), STI(sti) { } | 45 : MCII(mcii), MRI(mri), STI(sti), Ctx(ctx) { } |
45 | 46 |
46 /// \brief Encode the instruction and write it to the OS. | 47 /// \brief Encode the instruction and write it to the OS. |
47 virtual void EncodeInstruction(const MCInst &MI, raw_ostream &OS, | 48 virtual void EncodeInstruction(const MCInst &MI, raw_ostream &OS, |
48 SmallVectorImpl<MCFixup> &Fixups) const; | 49 SmallVectorImpl<MCFixup> &Fixups) const; |
49 | 50 |
50 /// \returns the encoding for an MCOperand. | 51 /// \returns the encoding for an MCOperand. |
51 virtual uint64_t getMachineOpValue(const MCInst &MI, const MCOperand &MO, | 52 virtual uint64_t getMachineOpValue(const MCInst &MI, const MCOperand &MO, |
52 SmallVectorImpl<MCFixup> &Fixups) const; | 53 SmallVectorImpl<MCFixup> &Fixups) const; |
53 private: | 54 private: |
54 | 55 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 TEXTURE_SHADOW2D, | 92 TEXTURE_SHADOW2D, |
92 TEXTURE_SHADOWRECT, | 93 TEXTURE_SHADOWRECT, |
93 TEXTURE_1D_ARRAY, | 94 TEXTURE_1D_ARRAY, |
94 TEXTURE_2D_ARRAY, | 95 TEXTURE_2D_ARRAY, |
95 TEXTURE_SHADOW1D_ARRAY, | 96 TEXTURE_SHADOW1D_ARRAY, |
96 TEXTURE_SHADOW2D_ARRAY | 97 TEXTURE_SHADOW2D_ARRAY |
97 }; | 98 }; |
98 | 99 |
99 MCCodeEmitter *llvm::createR600MCCodeEmitter(const MCInstrInfo &MCII, | 100 MCCodeEmitter *llvm::createR600MCCodeEmitter(const MCInstrInfo &MCII, |
100 const MCRegisterInfo &MRI, | 101 const MCRegisterInfo &MRI, |
101 const MCSubtargetInfo &STI) { | 102 const MCSubtargetInfo &STI, |
102 return new R600MCCodeEmitter(MCII, MRI, STI); | 103 MCContext &Ctx) { |
| 104 return new R600MCCodeEmitter(MCII, MRI, STI, Ctx); |
103 } | 105 } |
104 | 106 |
105 void R600MCCodeEmitter::EncodeInstruction(const MCInst &MI, raw_ostream &OS, | 107 void R600MCCodeEmitter::EncodeInstruction(const MCInst &MI, raw_ostream &OS, |
106 SmallVectorImpl<MCFixup> &Fixups) const { | 108 SmallVectorImpl<MCFixup> &Fixups) const { |
107 const MCInstrDesc &Desc = MCII.get(MI.getOpcode()); | 109 const MCInstrDesc &Desc = MCII.get(MI.getOpcode()); |
108 if (MI.getOpcode() == AMDGPU::RETURN || | 110 if (MI.getOpcode() == AMDGPU::RETURN || |
109 MI.getOpcode() == AMDGPU::FETCH_CLAUSE || | 111 MI.getOpcode() == AMDGPU::FETCH_CLAUSE || |
110 MI.getOpcode() == AMDGPU::ALU_CLAUSE || | 112 MI.getOpcode() == AMDGPU::ALU_CLAUSE || |
111 MI.getOpcode() == AMDGPU::BUNDLE || | 113 MI.getOpcode() == AMDGPU::BUNDLE || |
112 MI.getOpcode() == AMDGPU::KILL) { | 114 MI.getOpcode() == AMDGPU::KILL) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 uint32_t Word2 = Sampler << 15 | SrcSelect[ELEMENT_X] << 20 | | 174 uint32_t Word2 = Sampler << 15 | SrcSelect[ELEMENT_X] << 20 | |
173 SrcSelect[ELEMENT_Y] << 23 | SrcSelect[ELEMENT_Z] << 26 | | 175 SrcSelect[ELEMENT_Y] << 23 | SrcSelect[ELEMENT_Z] << 26 | |
174 SrcSelect[ELEMENT_W] << 29 | Offsets[0] << 0 | Offsets[1] << 5 | | 176 SrcSelect[ELEMENT_W] << 29 | Offsets[0] << 0 | Offsets[1] << 5 | |
175 Offsets[2] << 10; | 177 Offsets[2] << 10; |
176 | 178 |
177 Emit(Word01, OS); | 179 Emit(Word01, OS); |
178 Emit(Word2, OS); | 180 Emit(Word2, OS); |
179 Emit((u_int32_t) 0, OS); | 181 Emit((u_int32_t) 0, OS); |
180 } else { | 182 } else { |
181 uint64_t Inst = getBinaryCodeForInstr(MI, Fixups); | 183 uint64_t Inst = getBinaryCodeForInstr(MI, Fixups); |
182 if ((STI.getFeatureBits() & AMDGPU::FeatureR600ALUInst) && | |
183 ((Desc.TSFlags & R600_InstFlag::OP1) || | |
184 Desc.TSFlags & R600_InstFlag::OP2)) { | |
185 uint64_t ISAOpCode = Inst & (0x3FFULL << 39); | |
186 Inst &= ~(0x3FFULL << 39); | |
187 Inst |= ISAOpCode << 1; | |
188 } | |
189 Emit(Inst, OS); | 184 Emit(Inst, OS); |
190 } | 185 } |
191 } | 186 } |
192 | 187 |
193 void R600MCCodeEmitter::EmitByte(unsigned int Byte, raw_ostream &OS) const { | 188 void R600MCCodeEmitter::EmitByte(unsigned int Byte, raw_ostream &OS) const { |
194 OS.write((uint8_t) Byte & 0xff); | 189 OS.write((uint8_t) Byte & 0xff); |
195 } | 190 } |
196 | 191 |
197 void R600MCCodeEmitter::Emit(uint32_t Value, raw_ostream &OS) const { | 192 void R600MCCodeEmitter::Emit(uint32_t Value, raw_ostream &OS) const { |
198 for (unsigned i = 0; i < 4; i++) { | 193 for (unsigned i = 0; i < 4; i++) { |
(...skipping 26 matching lines...) Expand all Loading... |
225 } | 220 } |
226 } else if (MO.isImm()) { | 221 } else if (MO.isImm()) { |
227 return MO.getImm(); | 222 return MO.getImm(); |
228 } else { | 223 } else { |
229 assert(0); | 224 assert(0); |
230 return 0; | 225 return 0; |
231 } | 226 } |
232 } | 227 } |
233 | 228 |
234 #include "AMDGPUGenMCCodeEmitter.inc" | 229 #include "AMDGPUGenMCCodeEmitter.inc" |
OLD | NEW |