1 // Copyright 2020 The Tint Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "src/sem/intrinsic.h"
16
17 #include <vector>
18
19 #include "src/utils/to_const_ptr_vec.h"
20
21 TINT_INSTANTIATE_TYPEINFO(tint::sem::Intrinsic);
22
23 namespace tint {
24 namespace sem {
25
str() const26 const char* Intrinsic::str() const {
27 return sem::str(type_);
28 }
29
IsCoarseDerivativeIntrinsic(IntrinsicType i)30 bool IsCoarseDerivativeIntrinsic(IntrinsicType i) {
31 return i == IntrinsicType::kDpdxCoarse || i == IntrinsicType::kDpdyCoarse ||
32 i == IntrinsicType::kFwidthCoarse;
33 }
34
IsFineDerivativeIntrinsic(IntrinsicType i)35 bool IsFineDerivativeIntrinsic(IntrinsicType i) {
36 return i == IntrinsicType::kDpdxFine || i == IntrinsicType::kDpdyFine ||
37 i == IntrinsicType::kFwidthFine;
38 }
39
IsDerivativeIntrinsic(IntrinsicType i)40 bool IsDerivativeIntrinsic(IntrinsicType i) {
41 return i == IntrinsicType::kDpdx || i == IntrinsicType::kDpdy ||
42 i == IntrinsicType::kFwidth || IsCoarseDerivativeIntrinsic(i) ||
43 IsFineDerivativeIntrinsic(i);
44 }
45
IsFloatClassificationIntrinsic(IntrinsicType i)46 bool IsFloatClassificationIntrinsic(IntrinsicType i) {
47 return i == IntrinsicType::kIsFinite || i == IntrinsicType::kIsInf ||
48 i == IntrinsicType::kIsNan || i == IntrinsicType::kIsNormal;
49 }
50
IsTextureIntrinsic(IntrinsicType i)51 bool IsTextureIntrinsic(IntrinsicType i) {
52 return IsImageQueryIntrinsic(i) || i == IntrinsicType::kTextureLoad ||
53 i == IntrinsicType::kTextureGather ||
54 i == IntrinsicType::kTextureGatherCompare ||
55 i == IntrinsicType::kTextureSample ||
56 i == IntrinsicType::kTextureSampleLevel ||
57 i == IntrinsicType::kTextureSampleBias ||
58 i == IntrinsicType::kTextureSampleCompare ||
59 i == IntrinsicType::kTextureSampleCompareLevel ||
60 i == IntrinsicType::kTextureSampleGrad ||
61 i == IntrinsicType::kTextureStore;
62 }
63
IsImageQueryIntrinsic(IntrinsicType i)64 bool IsImageQueryIntrinsic(IntrinsicType i) {
65 return i == IntrinsicType::kTextureDimensions ||
66 i == IntrinsicType::kTextureNumLayers ||
67 i == IntrinsicType::kTextureNumLevels ||
68 i == IntrinsicType::kTextureNumSamples;
69 }
70
IsDataPackingIntrinsic(IntrinsicType i)71 bool IsDataPackingIntrinsic(IntrinsicType i) {
72 return i == IntrinsicType::kPack4x8snorm ||
73 i == IntrinsicType::kPack4x8unorm ||
74 i == IntrinsicType::kPack2x16snorm ||
75 i == IntrinsicType::kPack2x16unorm ||
76 i == IntrinsicType::kPack2x16float;
77 }
78
IsDataUnpackingIntrinsic(IntrinsicType i)79 bool IsDataUnpackingIntrinsic(IntrinsicType i) {
80 return i == IntrinsicType::kUnpack4x8snorm ||
81 i == IntrinsicType::kUnpack4x8unorm ||
82 i == IntrinsicType::kUnpack2x16snorm ||
83 i == IntrinsicType::kUnpack2x16unorm ||
84 i == IntrinsicType::kUnpack2x16float;
85 }
86
IsBarrierIntrinsic(IntrinsicType i)87 bool IsBarrierIntrinsic(IntrinsicType i) {
88 return i == IntrinsicType::kWorkgroupBarrier ||
89 i == IntrinsicType::kStorageBarrier;
90 }
91
IsAtomicIntrinsic(IntrinsicType i)92 bool IsAtomicIntrinsic(IntrinsicType i) {
93 return i == sem::IntrinsicType::kAtomicLoad ||
94 i == sem::IntrinsicType::kAtomicStore ||
95 i == sem::IntrinsicType::kAtomicAdd ||
96 i == sem::IntrinsicType::kAtomicSub ||
97 i == sem::IntrinsicType::kAtomicMax ||
98 i == sem::IntrinsicType::kAtomicMin ||
99 i == sem::IntrinsicType::kAtomicAnd ||
100 i == sem::IntrinsicType::kAtomicOr ||
101 i == sem::IntrinsicType::kAtomicXor ||
102 i == sem::IntrinsicType::kAtomicExchange ||
103 i == sem::IntrinsicType::kAtomicCompareExchangeWeak;
104 }
105
Intrinsic(IntrinsicType type,const sem::Type * return_type,std::vector<Parameter * > parameters,PipelineStageSet supported_stages,bool is_deprecated)106 Intrinsic::Intrinsic(IntrinsicType type,
107 const sem::Type* return_type,
108 std::vector<Parameter*> parameters,
109 PipelineStageSet supported_stages,
110 bool is_deprecated)
111 : Base(return_type, utils::ToConstPtrVec(parameters)),
112 type_(type),
113 supported_stages_(supported_stages),
114 is_deprecated_(is_deprecated) {
115 for (auto* parameter : parameters) {
116 parameter->SetOwner(this);
117 }
118 }
119
120 Intrinsic::~Intrinsic() = default;
121
IsCoarseDerivative() const122 bool Intrinsic::IsCoarseDerivative() const {
123 return IsCoarseDerivativeIntrinsic(type_);
124 }
125
IsFineDerivative() const126 bool Intrinsic::IsFineDerivative() const {
127 return IsFineDerivativeIntrinsic(type_);
128 }
129
IsDerivative() const130 bool Intrinsic::IsDerivative() const {
131 return IsDerivativeIntrinsic(type_);
132 }
133
IsFloatClassification() const134 bool Intrinsic::IsFloatClassification() const {
135 return IsFloatClassificationIntrinsic(type_);
136 }
137
IsTexture() const138 bool Intrinsic::IsTexture() const {
139 return IsTextureIntrinsic(type_);
140 }
141
IsImageQuery() const142 bool Intrinsic::IsImageQuery() const {
143 return IsImageQueryIntrinsic(type_);
144 }
145
IsDataPacking() const146 bool Intrinsic::IsDataPacking() const {
147 return IsDataPackingIntrinsic(type_);
148 }
149
IsDataUnpacking() const150 bool Intrinsic::IsDataUnpacking() const {
151 return IsDataUnpackingIntrinsic(type_);
152 }
153
IsBarrier() const154 bool Intrinsic::IsBarrier() const {
155 return IsBarrierIntrinsic(type_);
156 }
157
IsAtomic() const158 bool Intrinsic::IsAtomic() const {
159 return IsAtomicIntrinsic(type_);
160 }
161
162 } // namespace sem
163 } // namespace tint
164