| 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 |