Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: src/wasm/asm-types.cc

Issue 2078053002: V8. ASM-2-WASM. Another asm-types.h revision. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: git pull Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/wasm/asm-types.h ('k') | test/unittests/wasm/asm-types-unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/wasm/asm-types.h" 7 #include "src/wasm/asm-types.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
11 namespace wasm { 11 namespace wasm {
12 12
13 AsmCallableType* AsmType::AsCallableType() { 13 AsmCallableType* AsmType::AsCallableType() {
14 if (AsValueType() != nullptr) {
15 return nullptr;
16 }
17
14 DCHECK(this->AsFunctionType() != nullptr || 18 DCHECK(this->AsFunctionType() != nullptr ||
15 this->AsOverloadedFunctionType() != nullptr); 19 this->AsOverloadedFunctionType() != nullptr ||
20 this->AsFFIType() != nullptr ||
21 this->AsFunctionTableType() != nullptr);
16 return reinterpret_cast<AsmCallableType*>(this); 22 return reinterpret_cast<AsmCallableType*>(this);
17 } 23 }
18 24
19 std::string AsmType::Name() { 25 std::string AsmType::Name() {
20 AsmValueType* avt = this->AsValueType(); 26 AsmValueType* avt = this->AsValueType();
21 if (avt != nullptr) { 27 if (avt != nullptr) {
22 switch (avt->Bitset()) { 28 switch (avt->Bitset()) {
23 #define RETURN_TYPE_NAME(CamelName, string_name, number, parent_types) \ 29 #define RETURN_TYPE_NAME(CamelName, string_name, number, parent_types) \
24 case AsmValueType::kAsm##CamelName: \ 30 case AsmValueType::kAsm##CamelName: \
25 return string_name; 31 return string_name;
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 class AsmFroundType final : public AsmFunctionType { 164 class AsmFroundType final : public AsmFunctionType {
159 public: 165 public:
160 bool IsFroundType() const override { return true; } 166 bool IsFroundType() const override { return true; }
161 167
162 private: 168 private:
163 friend AsmType; 169 friend AsmType;
164 170
165 explicit AsmFroundType(Zone* zone) 171 explicit AsmFroundType(Zone* zone)
166 : AsmFunctionType(zone, AsmType::Float()) {} 172 : AsmFunctionType(zone, AsmType::Float()) {}
167 173
168 AsmType* ValidateCall(AsmType* function_type) override; 174 AsmType* ValidateCall(AsmType* return_type,
175 const ZoneVector<AsmType*>& args) override;
169 }; 176 };
170 } // namespace 177 } // namespace
171 178
172 AsmType* AsmType::FroundType(Zone* zone) { 179 AsmType* AsmType::FroundType(Zone* zone) {
173 auto* Fround = new (zone) AsmFroundType(zone); 180 auto* Fround = new (zone) AsmFroundType(zone);
174 return reinterpret_cast<AsmType*>(Fround); 181 return reinterpret_cast<AsmType*>(Fround);
175 } 182 }
176 183
177 AsmType* AsmFroundType::ValidateCall(AsmType* function_type) { 184 AsmType* AsmFroundType::ValidateCall(AsmType* return_type,
178 auto* callable = function_type->AsFunctionType(); 185 const ZoneVector<AsmType*>& args) {
179 if (callable->Arguments().size() != 1) { 186 if (args.size() != 1) {
180 return AsmType::None(); 187 return AsmType::None();
181 } 188 }
182 189
183 auto* arg = callable->Arguments()[0]; 190 auto* arg = args[0];
184 if (!arg->IsA(AsmType::Floatish()) && !arg->IsA(AsmType::DoubleQ()) && 191 if (!arg->IsA(AsmType::Floatish()) && !arg->IsA(AsmType::DoubleQ()) &&
185 !arg->IsA(AsmType::Signed()) && !arg->IsA(AsmType::Unsigned())) { 192 !arg->IsA(AsmType::Signed()) && !arg->IsA(AsmType::Unsigned())) {
186 return AsmType::None(); 193 return AsmType::None();
187 } 194 }
188 195
189 return AsmType::Float(); 196 return AsmType::Float();
190 } 197 }
191 198
192 namespace { 199 namespace {
193 class AsmMinMaxType final : public AsmFunctionType { 200 class AsmMinMaxType final : public AsmFunctionType {
194 public: 201 public:
195 bool IsMinMaxType() const override { return true; } 202 bool IsMinMaxType() const override { return true; }
196 203
197 private: 204 private:
198 friend AsmType; 205 friend AsmType;
199 206
200 AsmMinMaxType(Zone* zone, AsmType* dest, AsmType* src) 207 AsmMinMaxType(Zone* zone, AsmType* dest, AsmType* src)
201 : AsmFunctionType(zone, dest) { 208 : AsmFunctionType(zone, dest) {
202 AddArgument(src); 209 AddArgument(src);
203 AddArgument(src); 210 AddArgument(src);
204 } 211 }
205 212
206 AsmType* ValidateCall(AsmType* function_type) override { 213 AsmType* ValidateCall(AsmType* return_type,
207 auto* callable = function_type->AsFunctionType(); 214 const ZoneVector<AsmType*>& args) override {
208 if (callable == nullptr) { 215 if (!ReturnType()->IsExactly(return_type)) {
209 return nullptr;
210 }
211
212 if (!ReturnType()->IsExactly(callable->ReturnType())) {
213 return AsmType::None(); 216 return AsmType::None();
214 } 217 }
215 218
216 if (callable->Arguments().size() < 2) { 219 if (args.size() < 2) {
217 return AsmType::None(); 220 return AsmType::None();
218 } 221 }
219 222
220 for (size_t ii = 0; ii < Arguments().size(); ++ii) { 223 for (size_t ii = 0; ii < Arguments().size(); ++ii) {
221 if (!Arguments()[0]->IsExactly(callable->Arguments()[ii])) { 224 if (!Arguments()[0]->IsExactly(args[ii])) {
222 return AsmType::None(); 225 return AsmType::None();
223 } 226 }
224 } 227 }
225 228
226 return ReturnType(); 229 return ReturnType();
227 } 230 }
228 }; 231 };
229 } // namespace 232 } // namespace
230 233
231 AsmType* AsmType::MinMaxType(Zone* zone, AsmType* dest, AsmType* src) { 234 AsmType* AsmType::MinMaxType(Zone* zone, AsmType* dest, AsmType* src) {
232 DCHECK(dest->AsValueType() != nullptr); 235 DCHECK(dest->AsValueType() != nullptr);
233 DCHECK(src->AsValueType() != nullptr); 236 DCHECK(src->AsValueType() != nullptr);
234 auto* MinMax = new (zone) AsmMinMaxType(zone, dest, src); 237 auto* MinMax = new (zone) AsmMinMaxType(zone, dest, src);
235 return reinterpret_cast<AsmType*>(MinMax); 238 return reinterpret_cast<AsmType*>(MinMax);
236 } 239 }
237 240
238 AsmType* AsmFunctionType::ValidateCall(AsmType* function_type) { 241 AsmType* AsmFFIType::ValidateCall(AsmType* return_type,
239 auto* callable = function_type->AsFunctionType(); 242 const ZoneVector<AsmType*>& args) {
240 if (callable == nullptr) { 243 for (size_t ii = 0; ii < args.size(); ++ii) {
241 return nullptr; 244 if (!args[ii]->IsA(AsmType::Extern())) {
245 return AsmType::None();
246 }
242 } 247 }
243 248
244 if (!return_type_->IsExactly(callable->return_type_)) { 249 return return_type;
250 }
251
252 AsmType* AsmFunctionType::ValidateCall(AsmType* return_type,
253 const ZoneVector<AsmType*>& args) {
254 if (!return_type_->IsExactly(return_type)) {
245 return AsmType::None(); 255 return AsmType::None();
246 } 256 }
247 257
248 if (args_.size() != callable->args_.size()) { 258 if (args_.size() != args.size()) {
249 return AsmType::None(); 259 return AsmType::None();
250 } 260 }
251 261
252 for (size_t ii = 0; ii < args_.size(); ++ii) { 262 for (size_t ii = 0; ii < args_.size(); ++ii) {
253 if (!args_[ii]->IsExactly(callable->args_[ii])) { 263 if (!args_[ii]->IsExactly(args[ii])) {
254 return AsmType::None(); 264 return AsmType::None();
255 } 265 }
256 } 266 }
257 267
258 return return_type_; 268 return return_type_;
259 } 269 }
260 270
261 std::string AsmOverloadedFunctionType::Name() { 271 std::string AsmOverloadedFunctionType::Name() {
262 std::string ret; 272 std::string ret;
263 273
264 for (size_t ii = 0; ii < overloads_.size(); ++ii) { 274 for (size_t ii = 0; ii < overloads_.size(); ++ii) {
265 if (ii != 0) { 275 if (ii != 0) {
266 ret += " /\\ "; 276 ret += " /\\ ";
267 } 277 }
268 ret += overloads_[ii]->Name(); 278 ret += overloads_[ii]->Name();
269 } 279 }
270 280
271 return ret; 281 return ret;
272 } 282 }
273 283
274 AsmType* AsmOverloadedFunctionType::ValidateCall(AsmType* function_type) { 284 AsmType* AsmOverloadedFunctionType::ValidateCall(
275 auto* callable = function_type->AsFunctionType(); 285 AsmType* return_type, const ZoneVector<AsmType*>& args) {
276 if (callable == nullptr) {
277 return AsmType::None();
278 }
279
280 for (size_t ii = 0; ii < overloads_.size(); ++ii) { 286 for (size_t ii = 0; ii < overloads_.size(); ++ii) {
281 auto* validated_type = 287 auto* validated_type =
282 overloads_[ii]->AsCallableType()->ValidateCall(function_type); 288 overloads_[ii]->AsCallableType()->ValidateCall(return_type, args);
283 if (validated_type != AsmType::None()) { 289 if (validated_type != AsmType::None()) {
284 return validated_type; 290 return validated_type;
285 } 291 }
286 } 292 }
287 293
288 return AsmType::None(); 294 return AsmType::None();
289 } 295 }
290 296
291 void AsmOverloadedFunctionType::AddOverload(AsmType* overload) { 297 void AsmOverloadedFunctionType::AddOverload(AsmType* overload) {
292 DCHECK(overload->AsFunctionType() != nullptr); 298 DCHECK(overload->AsFunctionType() != nullptr);
293 overloads_.push_back(overload); 299 overloads_.push_back(overload);
294 } 300 }
295 301
302 AsmFunctionTableType::AsmFunctionTableType(size_t length, AsmType* signature)
303 : length_(length), signature_(signature) {
304 DCHECK(signature_ != nullptr);
305 DCHECK(signature_->AsFunctionType() != nullptr);
306 }
307
308 std::string AsmFunctionTableType::Name() {
309 return signature_->Name() + "[" + std::to_string(length_) + "]";
Mostyn Bramley-Moore 2016/07/04 20:23:36 std::to_string is in the "C++11 Standard Library F
310 }
311
312 AsmType* AsmFunctionTableType::ValidateCall(AsmType* return_type,
313 const ZoneVector<AsmType*>& args) {
314 return signature_->AsCallableType()->ValidateCall(return_type, args);
315 }
316
296 } // namespace wasm 317 } // namespace wasm
297 } // namespace internal 318 } // namespace internal
298 } // namespace v8 319 } // namespace v8
OLDNEW
« no previous file with comments | « src/wasm/asm-types.h ('k') | test/unittests/wasm/asm-types-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698