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 <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
11 #include "src/compiler/code-stub-assembler.h" | 11 #include "src/code-stub-assembler.h" |
12 #include "src/factory.h" | 12 #include "src/factory.h" |
13 #include "src/gdb-jit.h" | 13 #include "src/gdb-jit.h" |
14 #include "src/ic/handler-compiler.h" | 14 #include "src/ic/handler-compiler.h" |
15 #include "src/ic/ic.h" | 15 #include "src/ic/ic.h" |
16 #include "src/macro-assembler.h" | 16 #include "src/macro-assembler.h" |
17 #include "src/parsing/parser.h" | 17 #include "src/parsing/parser.h" |
18 #include "src/profiler/cpu-profiler.h" | 18 #include "src/profiler/cpu-profiler.h" |
19 | 19 |
20 namespace v8 { | 20 namespace v8 { |
21 namespace internal { | 21 namespace internal { |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 GenerateGeneric(masm); | 441 GenerateGeneric(masm); |
442 break; | 442 break; |
443 } | 443 } |
444 } | 444 } |
445 | 445 |
446 | 446 |
447 Handle<Code> TurboFanCodeStub::GenerateCode() { | 447 Handle<Code> TurboFanCodeStub::GenerateCode() { |
448 const char* name = CodeStub::MajorName(MajorKey()); | 448 const char* name = CodeStub::MajorName(MajorKey()); |
449 Zone zone(isolate()->allocator()); | 449 Zone zone(isolate()->allocator()); |
450 CallInterfaceDescriptor descriptor(GetCallInterfaceDescriptor()); | 450 CallInterfaceDescriptor descriptor(GetCallInterfaceDescriptor()); |
451 compiler::CodeStubAssembler assembler(isolate(), &zone, descriptor, | 451 CodeStubAssembler assembler(isolate(), &zone, descriptor, GetCodeFlags(), |
452 GetCodeFlags(), name); | 452 name); |
453 GenerateAssembly(&assembler); | 453 GenerateAssembly(&assembler); |
454 return assembler.GenerateCode(); | 454 return assembler.GenerateCode(); |
455 } | 455 } |
456 | 456 |
457 void AllocateHeapNumberStub::GenerateAssembly( | 457 void AllocateHeapNumberStub::GenerateAssembly( |
458 compiler::CodeStubAssembler* assembler) const { | 458 CodeStubAssembler* assembler) const { |
459 typedef compiler::Node Node; | 459 typedef compiler::Node Node; |
460 | 460 |
461 Node* result = assembler->AllocateHeapNumber(); | 461 Node* result = assembler->AllocateHeapNumber(); |
462 assembler->Return(result); | 462 assembler->Return(result); |
463 } | 463 } |
464 | 464 |
465 void AllocateMutableHeapNumberStub::GenerateAssembly( | 465 void AllocateMutableHeapNumberStub::GenerateAssembly( |
466 compiler::CodeStubAssembler* assembler) const { | 466 CodeStubAssembler* assembler) const { |
467 typedef compiler::Node Node; | 467 typedef compiler::Node Node; |
468 | 468 |
469 Node* result = assembler->Allocate(HeapNumber::kSize); | 469 Node* result = assembler->Allocate(HeapNumber::kSize); |
470 assembler->StoreMapNoWriteBarrier( | 470 assembler->StoreMapNoWriteBarrier( |
471 result, | 471 result, |
472 assembler->HeapConstant(isolate()->factory()->mutable_heap_number_map())); | 472 assembler->HeapConstant(isolate()->factory()->mutable_heap_number_map())); |
473 assembler->Return(result); | 473 assembler->Return(result); |
474 } | 474 } |
475 | 475 |
476 #define SIMD128_GEN_ASM(TYPE, Type, type, lane_count, lane_type) \ | 476 #define SIMD128_GEN_ASM(TYPE, Type, type, lane_count, lane_type) \ |
477 void Allocate##Type##Stub::GenerateAssembly( \ | 477 void Allocate##Type##Stub::GenerateAssembly(CodeStubAssembler* assembler) \ |
478 compiler::CodeStubAssembler* assembler) const { \ | 478 const { \ |
479 compiler::Node* result = assembler->Allocate( \ | 479 compiler::Node* result = \ |
480 Simd128Value::kSize, compiler::CodeStubAssembler::kNone); \ | 480 assembler->Allocate(Simd128Value::kSize, CodeStubAssembler::kNone); \ |
481 compiler::Node* map_offset = \ | 481 compiler::Node* map_offset = \ |
482 assembler->IntPtrConstant(HeapObject::kMapOffset - kHeapObjectTag); \ | 482 assembler->IntPtrConstant(HeapObject::kMapOffset - kHeapObjectTag); \ |
483 compiler::Node* map = assembler->IntPtrAdd(result, map_offset); \ | 483 compiler::Node* map = assembler->IntPtrAdd(result, map_offset); \ |
484 assembler->StoreNoWriteBarrier( \ | 484 assembler->StoreNoWriteBarrier( \ |
485 MachineRepresentation::kTagged, map, \ | 485 MachineRepresentation::kTagged, map, \ |
486 assembler->HeapConstant(isolate()->factory()->type##_map())); \ | 486 assembler->HeapConstant(isolate()->factory()->type##_map())); \ |
487 assembler->Return(result); \ | 487 assembler->Return(result); \ |
488 } | 488 } |
489 SIMD128_TYPES(SIMD128_GEN_ASM) | 489 SIMD128_TYPES(SIMD128_GEN_ASM) |
490 #undef SIMD128_GEN_ASM | 490 #undef SIMD128_GEN_ASM |
491 | 491 |
492 void StringLengthStub::GenerateAssembly( | 492 void StringLengthStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
493 compiler::CodeStubAssembler* assembler) const { | |
494 compiler::Node* value = assembler->Parameter(0); | 493 compiler::Node* value = assembler->Parameter(0); |
495 compiler::Node* string = | 494 compiler::Node* string = |
496 assembler->LoadObjectField(value, JSValue::kValueOffset); | 495 assembler->LoadObjectField(value, JSValue::kValueOffset); |
497 compiler::Node* result = | 496 compiler::Node* result = |
498 assembler->LoadObjectField(string, String::kLengthOffset); | 497 assembler->LoadObjectField(string, String::kLengthOffset); |
499 assembler->Return(result); | 498 assembler->Return(result); |
500 } | 499 } |
501 | 500 |
502 void AddStub::GenerateAssembly(compiler::CodeStubAssembler* assembler) const { | 501 void AddStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
503 typedef compiler::CodeStubAssembler::Label Label; | 502 typedef CodeStubAssembler::Label Label; |
504 typedef compiler::Node Node; | 503 typedef compiler::Node Node; |
505 typedef compiler::CodeStubAssembler::Variable Variable; | 504 typedef CodeStubAssembler::Variable Variable; |
506 | 505 |
507 Node* context = assembler->Parameter(2); | 506 Node* context = assembler->Parameter(2); |
508 | 507 |
509 // Shared entry for floating point addition. | 508 // Shared entry for floating point addition. |
510 Label do_fadd(assembler); | 509 Label do_fadd(assembler); |
511 Variable var_fadd_lhs(assembler, MachineRepresentation::kFloat64), | 510 Variable var_fadd_lhs(assembler, MachineRepresentation::kFloat64), |
512 var_fadd_rhs(assembler, MachineRepresentation::kFloat64); | 511 var_fadd_rhs(assembler, MachineRepresentation::kFloat64); |
513 | 512 |
514 // We might need to loop several times due to ToPrimitive, ToString and/or | 513 // We might need to loop several times due to ToPrimitive, ToString and/or |
515 // ToNumber conversions. | 514 // ToNumber conversions. |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 assembler->Bind(&do_fadd); | 847 assembler->Bind(&do_fadd); |
849 { | 848 { |
850 Node* lhs_value = var_fadd_lhs.value(); | 849 Node* lhs_value = var_fadd_lhs.value(); |
851 Node* rhs_value = var_fadd_rhs.value(); | 850 Node* rhs_value = var_fadd_rhs.value(); |
852 Node* value = assembler->Float64Add(lhs_value, rhs_value); | 851 Node* value = assembler->Float64Add(lhs_value, rhs_value); |
853 Node* result = assembler->ChangeFloat64ToTagged(value); | 852 Node* result = assembler->ChangeFloat64ToTagged(value); |
854 assembler->Return(result); | 853 assembler->Return(result); |
855 } | 854 } |
856 } | 855 } |
857 | 856 |
858 void SubtractStub::GenerateAssembly( | 857 void SubtractStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
859 compiler::CodeStubAssembler* assembler) const { | 858 typedef CodeStubAssembler::Label Label; |
860 typedef compiler::CodeStubAssembler::Label Label; | |
861 typedef compiler::Node Node; | 859 typedef compiler::Node Node; |
862 typedef compiler::CodeStubAssembler::Variable Variable; | 860 typedef CodeStubAssembler::Variable Variable; |
863 | 861 |
864 Node* context = assembler->Parameter(2); | 862 Node* context = assembler->Parameter(2); |
865 | 863 |
866 // Shared entry for floating point subtraction. | 864 // Shared entry for floating point subtraction. |
867 Label do_fsub(assembler); | 865 Label do_fsub(assembler); |
868 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), | 866 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), |
869 var_fsub_rhs(assembler, MachineRepresentation::kFloat64); | 867 var_fsub_rhs(assembler, MachineRepresentation::kFloat64); |
870 | 868 |
871 // We might need to loop several times due to ToPrimitive and/or ToNumber | 869 // We might need to loop several times due to ToPrimitive and/or ToNumber |
872 // conversions. | 870 // conversions. |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1015 assembler->Bind(&do_fsub); | 1013 assembler->Bind(&do_fsub); |
1016 { | 1014 { |
1017 Node* lhs_value = var_fsub_lhs.value(); | 1015 Node* lhs_value = var_fsub_lhs.value(); |
1018 Node* rhs_value = var_fsub_rhs.value(); | 1016 Node* rhs_value = var_fsub_rhs.value(); |
1019 Node* value = assembler->Float64Sub(lhs_value, rhs_value); | 1017 Node* value = assembler->Float64Sub(lhs_value, rhs_value); |
1020 Node* result = assembler->ChangeFloat64ToTagged(value); | 1018 Node* result = assembler->ChangeFloat64ToTagged(value); |
1021 assembler->Return(result); | 1019 assembler->Return(result); |
1022 } | 1020 } |
1023 } | 1021 } |
1024 | 1022 |
1025 void MultiplyStub::GenerateAssembly( | 1023 void MultiplyStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
1026 compiler::CodeStubAssembler* assembler) const { | |
1027 using compiler::Node; | 1024 using compiler::Node; |
1028 typedef compiler::CodeStubAssembler::Label Label; | 1025 typedef CodeStubAssembler::Label Label; |
1029 typedef compiler::CodeStubAssembler::Variable Variable; | 1026 typedef CodeStubAssembler::Variable Variable; |
1030 | 1027 |
1031 Node* context = assembler->Parameter(2); | 1028 Node* context = assembler->Parameter(2); |
1032 | 1029 |
1033 // Shared entry point for floating point multiplication. | 1030 // Shared entry point for floating point multiplication. |
1034 Label do_fmul(assembler); | 1031 Label do_fmul(assembler); |
1035 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64), | 1032 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64), |
1036 var_rhs_float64(assembler, MachineRepresentation::kFloat64); | 1033 var_rhs_float64(assembler, MachineRepresentation::kFloat64); |
1037 | 1034 |
1038 Node* number_map = assembler->HeapNumberMapConstant(); | 1035 Node* number_map = assembler->HeapNumberMapConstant(); |
1039 | 1036 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1162 | 1159 |
1163 assembler->Bind(&do_fmul); | 1160 assembler->Bind(&do_fmul); |
1164 { | 1161 { |
1165 Node* value = | 1162 Node* value = |
1166 assembler->Float64Mul(var_lhs_float64.value(), var_rhs_float64.value()); | 1163 assembler->Float64Mul(var_lhs_float64.value(), var_rhs_float64.value()); |
1167 Node* result = assembler->ChangeFloat64ToTagged(value); | 1164 Node* result = assembler->ChangeFloat64ToTagged(value); |
1168 assembler->Return(result); | 1165 assembler->Return(result); |
1169 } | 1166 } |
1170 } | 1167 } |
1171 | 1168 |
1172 void DivideStub::GenerateAssembly( | 1169 void DivideStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
1173 compiler::CodeStubAssembler* assembler) const { | |
1174 using compiler::Node; | 1170 using compiler::Node; |
1175 typedef compiler::CodeStubAssembler::Label Label; | 1171 typedef CodeStubAssembler::Label Label; |
1176 typedef compiler::CodeStubAssembler::Variable Variable; | 1172 typedef CodeStubAssembler::Variable Variable; |
1177 | 1173 |
1178 Node* context = assembler->Parameter(2); | 1174 Node* context = assembler->Parameter(2); |
1179 | 1175 |
1180 // Shared entry point for floating point division. | 1176 // Shared entry point for floating point division. |
1181 Label do_fdiv(assembler); | 1177 Label do_fdiv(assembler); |
1182 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), | 1178 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), |
1183 var_divisor_float64(assembler, MachineRepresentation::kFloat64); | 1179 var_divisor_float64(assembler, MachineRepresentation::kFloat64); |
1184 | 1180 |
1185 Node* number_map = assembler->HeapNumberMapConstant(); | 1181 Node* number_map = assembler->HeapNumberMapConstant(); |
1186 | 1182 |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1373 | 1369 |
1374 assembler->Bind(&do_fdiv); | 1370 assembler->Bind(&do_fdiv); |
1375 { | 1371 { |
1376 Node* value = assembler->Float64Div(var_dividend_float64.value(), | 1372 Node* value = assembler->Float64Div(var_dividend_float64.value(), |
1377 var_divisor_float64.value()); | 1373 var_divisor_float64.value()); |
1378 Node* result = assembler->ChangeFloat64ToTagged(value); | 1374 Node* result = assembler->ChangeFloat64ToTagged(value); |
1379 assembler->Return(result); | 1375 assembler->Return(result); |
1380 } | 1376 } |
1381 } | 1377 } |
1382 | 1378 |
1383 void BitwiseAndStub::GenerateAssembly( | 1379 void BitwiseAndStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
1384 compiler::CodeStubAssembler* assembler) const { | |
1385 using compiler::Node; | 1380 using compiler::Node; |
1386 | 1381 |
1387 Node* lhs = assembler->Parameter(0); | 1382 Node* lhs = assembler->Parameter(0); |
1388 Node* rhs = assembler->Parameter(1); | 1383 Node* rhs = assembler->Parameter(1); |
1389 Node* context = assembler->Parameter(2); | 1384 Node* context = assembler->Parameter(2); |
1390 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); | 1385 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
1391 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); | 1386 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
1392 Node* value = assembler->Word32And(lhs_value, rhs_value); | 1387 Node* value = assembler->Word32And(lhs_value, rhs_value); |
1393 Node* result = assembler->ChangeInt32ToTagged(value); | 1388 Node* result = assembler->ChangeInt32ToTagged(value); |
1394 assembler->Return(result); | 1389 assembler->Return(result); |
1395 } | 1390 } |
1396 | 1391 |
1397 void BitwiseOrStub::GenerateAssembly( | 1392 void BitwiseOrStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
1398 compiler::CodeStubAssembler* assembler) const { | |
1399 using compiler::Node; | 1393 using compiler::Node; |
1400 | 1394 |
1401 Node* lhs = assembler->Parameter(0); | 1395 Node* lhs = assembler->Parameter(0); |
1402 Node* rhs = assembler->Parameter(1); | 1396 Node* rhs = assembler->Parameter(1); |
1403 Node* context = assembler->Parameter(2); | 1397 Node* context = assembler->Parameter(2); |
1404 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); | 1398 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
1405 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); | 1399 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
1406 Node* value = assembler->Word32Or(lhs_value, rhs_value); | 1400 Node* value = assembler->Word32Or(lhs_value, rhs_value); |
1407 Node* result = assembler->ChangeInt32ToTagged(value); | 1401 Node* result = assembler->ChangeInt32ToTagged(value); |
1408 assembler->Return(result); | 1402 assembler->Return(result); |
1409 } | 1403 } |
1410 | 1404 |
1411 void BitwiseXorStub::GenerateAssembly( | 1405 void BitwiseXorStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
1412 compiler::CodeStubAssembler* assembler) const { | |
1413 using compiler::Node; | 1406 using compiler::Node; |
1414 | 1407 |
1415 Node* lhs = assembler->Parameter(0); | 1408 Node* lhs = assembler->Parameter(0); |
1416 Node* rhs = assembler->Parameter(1); | 1409 Node* rhs = assembler->Parameter(1); |
1417 Node* context = assembler->Parameter(2); | 1410 Node* context = assembler->Parameter(2); |
1418 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); | 1411 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); |
1419 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); | 1412 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); |
1420 Node* value = assembler->Word32Xor(lhs_value, rhs_value); | 1413 Node* value = assembler->Word32Xor(lhs_value, rhs_value); |
1421 Node* result = assembler->ChangeInt32ToTagged(value); | 1414 Node* result = assembler->ChangeInt32ToTagged(value); |
1422 assembler->Return(result); | 1415 assembler->Return(result); |
1423 } | 1416 } |
1424 | 1417 |
1425 namespace { | 1418 namespace { |
1426 | 1419 |
1427 enum RelationalComparisonMode { | 1420 enum RelationalComparisonMode { |
1428 kLessThan, | 1421 kLessThan, |
1429 kLessThanOrEqual, | 1422 kLessThanOrEqual, |
1430 kGreaterThan, | 1423 kGreaterThan, |
1431 kGreaterThanOrEqual | 1424 kGreaterThanOrEqual |
1432 }; | 1425 }; |
1433 | 1426 |
1434 void GenerateAbstractRelationalComparison( | 1427 void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler, |
1435 compiler::CodeStubAssembler* assembler, RelationalComparisonMode mode) { | 1428 RelationalComparisonMode mode) { |
1436 typedef compiler::CodeStubAssembler::Label Label; | 1429 typedef CodeStubAssembler::Label Label; |
1437 typedef compiler::Node Node; | 1430 typedef compiler::Node Node; |
1438 typedef compiler::CodeStubAssembler::Variable Variable; | 1431 typedef CodeStubAssembler::Variable Variable; |
1439 | 1432 |
1440 Node* context = assembler->Parameter(2); | 1433 Node* context = assembler->Parameter(2); |
1441 | 1434 |
1442 Label return_true(assembler), return_false(assembler); | 1435 Label return_true(assembler), return_false(assembler); |
1443 | 1436 |
1444 // Shared entry for floating point comparison. | 1437 // Shared entry for floating point comparison. |
1445 Label do_fcmp(assembler); | 1438 Label do_fcmp(assembler); |
1446 Variable var_fcmp_lhs(assembler, MachineRepresentation::kFloat64), | 1439 Variable var_fcmp_lhs(assembler, MachineRepresentation::kFloat64), |
1447 var_fcmp_rhs(assembler, MachineRepresentation::kFloat64); | 1440 var_fcmp_rhs(assembler, MachineRepresentation::kFloat64); |
1448 | 1441 |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1767 | 1760 |
1768 assembler->Bind(&return_true); | 1761 assembler->Bind(&return_true); |
1769 assembler->Return(assembler->BooleanConstant(true)); | 1762 assembler->Return(assembler->BooleanConstant(true)); |
1770 | 1763 |
1771 assembler->Bind(&return_false); | 1764 assembler->Bind(&return_false); |
1772 assembler->Return(assembler->BooleanConstant(false)); | 1765 assembler->Return(assembler->BooleanConstant(false)); |
1773 } | 1766 } |
1774 | 1767 |
1775 enum ResultMode { kDontNegateResult, kNegateResult }; | 1768 enum ResultMode { kDontNegateResult, kNegateResult }; |
1776 | 1769 |
1777 void GenerateEqual_Same(compiler::CodeStubAssembler* assembler, | 1770 void GenerateEqual_Same(CodeStubAssembler* assembler, compiler::Node* value, |
1778 compiler::Node* value, | 1771 CodeStubAssembler::Label* if_equal, |
1779 compiler::CodeStubAssembler::Label* if_equal, | 1772 CodeStubAssembler::Label* if_notequal) { |
1780 compiler::CodeStubAssembler::Label* if_notequal) { | |
1781 // In case of abstract or strict equality checks, we need additional checks | 1773 // In case of abstract or strict equality checks, we need additional checks |
1782 // for NaN values because they are not considered equal, even if both the | 1774 // for NaN values because they are not considered equal, even if both the |
1783 // left and the right hand side reference exactly the same value. | 1775 // left and the right hand side reference exactly the same value. |
1784 // TODO(bmeurer): This seems to violate the SIMD.js specification, but it | 1776 // TODO(bmeurer): This seems to violate the SIMD.js specification, but it |
1785 // seems to be what is tested in the current SIMD.js testsuite. | 1777 // seems to be what is tested in the current SIMD.js testsuite. |
1786 | 1778 |
1787 typedef compiler::CodeStubAssembler::Label Label; | 1779 typedef CodeStubAssembler::Label Label; |
1788 typedef compiler::Node Node; | 1780 typedef compiler::Node Node; |
1789 | 1781 |
1790 // Check if {value} is a Smi or a HeapObject. | 1782 // Check if {value} is a Smi or a HeapObject. |
1791 Label if_valueissmi(assembler), if_valueisnotsmi(assembler); | 1783 Label if_valueissmi(assembler), if_valueisnotsmi(assembler); |
1792 assembler->Branch(assembler->WordIsSmi(value), &if_valueissmi, | 1784 assembler->Branch(assembler->WordIsSmi(value), &if_valueissmi, |
1793 &if_valueisnotsmi); | 1785 &if_valueisnotsmi); |
1794 | 1786 |
1795 assembler->Bind(&if_valueisnotsmi); | 1787 assembler->Bind(&if_valueisnotsmi); |
1796 { | 1788 { |
1797 // Load the map of {value}. | 1789 // Load the map of {value}. |
(...skipping 16 matching lines...) Expand all Loading... |
1814 | 1806 |
1815 assembler->Bind(&if_valueisnotnumber); | 1807 assembler->Bind(&if_valueisnotnumber); |
1816 assembler->Goto(if_equal); | 1808 assembler->Goto(if_equal); |
1817 } | 1809 } |
1818 | 1810 |
1819 assembler->Bind(&if_valueissmi); | 1811 assembler->Bind(&if_valueissmi); |
1820 assembler->Goto(if_equal); | 1812 assembler->Goto(if_equal); |
1821 } | 1813 } |
1822 | 1814 |
1823 void GenerateEqual_Simd128Value_HeapObject( | 1815 void GenerateEqual_Simd128Value_HeapObject( |
1824 compiler::CodeStubAssembler* assembler, compiler::Node* lhs, | 1816 CodeStubAssembler* assembler, compiler::Node* lhs, compiler::Node* lhs_map, |
1825 compiler::Node* lhs_map, compiler::Node* rhs, compiler::Node* rhs_map, | 1817 compiler::Node* rhs, compiler::Node* rhs_map, |
1826 compiler::CodeStubAssembler::Label* if_equal, | 1818 CodeStubAssembler::Label* if_equal, CodeStubAssembler::Label* if_notequal) { |
1827 compiler::CodeStubAssembler::Label* if_notequal) { | 1819 typedef CodeStubAssembler::Label Label; |
1828 typedef compiler::CodeStubAssembler::Label Label; | |
1829 typedef compiler::Node Node; | 1820 typedef compiler::Node Node; |
1830 | 1821 |
1831 // Check if {lhs} and {rhs} have the same map. | 1822 // Check if {lhs} and {rhs} have the same map. |
1832 Label if_mapsame(assembler), if_mapnotsame(assembler); | 1823 Label if_mapsame(assembler), if_mapnotsame(assembler); |
1833 assembler->Branch(assembler->WordEqual(lhs_map, rhs_map), &if_mapsame, | 1824 assembler->Branch(assembler->WordEqual(lhs_map, rhs_map), &if_mapsame, |
1834 &if_mapnotsame); | 1825 &if_mapnotsame); |
1835 | 1826 |
1836 assembler->Bind(&if_mapsame); | 1827 assembler->Bind(&if_mapsame); |
1837 { | 1828 { |
1838 // Both {lhs} and {rhs} are Simd128Values with the same map, need special | 1829 // Both {lhs} and {rhs} are Simd128Values with the same map, need special |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1893 // Bitwise comparison succeeded, {lhs} and {rhs} considered equal. | 1884 // Bitwise comparison succeeded, {lhs} and {rhs} considered equal. |
1894 assembler->Goto(if_equal); | 1885 assembler->Goto(if_equal); |
1895 } | 1886 } |
1896 } | 1887 } |
1897 | 1888 |
1898 assembler->Bind(&if_mapnotsame); | 1889 assembler->Bind(&if_mapnotsame); |
1899 assembler->Goto(if_notequal); | 1890 assembler->Goto(if_notequal); |
1900 } | 1891 } |
1901 | 1892 |
1902 // ES6 section 7.2.12 Abstract Equality Comparison | 1893 // ES6 section 7.2.12 Abstract Equality Comparison |
1903 void GenerateEqual(compiler::CodeStubAssembler* assembler, ResultMode mode) { | 1894 void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) { |
1904 // This is a slightly optimized version of Object::Equals represented as | 1895 // This is a slightly optimized version of Object::Equals represented as |
1905 // scheduled TurboFan graph utilizing the CodeStubAssembler. Whenever you | 1896 // scheduled TurboFan graph utilizing the CodeStubAssembler. Whenever you |
1906 // change something functionality wise in here, remember to update the | 1897 // change something functionality wise in here, remember to update the |
1907 // Object::Equals method as well. | 1898 // Object::Equals method as well. |
1908 typedef compiler::CodeStubAssembler::Label Label; | 1899 typedef CodeStubAssembler::Label Label; |
1909 typedef compiler::Node Node; | 1900 typedef compiler::Node Node; |
1910 typedef compiler::CodeStubAssembler::Variable Variable; | 1901 typedef CodeStubAssembler::Variable Variable; |
1911 | 1902 |
1912 Node* context = assembler->Parameter(2); | 1903 Node* context = assembler->Parameter(2); |
1913 | 1904 |
1914 Label if_equal(assembler), if_notequal(assembler); | 1905 Label if_equal(assembler), if_notequal(assembler); |
1915 | 1906 |
1916 // Shared entry for floating point comparison. | 1907 // Shared entry for floating point comparison. |
1917 Label do_fcmp(assembler); | 1908 Label do_fcmp(assembler); |
1918 Variable var_fcmp_lhs(assembler, MachineRepresentation::kFloat64), | 1909 Variable var_fcmp_lhs(assembler, MachineRepresentation::kFloat64), |
1919 var_fcmp_rhs(assembler, MachineRepresentation::kFloat64); | 1910 var_fcmp_rhs(assembler, MachineRepresentation::kFloat64); |
1920 | 1911 |
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2421 assembler->BranchIfFloat64Equal(lhs, rhs, &if_equal, &if_notequal); | 2412 assembler->BranchIfFloat64Equal(lhs, rhs, &if_equal, &if_notequal); |
2422 } | 2413 } |
2423 | 2414 |
2424 assembler->Bind(&if_equal); | 2415 assembler->Bind(&if_equal); |
2425 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); | 2416 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); |
2426 | 2417 |
2427 assembler->Bind(&if_notequal); | 2418 assembler->Bind(&if_notequal); |
2428 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); | 2419 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); |
2429 } | 2420 } |
2430 | 2421 |
2431 void GenerateStrictEqual(compiler::CodeStubAssembler* assembler, | 2422 void GenerateStrictEqual(CodeStubAssembler* assembler, ResultMode mode) { |
2432 ResultMode mode) { | |
2433 // Here's pseudo-code for the algorithm below in case of kDontNegateResult | 2423 // Here's pseudo-code for the algorithm below in case of kDontNegateResult |
2434 // mode; for kNegateResult mode we properly negate the result. | 2424 // mode; for kNegateResult mode we properly negate the result. |
2435 // | 2425 // |
2436 // if (lhs == rhs) { | 2426 // if (lhs == rhs) { |
2437 // if (lhs->IsHeapNumber()) return HeapNumber::cast(lhs)->value() != NaN; | 2427 // if (lhs->IsHeapNumber()) return HeapNumber::cast(lhs)->value() != NaN; |
2438 // return true; | 2428 // return true; |
2439 // } | 2429 // } |
2440 // if (!lhs->IsSmi()) { | 2430 // if (!lhs->IsSmi()) { |
2441 // if (lhs->IsHeapNumber()) { | 2431 // if (lhs->IsHeapNumber()) { |
2442 // if (rhs->IsSmi()) { | 2432 // if (rhs->IsSmi()) { |
(...skipping 28 matching lines...) Expand all Loading... |
2471 // return false; | 2461 // return false; |
2472 // } else { | 2462 // } else { |
2473 // if (rhs->IsHeapNumber()) { | 2463 // if (rhs->IsHeapNumber()) { |
2474 // return Smi::cast(lhs)->value() == HeapNumber::cast(rhs)->value(); | 2464 // return Smi::cast(lhs)->value() == HeapNumber::cast(rhs)->value(); |
2475 // } else { | 2465 // } else { |
2476 // return false; | 2466 // return false; |
2477 // } | 2467 // } |
2478 // } | 2468 // } |
2479 // } | 2469 // } |
2480 | 2470 |
2481 typedef compiler::CodeStubAssembler::Label Label; | 2471 typedef CodeStubAssembler::Label Label; |
2482 typedef compiler::Node Node; | 2472 typedef compiler::Node Node; |
2483 | 2473 |
2484 Node* lhs = assembler->Parameter(0); | 2474 Node* lhs = assembler->Parameter(0); |
2485 Node* rhs = assembler->Parameter(1); | 2475 Node* rhs = assembler->Parameter(1); |
2486 Node* context = assembler->Parameter(2); | 2476 Node* context = assembler->Parameter(2); |
2487 | 2477 |
2488 Label if_equal(assembler), if_notequal(assembler); | 2478 Label if_equal(assembler), if_notequal(assembler); |
2489 | 2479 |
2490 // Check if {lhs} and {rhs} refer to the same object. | 2480 // Check if {lhs} and {rhs} refer to the same object. |
2491 Label if_same(assembler), if_notsame(assembler); | 2481 Label if_same(assembler), if_notsame(assembler); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2678 } | 2668 } |
2679 } | 2669 } |
2680 | 2670 |
2681 assembler->Bind(&if_equal); | 2671 assembler->Bind(&if_equal); |
2682 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); | 2672 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); |
2683 | 2673 |
2684 assembler->Bind(&if_notequal); | 2674 assembler->Bind(&if_notequal); |
2685 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); | 2675 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); |
2686 } | 2676 } |
2687 | 2677 |
2688 void GenerateStringRelationalComparison(compiler::CodeStubAssembler* assembler, | 2678 void GenerateStringRelationalComparison(CodeStubAssembler* assembler, |
2689 RelationalComparisonMode mode) { | 2679 RelationalComparisonMode mode) { |
2690 typedef compiler::CodeStubAssembler::Label Label; | 2680 typedef CodeStubAssembler::Label Label; |
2691 typedef compiler::Node Node; | 2681 typedef compiler::Node Node; |
2692 typedef compiler::CodeStubAssembler::Variable Variable; | 2682 typedef CodeStubAssembler::Variable Variable; |
2693 | 2683 |
2694 Node* lhs = assembler->Parameter(0); | 2684 Node* lhs = assembler->Parameter(0); |
2695 Node* rhs = assembler->Parameter(1); | 2685 Node* rhs = assembler->Parameter(1); |
2696 Node* context = assembler->Parameter(2); | 2686 Node* context = assembler->Parameter(2); |
2697 | 2687 |
2698 Label if_less(assembler), if_equal(assembler), if_greater(assembler); | 2688 Label if_less(assembler), if_equal(assembler), if_greater(assembler); |
2699 | 2689 |
2700 // Fast check to see if {lhs} and {rhs} refer to the same String object. | 2690 // Fast check to see if {lhs} and {rhs} refer to the same String object. |
2701 Label if_same(assembler), if_notsame(assembler); | 2691 Label if_same(assembler), if_notsame(assembler); |
2702 assembler->Branch(assembler->WordEqual(lhs, rhs), &if_same, &if_notsame); | 2692 assembler->Branch(assembler->WordEqual(lhs, rhs), &if_same, &if_notsame); |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2861 assembler->Return(assembler->BooleanConstant(false)); | 2851 assembler->Return(assembler->BooleanConstant(false)); |
2862 break; | 2852 break; |
2863 | 2853 |
2864 case kGreaterThan: | 2854 case kGreaterThan: |
2865 case kGreaterThanOrEqual: | 2855 case kGreaterThanOrEqual: |
2866 assembler->Return(assembler->BooleanConstant(true)); | 2856 assembler->Return(assembler->BooleanConstant(true)); |
2867 break; | 2857 break; |
2868 } | 2858 } |
2869 } | 2859 } |
2870 | 2860 |
2871 void GenerateStringEqual(compiler::CodeStubAssembler* assembler, | 2861 void GenerateStringEqual(CodeStubAssembler* assembler, ResultMode mode) { |
2872 ResultMode mode) { | |
2873 // Here's pseudo-code for the algorithm below in case of kDontNegateResult | 2862 // Here's pseudo-code for the algorithm below in case of kDontNegateResult |
2874 // mode; for kNegateResult mode we properly negate the result. | 2863 // mode; for kNegateResult mode we properly negate the result. |
2875 // | 2864 // |
2876 // if (lhs == rhs) return true; | 2865 // if (lhs == rhs) return true; |
2877 // if (lhs->length() != rhs->length()) return false; | 2866 // if (lhs->length() != rhs->length()) return false; |
2878 // if (lhs->IsInternalizedString() && rhs->IsInternalizedString()) { | 2867 // if (lhs->IsInternalizedString() && rhs->IsInternalizedString()) { |
2879 // return false; | 2868 // return false; |
2880 // } | 2869 // } |
2881 // if (lhs->IsSeqOneByteString() && rhs->IsSeqOneByteString()) { | 2870 // if (lhs->IsSeqOneByteString() && rhs->IsSeqOneByteString()) { |
2882 // for (i = 0; i != lhs->length(); ++i) { | 2871 // for (i = 0; i != lhs->length(); ++i) { |
2883 // if (lhs[i] != rhs[i]) return false; | 2872 // if (lhs[i] != rhs[i]) return false; |
2884 // } | 2873 // } |
2885 // return true; | 2874 // return true; |
2886 // } | 2875 // } |
2887 // return %StringEqual(lhs, rhs); | 2876 // return %StringEqual(lhs, rhs); |
2888 | 2877 |
2889 typedef compiler::CodeStubAssembler::Label Label; | 2878 typedef CodeStubAssembler::Label Label; |
2890 typedef compiler::Node Node; | 2879 typedef compiler::Node Node; |
2891 typedef compiler::CodeStubAssembler::Variable Variable; | 2880 typedef CodeStubAssembler::Variable Variable; |
2892 | 2881 |
2893 Node* lhs = assembler->Parameter(0); | 2882 Node* lhs = assembler->Parameter(0); |
2894 Node* rhs = assembler->Parameter(1); | 2883 Node* rhs = assembler->Parameter(1); |
2895 Node* context = assembler->Parameter(2); | 2884 Node* context = assembler->Parameter(2); |
2896 | 2885 |
2897 Label if_equal(assembler), if_notequal(assembler); | 2886 Label if_equal(assembler), if_notequal(assembler); |
2898 | 2887 |
2899 // Fast check to see if {lhs} and {rhs} refer to the same String object. | 2888 // Fast check to see if {lhs} and {rhs} refer to the same String object. |
2900 Label if_same(assembler), if_notsame(assembler); | 2889 Label if_same(assembler), if_notsame(assembler); |
2901 assembler->Branch(assembler->WordEqual(lhs, rhs), &if_same, &if_notsame); | 2890 assembler->Branch(assembler->WordEqual(lhs, rhs), &if_same, &if_notsame); |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3040 | 3029 |
3041 assembler->Bind(&if_equal); | 3030 assembler->Bind(&if_equal); |
3042 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); | 3031 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); |
3043 | 3032 |
3044 assembler->Bind(&if_notequal); | 3033 assembler->Bind(&if_notequal); |
3045 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); | 3034 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); |
3046 } | 3035 } |
3047 | 3036 |
3048 } // namespace | 3037 } // namespace |
3049 | 3038 |
3050 void LessThanStub::GenerateAssembly( | 3039 void LessThanStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3051 compiler::CodeStubAssembler* assembler) const { | |
3052 GenerateAbstractRelationalComparison(assembler, kLessThan); | 3040 GenerateAbstractRelationalComparison(assembler, kLessThan); |
3053 } | 3041 } |
3054 | 3042 |
3055 void LessThanOrEqualStub::GenerateAssembly( | 3043 void LessThanOrEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3056 compiler::CodeStubAssembler* assembler) const { | |
3057 GenerateAbstractRelationalComparison(assembler, kLessThanOrEqual); | 3044 GenerateAbstractRelationalComparison(assembler, kLessThanOrEqual); |
3058 } | 3045 } |
3059 | 3046 |
3060 void GreaterThanStub::GenerateAssembly( | 3047 void GreaterThanStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3061 compiler::CodeStubAssembler* assembler) const { | |
3062 GenerateAbstractRelationalComparison(assembler, kGreaterThan); | 3048 GenerateAbstractRelationalComparison(assembler, kGreaterThan); |
3063 } | 3049 } |
3064 | 3050 |
3065 void GreaterThanOrEqualStub::GenerateAssembly( | 3051 void GreaterThanOrEqualStub::GenerateAssembly( |
3066 compiler::CodeStubAssembler* assembler) const { | 3052 CodeStubAssembler* assembler) const { |
3067 GenerateAbstractRelationalComparison(assembler, kGreaterThanOrEqual); | 3053 GenerateAbstractRelationalComparison(assembler, kGreaterThanOrEqual); |
3068 } | 3054 } |
3069 | 3055 |
3070 void EqualStub::GenerateAssembly(compiler::CodeStubAssembler* assembler) const { | 3056 void EqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3071 GenerateEqual(assembler, kDontNegateResult); | 3057 GenerateEqual(assembler, kDontNegateResult); |
3072 } | 3058 } |
3073 | 3059 |
3074 void NotEqualStub::GenerateAssembly( | 3060 void NotEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3075 compiler::CodeStubAssembler* assembler) const { | |
3076 GenerateEqual(assembler, kNegateResult); | 3061 GenerateEqual(assembler, kNegateResult); |
3077 } | 3062 } |
3078 | 3063 |
3079 void StrictEqualStub::GenerateAssembly( | 3064 void StrictEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3080 compiler::CodeStubAssembler* assembler) const { | |
3081 GenerateStrictEqual(assembler, kDontNegateResult); | 3065 GenerateStrictEqual(assembler, kDontNegateResult); |
3082 } | 3066 } |
3083 | 3067 |
3084 void StrictNotEqualStub::GenerateAssembly( | 3068 void StrictNotEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3085 compiler::CodeStubAssembler* assembler) const { | |
3086 GenerateStrictEqual(assembler, kNegateResult); | 3069 GenerateStrictEqual(assembler, kNegateResult); |
3087 } | 3070 } |
3088 | 3071 |
3089 void StringEqualStub::GenerateAssembly( | 3072 void StringEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3090 compiler::CodeStubAssembler* assembler) const { | |
3091 GenerateStringEqual(assembler, kDontNegateResult); | 3073 GenerateStringEqual(assembler, kDontNegateResult); |
3092 } | 3074 } |
3093 | 3075 |
3094 void StringNotEqualStub::GenerateAssembly( | 3076 void StringNotEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3095 compiler::CodeStubAssembler* assembler) const { | |
3096 GenerateStringEqual(assembler, kNegateResult); | 3077 GenerateStringEqual(assembler, kNegateResult); |
3097 } | 3078 } |
3098 | 3079 |
3099 void StringLessThanStub::GenerateAssembly( | 3080 void StringLessThanStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3100 compiler::CodeStubAssembler* assembler) const { | |
3101 GenerateStringRelationalComparison(assembler, kLessThan); | 3081 GenerateStringRelationalComparison(assembler, kLessThan); |
3102 } | 3082 } |
3103 | 3083 |
3104 void StringLessThanOrEqualStub::GenerateAssembly( | 3084 void StringLessThanOrEqualStub::GenerateAssembly( |
3105 compiler::CodeStubAssembler* assembler) const { | 3085 CodeStubAssembler* assembler) const { |
3106 GenerateStringRelationalComparison(assembler, kLessThanOrEqual); | 3086 GenerateStringRelationalComparison(assembler, kLessThanOrEqual); |
3107 } | 3087 } |
3108 | 3088 |
3109 void StringGreaterThanStub::GenerateAssembly( | 3089 void StringGreaterThanStub::GenerateAssembly( |
3110 compiler::CodeStubAssembler* assembler) const { | 3090 CodeStubAssembler* assembler) const { |
3111 GenerateStringRelationalComparison(assembler, kGreaterThan); | 3091 GenerateStringRelationalComparison(assembler, kGreaterThan); |
3112 } | 3092 } |
3113 | 3093 |
3114 void StringGreaterThanOrEqualStub::GenerateAssembly( | 3094 void StringGreaterThanOrEqualStub::GenerateAssembly( |
3115 compiler::CodeStubAssembler* assembler) const { | 3095 CodeStubAssembler* assembler) const { |
3116 GenerateStringRelationalComparison(assembler, kGreaterThanOrEqual); | 3096 GenerateStringRelationalComparison(assembler, kGreaterThanOrEqual); |
3117 } | 3097 } |
3118 | 3098 |
3119 void ToLengthStub::GenerateAssembly( | 3099 void ToLengthStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3120 compiler::CodeStubAssembler* assembler) const { | 3100 typedef CodeStubAssembler::Label Label; |
3121 typedef compiler::CodeStubAssembler::Label Label; | |
3122 typedef compiler::Node Node; | 3101 typedef compiler::Node Node; |
3123 typedef compiler::CodeStubAssembler::Variable Variable; | 3102 typedef CodeStubAssembler::Variable Variable; |
3124 | 3103 |
3125 Node* context = assembler->Parameter(1); | 3104 Node* context = assembler->Parameter(1); |
3126 | 3105 |
3127 // We might need to loop once for ToNumber conversion. | 3106 // We might need to loop once for ToNumber conversion. |
3128 Variable var_len(assembler, MachineRepresentation::kTagged); | 3107 Variable var_len(assembler, MachineRepresentation::kTagged); |
3129 Label loop(assembler, &var_len); | 3108 Label loop(assembler, &var_len); |
3130 var_len.Bind(assembler->Parameter(0)); | 3109 var_len.Bind(assembler->Parameter(0)); |
3131 assembler->Goto(&loop); | 3110 assembler->Goto(&loop); |
3132 assembler->Bind(&loop); | 3111 assembler->Bind(&loop); |
3133 { | 3112 { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3186 assembler->Return(var_len.value()); | 3165 assembler->Return(var_len.value()); |
3187 | 3166 |
3188 assembler->Bind(&return_two53minus1); | 3167 assembler->Bind(&return_two53minus1); |
3189 assembler->Return(assembler->NumberConstant(kMaxSafeInteger)); | 3168 assembler->Return(assembler->NumberConstant(kMaxSafeInteger)); |
3190 | 3169 |
3191 assembler->Bind(&return_zero); | 3170 assembler->Bind(&return_zero); |
3192 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); | 3171 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); |
3193 } | 3172 } |
3194 } | 3173 } |
3195 | 3174 |
3196 void ToBooleanStub::GenerateAssembly( | 3175 void ToBooleanStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3197 compiler::CodeStubAssembler* assembler) const { | |
3198 typedef compiler::Node Node; | 3176 typedef compiler::Node Node; |
3199 typedef compiler::CodeStubAssembler::Label Label; | 3177 typedef CodeStubAssembler::Label Label; |
3200 | 3178 |
3201 Node* value = assembler->Parameter(0); | 3179 Node* value = assembler->Parameter(0); |
3202 Label if_valueissmi(assembler), if_valueisnotsmi(assembler); | 3180 Label if_valueissmi(assembler), if_valueisnotsmi(assembler); |
3203 | 3181 |
3204 // Check if {value} is a Smi or a HeapObject. | 3182 // Check if {value} is a Smi or a HeapObject. |
3205 assembler->Branch(assembler->WordIsSmi(value), &if_valueissmi, | 3183 assembler->Branch(assembler->WordIsSmi(value), &if_valueissmi, |
3206 &if_valueisnotsmi); | 3184 &if_valueisnotsmi); |
3207 | 3185 |
3208 assembler->Bind(&if_valueissmi); | 3186 assembler->Bind(&if_valueissmi); |
3209 { | 3187 { |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3325 | 3303 |
3326 assembler->Bind(&if_valueisundetectable); | 3304 assembler->Bind(&if_valueisundetectable); |
3327 assembler->Return(assembler->BooleanConstant(false)); | 3305 assembler->Return(assembler->BooleanConstant(false)); |
3328 | 3306 |
3329 assembler->Bind(&if_valueisnotundetectable); | 3307 assembler->Bind(&if_valueisnotundetectable); |
3330 assembler->Return(assembler->BooleanConstant(true)); | 3308 assembler->Return(assembler->BooleanConstant(true)); |
3331 } | 3309 } |
3332 } | 3310 } |
3333 } | 3311 } |
3334 | 3312 |
3335 void ToIntegerStub::GenerateAssembly( | 3313 void ToIntegerStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3336 compiler::CodeStubAssembler* assembler) const { | 3314 typedef CodeStubAssembler::Label Label; |
3337 typedef compiler::CodeStubAssembler::Label Label; | |
3338 typedef compiler::Node Node; | 3315 typedef compiler::Node Node; |
3339 typedef compiler::CodeStubAssembler::Variable Variable; | 3316 typedef CodeStubAssembler::Variable Variable; |
3340 | 3317 |
3341 Node* context = assembler->Parameter(1); | 3318 Node* context = assembler->Parameter(1); |
3342 | 3319 |
3343 // We might need to loop once for ToNumber conversion. | 3320 // We might need to loop once for ToNumber conversion. |
3344 Variable var_arg(assembler, MachineRepresentation::kTagged); | 3321 Variable var_arg(assembler, MachineRepresentation::kTagged); |
3345 Label loop(assembler, &var_arg); | 3322 Label loop(assembler, &var_arg); |
3346 var_arg.Bind(assembler->Parameter(0)); | 3323 var_arg.Bind(assembler->Parameter(0)); |
3347 assembler->Goto(&loop); | 3324 assembler->Goto(&loop); |
3348 assembler->Bind(&loop); | 3325 assembler->Bind(&loop); |
3349 { | 3326 { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3388 | 3365 |
3389 assembler->Bind(&return_arg); | 3366 assembler->Bind(&return_arg); |
3390 assembler->Return(var_arg.value()); | 3367 assembler->Return(var_arg.value()); |
3391 | 3368 |
3392 assembler->Bind(&return_zero); | 3369 assembler->Bind(&return_zero); |
3393 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); | 3370 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); |
3394 } | 3371 } |
3395 } | 3372 } |
3396 | 3373 |
3397 void StoreInterceptorStub::GenerateAssembly( | 3374 void StoreInterceptorStub::GenerateAssembly( |
3398 compiler::CodeStubAssembler* assembler) const { | 3375 CodeStubAssembler* assembler) const { |
3399 typedef compiler::Node Node; | 3376 typedef compiler::Node Node; |
3400 Node* receiver = assembler->Parameter(0); | 3377 Node* receiver = assembler->Parameter(0); |
3401 Node* name = assembler->Parameter(1); | 3378 Node* name = assembler->Parameter(1); |
3402 Node* value = assembler->Parameter(2); | 3379 Node* value = assembler->Parameter(2); |
3403 Node* context = assembler->Parameter(3); | 3380 Node* context = assembler->Parameter(3); |
3404 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, | 3381 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, |
3405 receiver, name, value); | 3382 receiver, name, value); |
3406 } | 3383 } |
3407 | 3384 |
3408 void LoadIndexedInterceptorStub::GenerateAssembly( | 3385 void LoadIndexedInterceptorStub::GenerateAssembly( |
3409 compiler::CodeStubAssembler* assembler) const { | 3386 CodeStubAssembler* assembler) const { |
3410 typedef compiler::Node Node; | 3387 typedef compiler::Node Node; |
3411 typedef compiler::CodeStubAssembler::Label Label; | 3388 typedef CodeStubAssembler::Label Label; |
3412 Node* receiver = assembler->Parameter(0); | 3389 Node* receiver = assembler->Parameter(0); |
3413 Node* key = assembler->Parameter(1); | 3390 Node* key = assembler->Parameter(1); |
3414 Node* slot = assembler->Parameter(2); | 3391 Node* slot = assembler->Parameter(2); |
3415 Node* vector = assembler->Parameter(3); | 3392 Node* vector = assembler->Parameter(3); |
3416 Node* context = assembler->Parameter(4); | 3393 Node* context = assembler->Parameter(4); |
3417 | 3394 |
3418 Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler); | 3395 Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler); |
3419 assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi, | 3396 assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi, |
3420 &if_keyisinvalid); | 3397 &if_keyisinvalid); |
3421 assembler->Bind(&if_keyispositivesmi); | 3398 assembler->Bind(&if_keyispositivesmi); |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3863 if (type->Is(Type::UntaggedPointer())) { | 3840 if (type->Is(Type::UntaggedPointer())) { |
3864 return Representation::External(); | 3841 return Representation::External(); |
3865 } | 3842 } |
3866 | 3843 |
3867 DCHECK(!type->Is(Type::Untagged())); | 3844 DCHECK(!type->Is(Type::Untagged())); |
3868 return Representation::Tagged(); | 3845 return Representation::Tagged(); |
3869 } | 3846 } |
3870 | 3847 |
3871 } // namespace internal | 3848 } // namespace internal |
3872 } // namespace v8 | 3849 } // namespace v8 |
OLD | NEW |