OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/crankshaft/hydrogen.h" | 10 #include "src/crankshaft/hydrogen.h" |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 HValue* number = GetParameter(Descriptor::kArgument); | 336 HValue* number = GetParameter(Descriptor::kArgument); |
337 return BuildNumberToString(number, Type::Number()); | 337 return BuildNumberToString(number, Type::Number()); |
338 } | 338 } |
339 | 339 |
340 | 340 |
341 Handle<Code> NumberToStringStub::GenerateCode() { | 341 Handle<Code> NumberToStringStub::GenerateCode() { |
342 return DoGenerateCode(this); | 342 return DoGenerateCode(this); |
343 } | 343 } |
344 | 344 |
345 | 345 |
346 // Returns the type string of a value; see ECMA-262, 11.4.3 (p 47). | |
347 template <> | |
348 HValue* CodeStubGraphBuilder<TypeofStub>::BuildCodeStub() { | |
349 Factory* factory = isolate()->factory(); | |
350 HConstant* number_string = Add<HConstant>(factory->number_string()); | |
351 HValue* object = GetParameter(Descriptor::kObject); | |
352 | |
353 IfBuilder is_smi(this); | |
354 HValue* smi_check = is_smi.If<HIsSmiAndBranch>(object); | |
355 is_smi.Then(); | |
356 { Push(number_string); } | |
357 is_smi.Else(); | |
358 { | |
359 IfBuilder is_number(this); | |
360 is_number.If<HCompareMap>(object, isolate()->factory()->heap_number_map()); | |
361 is_number.Then(); | |
362 { Push(number_string); } | |
363 is_number.Else(); | |
364 { | |
365 HValue* map = AddLoadMap(object, smi_check); | |
366 HValue* instance_type = Add<HLoadNamedField>( | |
367 map, nullptr, HObjectAccess::ForMapInstanceType()); | |
368 IfBuilder is_string(this); | |
369 is_string.If<HCompareNumericAndBranch>( | |
370 instance_type, Add<HConstant>(FIRST_NONSTRING_TYPE), Token::LT); | |
371 is_string.Then(); | |
372 { Push(Add<HConstant>(factory->string_string())); } | |
373 is_string.Else(); | |
374 { | |
375 HConstant* object_string = Add<HConstant>(factory->object_string()); | |
376 IfBuilder is_oddball(this); | |
377 is_oddball.If<HCompareNumericAndBranch>( | |
378 instance_type, Add<HConstant>(ODDBALL_TYPE), Token::EQ); | |
379 is_oddball.Then(); | |
380 { | |
381 Push(Add<HLoadNamedField>(object, nullptr, | |
382 HObjectAccess::ForOddballTypeOf())); | |
383 } | |
384 is_oddball.Else(); | |
385 { | |
386 IfBuilder is_symbol(this); | |
387 is_symbol.If<HCompareNumericAndBranch>( | |
388 instance_type, Add<HConstant>(SYMBOL_TYPE), Token::EQ); | |
389 is_symbol.Then(); | |
390 { Push(Add<HConstant>(factory->symbol_string())); } | |
391 is_symbol.Else(); | |
392 { | |
393 HValue* bit_field = Add<HLoadNamedField>( | |
394 map, nullptr, HObjectAccess::ForMapBitField()); | |
395 HValue* bit_field_masked = AddUncasted<HBitwise>( | |
396 Token::BIT_AND, bit_field, | |
397 Add<HConstant>((1 << Map::kIsCallable) | | |
398 (1 << Map::kIsUndetectable))); | |
399 IfBuilder is_function(this); | |
400 is_function.If<HCompareNumericAndBranch>( | |
401 bit_field_masked, Add<HConstant>(1 << Map::kIsCallable), | |
402 Token::EQ); | |
403 is_function.Then(); | |
404 { Push(Add<HConstant>(factory->function_string())); } | |
405 is_function.Else(); | |
406 { | |
407 #define SIMD128_BUILDER_OPEN(TYPE, Type, type, lane_count, lane_type) \ | |
408 IfBuilder is_##type(this); \ | |
409 is_##type.If<HCompareObjectEqAndBranch>( \ | |
410 map, Add<HConstant>(factory->type##_map())); \ | |
411 is_##type.Then(); \ | |
412 { Push(Add<HConstant>(factory->type##_string())); } \ | |
413 is_##type.Else(); { | |
414 SIMD128_TYPES(SIMD128_BUILDER_OPEN) | |
415 #undef SIMD128_BUILDER_OPEN | |
416 // Is it an undetectable object? | |
417 IfBuilder is_undetectable(this); | |
418 is_undetectable.If<HCompareNumericAndBranch>( | |
419 bit_field_masked, graph()->GetConstant0(), Token::NE); | |
420 is_undetectable.Then(); | |
421 { | |
422 // typeof an undetectable object is 'undefined'. | |
423 Push(Add<HConstant>(factory->undefined_string())); | |
424 } | |
425 is_undetectable.Else(); | |
426 { | |
427 // For any kind of object not handled above, the spec rule for | |
428 // host objects gives that it is okay to return "object". | |
429 Push(object_string); | |
430 } | |
431 #define SIMD128_BUILDER_CLOSE(TYPE, Type, type, lane_count, lane_type) } | |
432 SIMD128_TYPES(SIMD128_BUILDER_CLOSE) | |
433 #undef SIMD128_BUILDER_CLOSE | |
434 } | |
435 is_function.End(); | |
436 } | |
437 is_symbol.End(); | |
438 } | |
439 is_oddball.End(); | |
440 } | |
441 is_string.End(); | |
442 } | |
443 is_number.End(); | |
444 } | |
445 is_smi.End(); | |
446 | |
447 return environment()->Pop(); | |
448 } | |
449 | |
450 | |
451 Handle<Code> TypeofStub::GenerateCode() { return DoGenerateCode(this); } | |
452 | |
453 | |
454 template <> | 346 template <> |
455 HValue* CodeStubGraphBuilder<FastCloneRegExpStub>::BuildCodeStub() { | 347 HValue* CodeStubGraphBuilder<FastCloneRegExpStub>::BuildCodeStub() { |
456 HValue* closure = GetParameter(Descriptor::kClosure); | 348 HValue* closure = GetParameter(Descriptor::kClosure); |
457 HValue* literal_index = GetParameter(Descriptor::kLiteralIndex); | 349 HValue* literal_index = GetParameter(Descriptor::kLiteralIndex); |
458 | 350 |
459 // This stub is very performance sensitive, the generated code must be tuned | 351 // This stub is very performance sensitive, the generated code must be tuned |
460 // so that it doesn't build and eager frame. | 352 // so that it doesn't build and eager frame. |
461 info()->MarkMustNotHaveEagerFrame(); | 353 info()->MarkMustNotHaveEagerFrame(); |
462 | 354 |
463 HValue* literals_array = Add<HLoadNamedField>( | 355 HValue* literals_array = Add<HLoadNamedField>( |
(...skipping 1683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2147 return Pop(); | 2039 return Pop(); |
2148 } | 2040 } |
2149 | 2041 |
2150 | 2042 |
2151 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 2043 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
2152 return DoGenerateCode(this); | 2044 return DoGenerateCode(this); |
2153 } | 2045 } |
2154 | 2046 |
2155 } // namespace internal | 2047 } // namespace internal |
2156 } // namespace v8 | 2048 } // namespace v8 |
OLD | NEW |