2 * Copyright 2011 Christoph Bumiller
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 #ifndef __NV50_IR_TARGET_H__
24 #define __NV50_IR_TARGET_H__
47 inline void apply(uint32_t *binary
, const RelocInfo
*info
) const;
64 // returns whether the instruction was encodable and written
65 virtual bool emitInstruction(Instruction
*) = 0;
67 virtual uint32_t getMinEncodingSize(const Instruction
*) const = 0;
69 void setCodeLocation(void *, uint32_t size
);
70 inline void *getCodeLocation() const { return code
; }
71 inline uint32_t getCodeSize() const { return codeSize
; }
73 bool addReloc(RelocEntry::Type
, int w
, uint32_t data
, uint32_t m
,
76 inline void *getRelocInfo() const { return relocInfo
; }
78 void prepareEmission(Program
*);
79 void prepareEmission(Function
*);
80 virtual void prepareEmission(BasicBlock
*);
82 void printBinary() const;
87 uint32_t codeSizeLimit
;
95 static Target
*create(uint32_t chipset
);
96 static void destroy(Target
*);
98 // 0x50 and 0x84 to 0xaf for nv50
99 // 0xc0 to 0xdf for nvc0
100 inline uint32_t getChipset() const { return chipset
; }
102 virtual CodeEmitter
*getCodeEmitter(Program::Type
) = 0;
104 // Drivers should upload this so we can use it from all programs.
105 // The address chosen is supplied to the relocation routine.
106 virtual void getBuiltinCode(const uint32_t **code
, uint32_t *size
) const = 0;
108 virtual bool runLegalizePass(Program
*, CGStage stage
) const = 0;
123 unsigned int minEncSize
: 4;
124 unsigned int vector
: 1;
125 unsigned int predicate
: 1;
126 unsigned int commutative
: 1;
127 unsigned int pseudo
: 1;
128 unsigned int flow
: 1;
129 unsigned int hasDest
: 1;
130 unsigned int terminator
: 1;
133 inline const OpInfo
& getOpInfo(const Instruction
*) const;
134 inline const OpInfo
& getOpInfo(const operation
) const;
136 inline DataFile
nativeFile(DataFile f
) const;
138 virtual bool insnCanLoad(const Instruction
*insn
, int s
,
139 const Instruction
*ld
) const = 0;
140 virtual bool isOpSupported(operation
, DataType
) const = 0;
141 virtual bool isAccessSupported(DataFile
, DataType
) const = 0;
142 virtual bool isModSupported(const Instruction
*,
143 int s
, Modifier
) const = 0;
144 virtual bool isSatSupported(const Instruction
*) const = 0;
145 virtual bool isPostMultiplySupported(operation op
, float f
,
146 int& e
) const { return false; }
147 virtual bool mayPredicate(const Instruction
*,
148 const Value
*) const = 0;
150 virtual int getLatency(const Instruction
*) const { return 1; }
151 virtual int getThroughput(const Instruction
*) const { return 1; }
153 virtual unsigned int getFileSize(DataFile
) const = 0;
154 virtual unsigned int getFileUnit(DataFile
) const = 0;
156 virtual uint32_t getSVAddress(DataFile
, const Symbol
*) const = 0;
159 bool joinAnterior
; // true if join is executed before the op
161 static const uint8_t operationSrcNr
[OP_LAST
+ 1];
166 DataFile nativeFileMap
[DATA_FILE_COUNT
];
168 OpInfo opInfo
[OP_LAST
+ 1];
171 const Target::OpInfo
& Target::getOpInfo(const Instruction
*insn
) const
173 return opInfo
[MIN2(insn
->op
, OP_LAST
)];
176 const Target::OpInfo
& Target::getOpInfo(const operation op
) const
181 inline DataFile
Target::nativeFile(DataFile f
) const
183 return nativeFileMap
[f
];
186 } // namespace nv50_ir
188 #endif // __NV50_IR_TARGET_H__