summaryrefslogtreecommitdiff
path: root/lib/SPIRV/libSPIRV/SPIRVValue.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/SPIRV/libSPIRV/SPIRVValue.h')
-rw-r--r--lib/SPIRV/libSPIRV/SPIRVValue.h814
1 files changed, 407 insertions, 407 deletions
diff --git a/lib/SPIRV/libSPIRV/SPIRVValue.h b/lib/SPIRV/libSPIRV/SPIRVValue.h
index 812a635..419aed7 100644
--- a/lib/SPIRV/libSPIRV/SPIRVValue.h
+++ b/lib/SPIRV/libSPIRV/SPIRVValue.h
@@ -1,407 +1,407 @@
-//===- SPIRVValue.h - Class to represent a SPIR-V Value ----------*- C++ -*-===//
-//
-// The LLVM/SPIRV Translator
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-// Copyright (c) 2014 Advanced Micro Devices, Inc. All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the "Software"),
-// to deal with the Software without restriction, including without limitation
-// the rights to use, copy, modify, merge, publish, distribute, sublicense,
-// and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimers.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimers in the documentation
-// and/or other materials provided with the distribution.
-// Neither the names of Advanced Micro Devices, Inc., nor the names of its
-// contributors may be used to endorse or promote products derived from this
-// Software without specific prior written permission.
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH
-// THE SOFTWARE.
-//
-//===----------------------------------------------------------------------===//
-/// \file
-///
-/// This file defines the values defined in SPIR-V spec with op codes.
-///
-/// The name of the SPIR-V values follow the op code name in the spec.
-/// This is for readability and ease of using macro to handle types.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef SPIRVVALUE_HPP_
-#define SPIRVVALUE_HPP_
-
-#include "SPIRVEntry.h"
-#include "SPIRVType.h"
-#include "SPIRVDecorate.h"
-
-#include <iostream>
-#include <map>
-#include <memory>
-
-namespace SPIRV{
-
-class SPIRVValue: public SPIRVEntry {
-public:
- // Complete constructor for value with id and type
- SPIRVValue(SPIRVModule *M, unsigned TheWordCount, Op TheOpCode,
- SPIRVType *TheType, SPIRVId TheId)
- :SPIRVEntry(M, TheWordCount, TheOpCode, TheId), Type(TheType) {
- validate();
- }
- // Complete constructor for value with type but without id
- SPIRVValue(SPIRVModule *M, unsigned TheWordCount, Op TheOpCode,
- SPIRVType *TheType)
- :SPIRVEntry(M, TheWordCount, TheOpCode), Type(TheType) {
- setHasNoId();
- validate();
- }
- // Complete constructor for value with id but without type
- SPIRVValue(SPIRVModule *M, unsigned TheWordCount, Op TheOpCode,
- SPIRVId TheId)
- :SPIRVEntry(M, TheWordCount, TheOpCode, TheId), Type(NULL) {
- setHasNoType();
- validate();
- }
- // Complete constructor for value without id and type
- SPIRVValue(SPIRVModule *M, unsigned TheWordCount, Op TheOpCode)
- :SPIRVEntry(M, TheWordCount, TheOpCode), Type(NULL) {
- setHasNoId();
- setHasNoType();
- validate();
- }
- // Incomplete constructor
- SPIRVValue(Op TheOpCode):SPIRVEntry(TheOpCode), Type(NULL) {}
-
- bool hasType()const { return !(Attrib & SPIRVEA_NOTYPE);}
- SPIRVType *getType()const {
- assert(hasType() && "value has no type");
- return Type;
- }
- bool isVolatile()const;
- bool hasAlignment(SPIRVWord *Result=0)const;
-
- void setAlignment(SPIRVWord);
- void setVolatile(bool IsVolatile);
-
- void validate()const {
- SPIRVEntry::validate();
- assert((!hasType() || Type) && "Invalid type");
- }
-
- void setType(SPIRVType *Ty) {
- Type = Ty;
- assert(!Ty || !Ty->isTypeVoid() || OpCode == OpFunction);
- if (Ty && (!Ty->isTypeVoid() || OpCode == OpFunction))
- setHasType();
- else
- setHasNoType();
- }
-
- SPIRVCapVec getRequiredCapability() const {
- SPIRVCapVec CV;
- if (!hasType())
- return std::move(CV);
- return std::move(Type->getRequiredCapability());
- }
-
-protected:
- void setHasNoType() { Attrib |= SPIRVEA_NOTYPE;}
- void setHasType() { Attrib &= ~SPIRVEA_NOTYPE;}
-
- SPIRVType *Type; // Value Type
-};
-
-class SPIRVConstant: public SPIRVValue {
-public:
- // Complete constructor for integer constant
- SPIRVConstant(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId,
- uint64_t TheValue)
- :SPIRVValue(M, 0, OpConstant, TheType, TheId){
- Union.UInt64Val = TheValue;
- recalculateWordCount();
- validate();
- }
- // Complete constructor for float constant
- SPIRVConstant(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId, float TheValue)
- :SPIRVValue(M, 0, OpConstant, TheType, TheId){
- Union.FloatVal = TheValue;
- recalculateWordCount();
- validate();
- }
- // Complete constructor for double constant
- SPIRVConstant(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId, double TheValue)
- :SPIRVValue(M, 0, OpConstant, TheType, TheId){
- Union.DoubleVal = TheValue;
- recalculateWordCount();
- validate();
- }
- // Incomplete constructor
- SPIRVConstant():SPIRVValue(OpConstant), NumWords(0){}
- uint64_t getZExtIntValue() const { return Union.UInt64Val;}
- float getFloatValue() const { return Union.FloatVal;}
- double getDoubleValue() const { return Union.DoubleVal;}
-protected:
- void recalculateWordCount() {
- NumWords = Type->getBitWidth()/32;
- if (NumWords < 1)
- NumWords = 1;
- WordCount = 3 + NumWords;
- }
- void validate() const {
- SPIRVValue::validate();
- assert(NumWords >= 1 && NumWords <= 2 && "Invalid constant size");
- }
- void encode(spv_ostream &O) const {
- getEncoder(O) << Type << Id;
- for (unsigned i = 0; i < NumWords; ++i)
- getEncoder(O) << Union.Words[i];
- }
- void setWordCount(SPIRVWord WordCount) {
- SPIRVValue::setWordCount(WordCount);
- NumWords = WordCount - 3;
- }
- void decode(std::istream &I) {
- getDecoder(I) >> Type >> Id;
- for (unsigned i = 0; i < NumWords; ++i)
- getDecoder(I) >> Union.Words[i];
- }
-
- unsigned NumWords;
- union UnionType{
- uint64_t UInt64Val;
- float FloatVal;
- double DoubleVal;
- SPIRVWord Words[2];
- UnionType() {
- UInt64Val = 0;
- }
- } Union;
-};
-
-template<Op OC>
-class SPIRVConstantEmpty: public SPIRVValue {
-public:
- // Complete constructor
- SPIRVConstantEmpty(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId)
- :SPIRVValue(M, 3, OC, TheType, TheId){
- validate();
- }
- // Incomplete constructor
- SPIRVConstantEmpty():SPIRVValue(OC){}
-protected:
- void validate() const {
- SPIRVValue::validate();
- }
- _SPIRV_DEF_ENCDEC2(Type, Id)
-};
-
-template<Op OC>
-class SPIRVConstantBool: public SPIRVConstantEmpty<OC> {
-public:
- // Complete constructor
- SPIRVConstantBool(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId)
- :SPIRVConstantEmpty<OC>(M, TheType, TheId){}
- // Incomplete constructor
- SPIRVConstantBool(){}
-protected:
- void validate() const {
- SPIRVConstantEmpty<OC>::validate();
- assert(this->Type->isTypeBool() && "Invalid type");
- }
-};
-
-typedef SPIRVConstantBool<OpConstantTrue> SPIRVConstantTrue;
-typedef SPIRVConstantBool<OpConstantFalse> SPIRVConstantFalse;
-
-class SPIRVConstantNull:
- public SPIRVConstantEmpty<OpConstantNull> {
-public:
- // Complete constructor
- SPIRVConstantNull(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId)
- :SPIRVConstantEmpty(M, TheType, TheId){
- validate();
- }
- // Incomplete constructor
- SPIRVConstantNull(){}
-protected:
- void validate() const {
- SPIRVConstantEmpty::validate();
- assert((Type->isTypeComposite() ||
- Type->isTypeOpaque() ||
- Type->isTypeEvent() ||
- Type->isTypePointer() ||
- Type->isTypeReserveId() ||
- Type->isTypeDeviceEvent()) &&
- "Invalid type");
- }
-};
-
-class SPIRVUndef:
- public SPIRVConstantEmpty<OpUndef> {
-public:
- // Complete constructor
- SPIRVUndef(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId)
- :SPIRVConstantEmpty(M, TheType, TheId){
- validate();
- }
- // Incomplete constructor
- SPIRVUndef(){}
-protected:
- void validate() const {
- SPIRVConstantEmpty::validate();
- }
-};
-
-class SPIRVConstantComposite: public SPIRVValue {
-public:
- // Complete constructor for composite constant
- SPIRVConstantComposite(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId,
- const std::vector<SPIRVValue *> TheElements)
- :SPIRVValue(M, TheElements.size()+3, OpConstantComposite, TheType,
- TheId){
- Elements = getIds(TheElements);
- validate();
- }
- // Incomplete constructor
- SPIRVConstantComposite():SPIRVValue(OpConstantComposite){}
- std::vector<SPIRVValue*> getElements()const {
- return getValues(Elements);
- }
- std::vector<SPIRVEntry*> getNonLiteralOperands() const {
- std::vector<SPIRVValue*> Elements = getElements();
- return std::vector<SPIRVEntry*>(Elements.begin(), Elements.end());
- }
-protected:
- void validate() const {
- SPIRVValue::validate();
- for (auto &I:Elements)
- getValue(I)->validate();
- }
- void setWordCount(SPIRVWord WordCount) {
- SPIRVEntry::setWordCount(WordCount);
- Elements.resize(WordCount - 3);
- }
- _SPIRV_DEF_ENCDEC3(Type, Id, Elements)
-
- std::vector<SPIRVId> Elements;
-};
-
-class SPIRVConstantSampler: public SPIRVValue {
-public:
- const static Op OC = OpConstantSampler;
- const static SPIRVWord WC = 6;
- // Complete constructor
- SPIRVConstantSampler(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId,
- SPIRVWord TheAddrMode, SPIRVWord TheNormalized, SPIRVWord TheFilterMode)
- :SPIRVValue(M, WC, OC, TheType, TheId), AddrMode(TheAddrMode),
- Normalized(TheNormalized), FilterMode(TheFilterMode){
- validate();
- }
- // Incomplete constructor
- SPIRVConstantSampler():SPIRVValue(OC), AddrMode(SPIRVSAM_Invalid),
- Normalized(SPIRVWORD_MAX), FilterMode(SPIRVSFM_Invalid){}
-
- SPIRVWord getAddrMode() const {
- return AddrMode;
- }
-
- SPIRVWord getFilterMode() const {
- return FilterMode;
- }
-
- SPIRVWord getNormalized() const {
- return Normalized;
- }
- SPIRVCapVec getRequiredCapability() const {
- return getVec(CapabilityLiteralSampler);
- }
-protected:
- SPIRVWord AddrMode;
- SPIRVWord Normalized;
- SPIRVWord FilterMode;
- void validate() const {
- SPIRVValue::validate();
- assert(OpCode == OC);
- assert(WordCount == WC);
- assert(Type->isTypeSampler());
- }
- _SPIRV_DEF_ENCDEC5(Type, Id, AddrMode, Normalized, FilterMode)
-};
-
-class SPIRVConstantPipeStorage : public SPIRVValue {
-public:
- const static Op OC = OpConstantPipeStorage;
- const static SPIRVWord WC = 6;
- // Complete constructor
- SPIRVConstantPipeStorage(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId,
- SPIRVWord ThePacketSize, SPIRVWord ThePacketAlign, SPIRVWord TheCapacity)
- :SPIRVValue(M, WC, OC, TheType, TheId), PacketSize(ThePacketSize),
- PacketAlign(ThePacketAlign), Capacity(TheCapacity){
- validate();
- }
- // Incomplete constructor
- SPIRVConstantPipeStorage() :SPIRVValue(OC), PacketSize(0),
- PacketAlign(0), Capacity(0){}
-
- SPIRVWord getPacketSize() const {
- return PacketSize;
- }
-
- SPIRVWord getPacketAlign() const {
- return PacketAlign;
- }
-
- SPIRVWord getCapacity() const {
- return Capacity;
- }
- SPIRVCapVec getRequiredCapability() const {
- return getVec(CapabilityPipes, CapabilityPipeStorage);
- }
-protected:
- SPIRVWord PacketSize;
- SPIRVWord PacketAlign;
- SPIRVWord Capacity;
- void validate() const {
- SPIRVValue::validate();
- assert(OpCode == OC);
- assert(WordCount == WC);
- assert(Type->isTypePipeStorage());
- }
- _SPIRV_DEF_ENCDEC5(Type, Id, PacketSize, PacketAlign, Capacity)
-};
-
-class SPIRVForward:public SPIRVValue, public SPIRVComponentExecutionModes {
-public:
- const static Op OC = OpForward;
- // Complete constructor
- SPIRVForward(SPIRVModule *TheModule, SPIRVType *TheTy, SPIRVId TheId):
- SPIRVValue(TheModule, 0, OC, TheId){
- if (TheTy)
- setType(TheTy);
- }
- SPIRVForward():SPIRVValue(OC) {
- assert(0 && "should never be called");
- }
- _SPIRV_DEF_ENCDEC1(Id)
- friend class SPIRVFunction;
-protected:
- void validate() const {}
-};
-
-}
-
-
-#endif /* SPIRVVALUE_HPP_ */
+//===- SPIRVValue.h - Class to represent a SPIR-V Value ----------*- C++ -*-===//
+//
+// The LLVM/SPIRV Translator
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+// Copyright (c) 2014 Advanced Micro Devices, Inc. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal with the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimers.
+// Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimers in the documentation
+// and/or other materials provided with the distribution.
+// Neither the names of Advanced Micro Devices, Inc., nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// Software without specific prior written permission.
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH
+// THE SOFTWARE.
+//
+//===----------------------------------------------------------------------===//
+/// \file
+///
+/// This file defines the values defined in SPIR-V spec with op codes.
+///
+/// The name of the SPIR-V values follow the op code name in the spec.
+/// This is for readability and ease of using macro to handle types.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SPIRVVALUE_HPP_
+#define SPIRVVALUE_HPP_
+
+#include "SPIRVEntry.h"
+#include "SPIRVType.h"
+#include "SPIRVDecorate.h"
+
+#include <iostream>
+#include <map>
+#include <memory>
+
+namespace SPIRV{
+
+class SPIRVValue: public SPIRVEntry {
+public:
+ // Complete constructor for value with id and type
+ SPIRVValue(SPIRVModule *M, unsigned TheWordCount, Op TheOpCode,
+ SPIRVType *TheType, SPIRVId TheId)
+ :SPIRVEntry(M, TheWordCount, TheOpCode, TheId), Type(TheType) {
+ validate();
+ }
+ // Complete constructor for value with type but without id
+ SPIRVValue(SPIRVModule *M, unsigned TheWordCount, Op TheOpCode,
+ SPIRVType *TheType)
+ :SPIRVEntry(M, TheWordCount, TheOpCode), Type(TheType) {
+ setHasNoId();
+ validate();
+ }
+ // Complete constructor for value with id but without type
+ SPIRVValue(SPIRVModule *M, unsigned TheWordCount, Op TheOpCode,
+ SPIRVId TheId)
+ :SPIRVEntry(M, TheWordCount, TheOpCode, TheId), Type(NULL) {
+ setHasNoType();
+ validate();
+ }
+ // Complete constructor for value without id and type
+ SPIRVValue(SPIRVModule *M, unsigned TheWordCount, Op TheOpCode)
+ :SPIRVEntry(M, TheWordCount, TheOpCode), Type(NULL) {
+ setHasNoId();
+ setHasNoType();
+ validate();
+ }
+ // Incomplete constructor
+ SPIRVValue(Op TheOpCode):SPIRVEntry(TheOpCode), Type(NULL) {}
+
+ bool hasType()const { return !(Attrib & SPIRVEA_NOTYPE);}
+ SPIRVType *getType()const {
+ assert(hasType() && "value has no type");
+ return Type;
+ }
+ bool isVolatile()const;
+ bool hasAlignment(SPIRVWord *Result=0)const;
+
+ void setAlignment(SPIRVWord);
+ void setVolatile(bool IsVolatile);
+
+ void validate()const {
+ SPIRVEntry::validate();
+ assert((!hasType() || Type) && "Invalid type");
+ }
+
+ void setType(SPIRVType *Ty) {
+ Type = Ty;
+ assert(!Ty || !Ty->isTypeVoid() || OpCode == OpFunction);
+ if (Ty && (!Ty->isTypeVoid() || OpCode == OpFunction))
+ setHasType();
+ else
+ setHasNoType();
+ }
+
+ SPIRVCapVec getRequiredCapability() const {
+ SPIRVCapVec CV;
+ if (!hasType())
+ return std::move(CV);
+ return std::move(Type->getRequiredCapability());
+ }
+
+protected:
+ void setHasNoType() { Attrib |= SPIRVEA_NOTYPE;}
+ void setHasType() { Attrib &= ~SPIRVEA_NOTYPE;}
+
+ SPIRVType *Type; // Value Type
+};
+
+class SPIRVConstant: public SPIRVValue {
+public:
+ // Complete constructor for integer constant
+ SPIRVConstant(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId,
+ uint64_t TheValue)
+ :SPIRVValue(M, 0, OpConstant, TheType, TheId){
+ Union.UInt64Val = TheValue;
+ recalculateWordCount();
+ validate();
+ }
+ // Complete constructor for float constant
+ SPIRVConstant(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId, float TheValue)
+ :SPIRVValue(M, 0, OpConstant, TheType, TheId){
+ Union.FloatVal = TheValue;
+ recalculateWordCount();
+ validate();
+ }
+ // Complete constructor for double constant
+ SPIRVConstant(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId, double TheValue)
+ :SPIRVValue(M, 0, OpConstant, TheType, TheId){
+ Union.DoubleVal = TheValue;
+ recalculateWordCount();
+ validate();
+ }
+ // Incomplete constructor
+ SPIRVConstant():SPIRVValue(OpConstant), NumWords(0){}
+ uint64_t getZExtIntValue() const { return Union.UInt64Val;}
+ float getFloatValue() const { return Union.FloatVal;}
+ double getDoubleValue() const { return Union.DoubleVal;}
+protected:
+ void recalculateWordCount() {
+ NumWords = Type->getBitWidth()/32;
+ if (NumWords < 1)
+ NumWords = 1;
+ WordCount = 3 + NumWords;
+ }
+ void validate() const {
+ SPIRVValue::validate();
+ assert(NumWords >= 1 && NumWords <= 2 && "Invalid constant size");
+ }
+ void encode(spv_ostream &O) const {
+ getEncoder(O) << Type << Id;
+ for (unsigned i = 0; i < NumWords; ++i)
+ getEncoder(O) << Union.Words[i];
+ }
+ void setWordCount(SPIRVWord WordCount) {
+ SPIRVValue::setWordCount(WordCount);
+ NumWords = WordCount - 3;
+ }
+ void decode(std::istream &I) {
+ getDecoder(I) >> Type >> Id;
+ for (unsigned i = 0; i < NumWords; ++i)
+ getDecoder(I) >> Union.Words[i];
+ }
+
+ unsigned NumWords;
+ union UnionType{
+ uint64_t UInt64Val;
+ float FloatVal;
+ double DoubleVal;
+ SPIRVWord Words[2];
+ UnionType() {
+ UInt64Val = 0;
+ }
+ } Union;
+};
+
+template<Op OC>
+class SPIRVConstantEmpty: public SPIRVValue {
+public:
+ // Complete constructor
+ SPIRVConstantEmpty(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId)
+ :SPIRVValue(M, 3, OC, TheType, TheId){
+ validate();
+ }
+ // Incomplete constructor
+ SPIRVConstantEmpty():SPIRVValue(OC){}
+protected:
+ void validate() const {
+ SPIRVValue::validate();
+ }
+ _SPIRV_DEF_ENCDEC2(Type, Id)
+};
+
+template<Op OC>
+class SPIRVConstantBool: public SPIRVConstantEmpty<OC> {
+public:
+ // Complete constructor
+ SPIRVConstantBool(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId)
+ :SPIRVConstantEmpty<OC>(M, TheType, TheId){}
+ // Incomplete constructor
+ SPIRVConstantBool(){}
+protected:
+ void validate() const {
+ SPIRVConstantEmpty<OC>::validate();
+ assert(this->Type->isTypeBool() && "Invalid type");
+ }
+};
+
+typedef SPIRVConstantBool<OpConstantTrue> SPIRVConstantTrue;
+typedef SPIRVConstantBool<OpConstantFalse> SPIRVConstantFalse;
+
+class SPIRVConstantNull:
+ public SPIRVConstantEmpty<OpConstantNull> {
+public:
+ // Complete constructor
+ SPIRVConstantNull(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId)
+ :SPIRVConstantEmpty(M, TheType, TheId){
+ validate();
+ }
+ // Incomplete constructor
+ SPIRVConstantNull(){}
+protected:
+ void validate() const {
+ SPIRVConstantEmpty::validate();
+ assert((Type->isTypeComposite() ||
+ Type->isTypeOpaque() ||
+ Type->isTypeEvent() ||
+ Type->isTypePointer() ||
+ Type->isTypeReserveId() ||
+ Type->isTypeDeviceEvent()) &&
+ "Invalid type");
+ }
+};
+
+class SPIRVUndef:
+ public SPIRVConstantEmpty<OpUndef> {
+public:
+ // Complete constructor
+ SPIRVUndef(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId)
+ :SPIRVConstantEmpty(M, TheType, TheId){
+ validate();
+ }
+ // Incomplete constructor
+ SPIRVUndef(){}
+protected:
+ void validate() const {
+ SPIRVConstantEmpty::validate();
+ }
+};
+
+class SPIRVConstantComposite: public SPIRVValue {
+public:
+ // Complete constructor for composite constant
+ SPIRVConstantComposite(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId,
+ const std::vector<SPIRVValue *> TheElements)
+ :SPIRVValue(M, TheElements.size()+3, OpConstantComposite, TheType,
+ TheId){
+ Elements = getIds(TheElements);
+ validate();
+ }
+ // Incomplete constructor
+ SPIRVConstantComposite():SPIRVValue(OpConstantComposite){}
+ std::vector<SPIRVValue*> getElements()const {
+ return getValues(Elements);
+ }
+ std::vector<SPIRVEntry*> getNonLiteralOperands() const {
+ std::vector<SPIRVValue*> Elements = getElements();
+ return std::vector<SPIRVEntry*>(Elements.begin(), Elements.end());
+ }
+protected:
+ void validate() const {
+ SPIRVValue::validate();
+ for (auto &I:Elements)
+ getValue(I)->validate();
+ }
+ void setWordCount(SPIRVWord WordCount) {
+ SPIRVEntry::setWordCount(WordCount);
+ Elements.resize(WordCount - 3);
+ }
+ _SPIRV_DEF_ENCDEC3(Type, Id, Elements)
+
+ std::vector<SPIRVId> Elements;
+};
+
+class SPIRVConstantSampler: public SPIRVValue {
+public:
+ const static Op OC = OpConstantSampler;
+ const static SPIRVWord WC = 6;
+ // Complete constructor
+ SPIRVConstantSampler(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId,
+ SPIRVWord TheAddrMode, SPIRVWord TheNormalized, SPIRVWord TheFilterMode)
+ :SPIRVValue(M, WC, OC, TheType, TheId), AddrMode(TheAddrMode),
+ Normalized(TheNormalized), FilterMode(TheFilterMode){
+ validate();
+ }
+ // Incomplete constructor
+ SPIRVConstantSampler():SPIRVValue(OC), AddrMode(SPIRVSAM_Invalid),
+ Normalized(SPIRVWORD_MAX), FilterMode(SPIRVSFM_Invalid){}
+
+ SPIRVWord getAddrMode() const {
+ return AddrMode;
+ }
+
+ SPIRVWord getFilterMode() const {
+ return FilterMode;
+ }
+
+ SPIRVWord getNormalized() const {
+ return Normalized;
+ }
+ SPIRVCapVec getRequiredCapability() const {
+ return getVec(CapabilityLiteralSampler);
+ }
+protected:
+ SPIRVWord AddrMode;
+ SPIRVWord Normalized;
+ SPIRVWord FilterMode;
+ void validate() const {
+ SPIRVValue::validate();
+ assert(OpCode == OC);
+ assert(WordCount == WC);
+ assert(Type->isTypeSampler());
+ }
+ _SPIRV_DEF_ENCDEC5(Type, Id, AddrMode, Normalized, FilterMode)
+};
+
+class SPIRVConstantPipeStorage : public SPIRVValue {
+public:
+ const static Op OC = OpConstantPipeStorage;
+ const static SPIRVWord WC = 6;
+ // Complete constructor
+ SPIRVConstantPipeStorage(SPIRVModule *M, SPIRVType *TheType, SPIRVId TheId,
+ SPIRVWord ThePacketSize, SPIRVWord ThePacketAlign, SPIRVWord TheCapacity)
+ :SPIRVValue(M, WC, OC, TheType, TheId), PacketSize(ThePacketSize),
+ PacketAlign(ThePacketAlign), Capacity(TheCapacity){
+ validate();
+ }
+ // Incomplete constructor
+ SPIRVConstantPipeStorage() :SPIRVValue(OC), PacketSize(0),
+ PacketAlign(0), Capacity(0){}
+
+ SPIRVWord getPacketSize() const {
+ return PacketSize;
+ }
+
+ SPIRVWord getPacketAlign() const {
+ return PacketAlign;
+ }
+
+ SPIRVWord getCapacity() const {
+ return Capacity;
+ }
+ SPIRVCapVec getRequiredCapability() const {
+ return getVec(CapabilityPipes, CapabilityPipeStorage);
+ }
+protected:
+ SPIRVWord PacketSize;
+ SPIRVWord PacketAlign;
+ SPIRVWord Capacity;
+ void validate() const {
+ SPIRVValue::validate();
+ assert(OpCode == OC);
+ assert(WordCount == WC);
+ assert(Type->isTypePipeStorage());
+ }
+ _SPIRV_DEF_ENCDEC5(Type, Id, PacketSize, PacketAlign, Capacity)
+};
+
+class SPIRVForward:public SPIRVValue, public SPIRVComponentExecutionModes {
+public:
+ const static Op OC = OpForward;
+ // Complete constructor
+ SPIRVForward(SPIRVModule *TheModule, SPIRVType *TheTy, SPIRVId TheId):
+ SPIRVValue(TheModule, 0, OC, TheId){
+ if (TheTy)
+ setType(TheTy);
+ }
+ SPIRVForward():SPIRVValue(OC) {
+ assert(0 && "should never be called");
+ }
+ _SPIRV_DEF_ENCDEC1(Id)
+ friend class SPIRVFunction;
+protected:
+ void validate() const {}
+};
+
+}
+
+
+#endif /* SPIRVVALUE_HPP_ */