OLD | NEW |
---|---|
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/asmjs/asm-types.h" | 7 #include "src/asmjs/asm-types.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
166 bool IsFroundType() const override { return true; } | 166 bool IsFroundType() const override { return true; } |
167 | 167 |
168 private: | 168 private: |
169 friend AsmType; | 169 friend AsmType; |
170 | 170 |
171 explicit AsmFroundType(Zone* zone) | 171 explicit AsmFroundType(Zone* zone) |
172 : AsmFunctionType(zone, AsmType::Float()) {} | 172 : AsmFunctionType(zone, AsmType::Float()) {} |
173 | 173 |
174 AsmType* ValidateCall(AsmType* return_type, | 174 AsmType* ValidateCall(AsmType* return_type, |
175 const ZoneVector<AsmType*>& args) override; | 175 const ZoneVector<AsmType*>& args) override; |
176 bool CanBeInvokedWith(AsmType* return_type, | |
177 const ZoneVector<AsmType*>& args) override; | |
176 }; | 178 }; |
177 } // namespace | 179 } // namespace |
178 | 180 |
179 AsmType* AsmType::FroundType(Zone* zone) { | 181 AsmType* AsmType::FroundType(Zone* zone) { |
180 auto* Fround = new (zone) AsmFroundType(zone); | 182 auto* Fround = new (zone) AsmFroundType(zone); |
181 return reinterpret_cast<AsmType*>(Fround); | 183 return reinterpret_cast<AsmType*>(Fround); |
182 } | 184 } |
183 | 185 |
186 // TODO(jpp): Remove this method. | |
bradnelson
2016/07/13 17:05:30
Any reason not to do it now?
John
2016/07/13 18:13:03
To avoid having even moar changes on this CL. I al
| |
184 AsmType* AsmFroundType::ValidateCall(AsmType* return_type, | 187 AsmType* AsmFroundType::ValidateCall(AsmType* return_type, |
185 const ZoneVector<AsmType*>& args) { | 188 const ZoneVector<AsmType*>& args) { |
186 if (args.size() != 1) { | 189 if (args.size() != 1) { |
187 return AsmType::None(); | 190 return AsmType::None(); |
188 } | 191 } |
189 | 192 |
190 auto* arg = args[0]; | 193 auto* arg = args[0]; |
191 if (!arg->IsA(AsmType::Floatish()) && !arg->IsA(AsmType::DoubleQ()) && | 194 if (!arg->IsA(AsmType::Floatish()) && !arg->IsA(AsmType::DoubleQ()) && |
192 !arg->IsA(AsmType::Signed()) && !arg->IsA(AsmType::Unsigned())) { | 195 !arg->IsA(AsmType::Signed()) && !arg->IsA(AsmType::Unsigned())) { |
193 return AsmType::None(); | 196 return AsmType::None(); |
194 } | 197 } |
195 | 198 |
196 return AsmType::Float(); | 199 return AsmType::Float(); |
197 } | 200 } |
198 | 201 |
202 bool AsmFroundType::CanBeInvokedWith(AsmType* return_type, | |
203 const ZoneVector<AsmType*>& args) { | |
204 if (args.size() != 1) { | |
205 return false; | |
206 } | |
207 | |
208 auto* arg = args[0]; | |
209 if (!arg->IsA(AsmType::Floatish()) && !arg->IsA(AsmType::DoubleQ()) && | |
210 !arg->IsA(AsmType::Signed()) && !arg->IsA(AsmType::Unsigned())) { | |
211 return false; | |
212 } | |
213 | |
214 return true; | |
215 } | |
216 | |
199 namespace { | 217 namespace { |
200 class AsmMinMaxType final : public AsmFunctionType { | 218 class AsmMinMaxType final : public AsmFunctionType { |
201 public: | 219 public: |
202 bool IsMinMaxType() const override { return true; } | 220 bool IsMinMaxType() const override { return true; } |
203 | 221 |
204 private: | 222 private: |
205 friend AsmType; | 223 friend AsmType; |
206 | 224 |
207 AsmMinMaxType(Zone* zone, AsmType* dest, AsmType* src) | 225 AsmMinMaxType(Zone* zone, AsmType* dest, AsmType* src) |
208 : AsmFunctionType(zone, dest) { | 226 : AsmFunctionType(zone, dest) { |
(...skipping 12 matching lines...) Expand all Loading... | |
221 } | 239 } |
222 | 240 |
223 for (size_t ii = 0; ii < Arguments().size(); ++ii) { | 241 for (size_t ii = 0; ii < Arguments().size(); ++ii) { |
224 if (!Arguments()[0]->IsExactly(args[ii])) { | 242 if (!Arguments()[0]->IsExactly(args[ii])) { |
225 return AsmType::None(); | 243 return AsmType::None(); |
226 } | 244 } |
227 } | 245 } |
228 | 246 |
229 return ReturnType(); | 247 return ReturnType(); |
230 } | 248 } |
249 | |
250 bool CanBeInvokedWith(AsmType* return_type, | |
251 const ZoneVector<AsmType*>& args) override { | |
252 if (!ReturnType()->IsExactly(return_type)) { | |
253 return false; | |
254 } | |
255 | |
256 if (args.size() < 2) { | |
257 return false; | |
258 } | |
259 | |
260 auto* arg_type = Arguments()[0]; | |
261 for (size_t ii = 0; ii < Arguments().size(); ++ii) { | |
262 if (!args[ii]->IsA(arg_type)) { | |
263 return false; | |
264 } | |
265 } | |
266 | |
267 return true; | |
268 } | |
231 }; | 269 }; |
232 } // namespace | 270 } // namespace |
233 | 271 |
234 AsmType* AsmType::MinMaxType(Zone* zone, AsmType* dest, AsmType* src) { | 272 AsmType* AsmType::MinMaxType(Zone* zone, AsmType* dest, AsmType* src) { |
235 DCHECK(dest->AsValueType() != nullptr); | 273 DCHECK(dest->AsValueType() != nullptr); |
236 DCHECK(src->AsValueType() != nullptr); | 274 DCHECK(src->AsValueType() != nullptr); |
237 auto* MinMax = new (zone) AsmMinMaxType(zone, dest, src); | 275 auto* MinMax = new (zone) AsmMinMaxType(zone, dest, src); |
238 return reinterpret_cast<AsmType*>(MinMax); | 276 return reinterpret_cast<AsmType*>(MinMax); |
239 } | 277 } |
240 | 278 |
241 AsmType* AsmFFIType::ValidateCall(AsmType* return_type, | 279 AsmType* AsmFFIType::ValidateCall(AsmType* return_type, |
242 const ZoneVector<AsmType*>& args) { | 280 const ZoneVector<AsmType*>& args) { |
243 for (size_t ii = 0; ii < args.size(); ++ii) { | 281 for (size_t ii = 0; ii < args.size(); ++ii) { |
244 if (!args[ii]->IsA(AsmType::Extern())) { | 282 if (!args[ii]->IsA(AsmType::Extern())) { |
245 return AsmType::None(); | 283 return AsmType::None(); |
246 } | 284 } |
247 } | 285 } |
248 | 286 |
249 return return_type; | 287 return return_type; |
250 } | 288 } |
251 | 289 |
290 bool AsmFFIType::CanBeInvokedWith(AsmType* return_type, | |
291 const ZoneVector<AsmType*>& args) { | |
292 if (return_type->IsExactly(AsmType::Float())) { | |
293 return false; | |
294 } | |
295 | |
296 for (size_t ii = 0; ii < args.size(); ++ii) { | |
297 if (!args[ii]->IsA(AsmType::Extern())) { | |
298 return false; | |
299 } | |
300 } | |
301 | |
302 return true; | |
303 } | |
304 | |
252 AsmType* AsmFunctionType::ValidateCall(AsmType* return_type, | 305 AsmType* AsmFunctionType::ValidateCall(AsmType* return_type, |
253 const ZoneVector<AsmType*>& args) { | 306 const ZoneVector<AsmType*>& args) { |
254 if (!return_type_->IsExactly(return_type)) { | 307 if (!return_type_->IsExactly(return_type)) { |
255 return AsmType::None(); | 308 return AsmType::None(); |
256 } | 309 } |
257 | 310 |
258 if (args_.size() != args.size()) { | 311 if (args_.size() != args.size()) { |
259 return AsmType::None(); | 312 return AsmType::None(); |
260 } | 313 } |
261 | 314 |
262 for (size_t ii = 0; ii < args_.size(); ++ii) { | 315 for (size_t ii = 0; ii < args_.size(); ++ii) { |
263 if (!args_[ii]->IsExactly(args[ii])) { | 316 if (!args_[ii]->IsExactly(args[ii])) { |
264 return AsmType::None(); | 317 return AsmType::None(); |
265 } | 318 } |
266 } | 319 } |
267 | 320 |
268 return return_type_; | 321 return return_type_; |
269 } | 322 } |
270 | 323 |
324 bool AsmFunctionType::CanBeInvokedWith(AsmType* return_type, | |
325 const ZoneVector<AsmType*>& args) { | |
326 if (!return_type_->IsExactly(return_type)) { | |
327 return false; | |
328 } | |
329 | |
330 if (args_.size() != args.size()) { | |
331 return false; | |
332 } | |
333 | |
334 for (size_t ii = 0; ii < args_.size(); ++ii) { | |
335 if (!args[ii]->IsA(args_[ii])) { | |
336 return false; | |
337 } | |
338 } | |
339 | |
340 return true; | |
341 } | |
342 | |
271 std::string AsmOverloadedFunctionType::Name() { | 343 std::string AsmOverloadedFunctionType::Name() { |
272 std::string ret; | 344 std::string ret; |
273 | 345 |
274 for (size_t ii = 0; ii < overloads_.size(); ++ii) { | 346 for (size_t ii = 0; ii < overloads_.size(); ++ii) { |
275 if (ii != 0) { | 347 if (ii != 0) { |
276 ret += " /\\ "; | 348 ret += " /\\ "; |
277 } | 349 } |
278 ret += overloads_[ii]->Name(); | 350 ret += overloads_[ii]->Name(); |
279 } | 351 } |
280 | 352 |
281 return ret; | 353 return ret; |
282 } | 354 } |
283 | 355 |
284 AsmType* AsmOverloadedFunctionType::ValidateCall( | 356 AsmType* AsmOverloadedFunctionType::ValidateCall( |
285 AsmType* return_type, const ZoneVector<AsmType*>& args) { | 357 AsmType* return_type, const ZoneVector<AsmType*>& args) { |
286 for (size_t ii = 0; ii < overloads_.size(); ++ii) { | 358 for (size_t ii = 0; ii < overloads_.size(); ++ii) { |
287 auto* validated_type = | 359 auto* validated_type = |
288 overloads_[ii]->AsCallableType()->ValidateCall(return_type, args); | 360 overloads_[ii]->AsCallableType()->ValidateCall(return_type, args); |
289 if (validated_type != AsmType::None()) { | 361 if (validated_type != AsmType::None()) { |
290 return validated_type; | 362 return validated_type; |
291 } | 363 } |
292 } | 364 } |
293 | 365 |
294 return AsmType::None(); | 366 return AsmType::None(); |
295 } | 367 } |
296 | 368 |
369 bool AsmOverloadedFunctionType::CanBeInvokedWith( | |
370 AsmType* return_type, const ZoneVector<AsmType*>& args) { | |
371 for (size_t ii = 0; ii < overloads_.size(); ++ii) { | |
372 if (overloads_[ii]->AsCallableType()->CanBeInvokedWith(return_type, args)) { | |
373 return true; | |
374 } | |
375 } | |
376 | |
377 return false; | |
378 } | |
379 | |
297 void AsmOverloadedFunctionType::AddOverload(AsmType* overload) { | 380 void AsmOverloadedFunctionType::AddOverload(AsmType* overload) { |
298 DCHECK(overload->AsFunctionType() != nullptr); | 381 DCHECK(overload->AsFunctionType() != nullptr); |
299 overloads_.push_back(overload); | 382 overloads_.push_back(overload); |
300 } | 383 } |
301 | 384 |
302 AsmFunctionTableType::AsmFunctionTableType(size_t length, AsmType* signature) | 385 AsmFunctionTableType::AsmFunctionTableType(size_t length, AsmType* signature) |
303 : length_(length), signature_(signature) { | 386 : length_(length), signature_(signature) { |
304 DCHECK(signature_ != nullptr); | 387 DCHECK(signature_ != nullptr); |
305 DCHECK(signature_->AsFunctionType() != nullptr); | 388 DCHECK(signature_->AsFunctionType() != nullptr); |
306 } | 389 } |
307 | 390 |
308 std::string AsmFunctionTableType::Name() { | 391 std::string AsmFunctionTableType::Name() { |
309 return signature_->Name() + "[" + std::to_string(length_) + "]"; | 392 return signature_->Name() + "[" + std::to_string(length_) + "]"; |
310 } | 393 } |
311 | 394 |
312 AsmType* AsmFunctionTableType::ValidateCall(AsmType* return_type, | 395 AsmType* AsmFunctionTableType::ValidateCall(AsmType* return_type, |
313 const ZoneVector<AsmType*>& args) { | 396 const ZoneVector<AsmType*>& args) { |
314 return signature_->AsCallableType()->ValidateCall(return_type, args); | 397 return signature_->AsCallableType()->ValidateCall(return_type, args); |
315 } | 398 } |
316 | 399 |
400 bool AsmFunctionTableType::CanBeInvokedWith(AsmType* return_type, | |
401 const ZoneVector<AsmType*>& args) { | |
402 return signature_->AsCallableType()->CanBeInvokedWith(return_type, args); | |
403 } | |
404 | |
317 } // namespace wasm | 405 } // namespace wasm |
318 } // namespace internal | 406 } // namespace internal |
319 } // namespace v8 | 407 } // namespace v8 |
OLD | NEW |