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

Side by Side Diff: src/code-stubs.cc

Issue 1875583003: Separate CodeAssembler and CodeStubAssembler (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix gn build Created 4 years, 8 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
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698