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

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. Again. 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
« no previous file with comments | « src/code-stubs.h ('k') | src/compiler/code-assembler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 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 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1372 1368
1373 assembler->Bind(&do_fdiv); 1369 assembler->Bind(&do_fdiv);
1374 { 1370 {
1375 Node* value = assembler->Float64Div(var_dividend_float64.value(), 1371 Node* value = assembler->Float64Div(var_dividend_float64.value(),
1376 var_divisor_float64.value()); 1372 var_divisor_float64.value());
1377 Node* result = assembler->ChangeFloat64ToTagged(value); 1373 Node* result = assembler->ChangeFloat64ToTagged(value);
1378 assembler->Return(result); 1374 assembler->Return(result);
1379 } 1375 }
1380 } 1376 }
1381 1377
1382 void BitwiseAndStub::GenerateAssembly( 1378 void BitwiseAndStub::GenerateAssembly(CodeStubAssembler* assembler) const {
1383 compiler::CodeStubAssembler* assembler) const {
1384 using compiler::Node; 1379 using compiler::Node;
1385 1380
1386 Node* lhs = assembler->Parameter(0); 1381 Node* lhs = assembler->Parameter(0);
1387 Node* rhs = assembler->Parameter(1); 1382 Node* rhs = assembler->Parameter(1);
1388 Node* context = assembler->Parameter(2); 1383 Node* context = assembler->Parameter(2);
1389 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); 1384 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1390 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); 1385 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1391 Node* value = assembler->Word32And(lhs_value, rhs_value); 1386 Node* value = assembler->Word32And(lhs_value, rhs_value);
1392 Node* result = assembler->ChangeInt32ToTagged(value); 1387 Node* result = assembler->ChangeInt32ToTagged(value);
1393 assembler->Return(result); 1388 assembler->Return(result);
1394 } 1389 }
1395 1390
1396 void ModulusStub::GenerateAssembly( 1391 void ModulusStub::GenerateAssembly(CodeStubAssembler* assembler) const {
1397 compiler::CodeStubAssembler* assembler) const {
1398 using compiler::Node; 1392 using compiler::Node;
1399 typedef compiler::CodeStubAssembler::Label Label; 1393 typedef CodeStubAssembler::Label Label;
1400 typedef compiler::CodeStubAssembler::Variable Variable; 1394 typedef CodeStubAssembler::Variable Variable;
1401 1395
1402 Node* context = assembler->Parameter(2); 1396 Node* context = assembler->Parameter(2);
1403 1397
1404 // Shared entry point for floating point modulus. 1398 // Shared entry point for floating point modulus.
1405 Label do_fmod(assembler); 1399 Label do_fmod(assembler);
1406 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), 1400 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64),
1407 var_divisor_float64(assembler, MachineRepresentation::kFloat64); 1401 var_divisor_float64(assembler, MachineRepresentation::kFloat64);
1408 1402
1409 Node* number_map = assembler->HeapNumberMapConstant(); 1403 Node* number_map = assembler->HeapNumberMapConstant();
1410 1404
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1535 1529
1536 assembler->Bind(&do_fmod); 1530 assembler->Bind(&do_fmod);
1537 { 1531 {
1538 Node* value = assembler->Float64Mod(var_dividend_float64.value(), 1532 Node* value = assembler->Float64Mod(var_dividend_float64.value(),
1539 var_divisor_float64.value()); 1533 var_divisor_float64.value());
1540 Node* result = assembler->ChangeFloat64ToTagged(value); 1534 Node* result = assembler->ChangeFloat64ToTagged(value);
1541 assembler->Return(result); 1535 assembler->Return(result);
1542 } 1536 }
1543 } 1537 }
1544 1538
1545 void ShiftLeftStub::GenerateAssembly( 1539 void ShiftLeftStub::GenerateAssembly(CodeStubAssembler* assembler) const {
1546 compiler::CodeStubAssembler* assembler) const {
1547 using compiler::Node; 1540 using compiler::Node;
1548 1541
1549 Node* lhs = assembler->Parameter(0); 1542 Node* lhs = assembler->Parameter(0);
1550 Node* rhs = assembler->Parameter(1); 1543 Node* rhs = assembler->Parameter(1);
1551 Node* context = assembler->Parameter(2); 1544 Node* context = assembler->Parameter(2);
1552 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); 1545 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1553 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); 1546 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1554 Node* shift_count = 1547 Node* shift_count =
1555 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f)); 1548 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f));
1556 Node* value = assembler->Word32Shl(lhs_value, shift_count); 1549 Node* value = assembler->Word32Shl(lhs_value, shift_count);
1557 Node* result = assembler->ChangeInt32ToTagged(value); 1550 Node* result = assembler->ChangeInt32ToTagged(value);
1558 assembler->Return(result); 1551 assembler->Return(result);
1559 } 1552 }
1560 1553
1561 void ShiftRightStub::GenerateAssembly( 1554 void ShiftRightStub::GenerateAssembly(CodeStubAssembler* assembler) const {
1562 compiler::CodeStubAssembler* assembler) const {
1563 using compiler::Node; 1555 using compiler::Node;
1564 1556
1565 Node* lhs = assembler->Parameter(0); 1557 Node* lhs = assembler->Parameter(0);
1566 Node* rhs = assembler->Parameter(1); 1558 Node* rhs = assembler->Parameter(1);
1567 Node* context = assembler->Parameter(2); 1559 Node* context = assembler->Parameter(2);
1568 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); 1560 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1569 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); 1561 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1570 Node* shift_count = 1562 Node* shift_count =
1571 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f)); 1563 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f));
1572 Node* value = assembler->Word32Sar(lhs_value, shift_count); 1564 Node* value = assembler->Word32Sar(lhs_value, shift_count);
1573 Node* result = assembler->ChangeInt32ToTagged(value); 1565 Node* result = assembler->ChangeInt32ToTagged(value);
1574 assembler->Return(result); 1566 assembler->Return(result);
1575 } 1567 }
1576 1568
1577 void ShiftRightLogicalStub::GenerateAssembly( 1569 void ShiftRightLogicalStub::GenerateAssembly(
1578 compiler::CodeStubAssembler* assembler) const { 1570 CodeStubAssembler* assembler) const {
1579 using compiler::Node; 1571 using compiler::Node;
1580 1572
1581 Node* lhs = assembler->Parameter(0); 1573 Node* lhs = assembler->Parameter(0);
1582 Node* rhs = assembler->Parameter(1); 1574 Node* rhs = assembler->Parameter(1);
1583 Node* context = assembler->Parameter(2); 1575 Node* context = assembler->Parameter(2);
1584 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); 1576 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1585 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); 1577 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1586 Node* shift_count = 1578 Node* shift_count =
1587 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f)); 1579 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f));
1588 Node* value = assembler->Word32Shr(lhs_value, shift_count); 1580 Node* value = assembler->Word32Shr(lhs_value, shift_count);
1589 Node* result = assembler->ChangeUint32ToTagged(value); 1581 Node* result = assembler->ChangeUint32ToTagged(value);
1590 assembler->Return(result); 1582 assembler->Return(result);
1591 } 1583 }
1592 1584
1593 void BitwiseOrStub::GenerateAssembly( 1585 void BitwiseOrStub::GenerateAssembly(CodeStubAssembler* assembler) const {
1594 compiler::CodeStubAssembler* assembler) const {
1595 using compiler::Node; 1586 using compiler::Node;
1596 1587
1597 Node* lhs = assembler->Parameter(0); 1588 Node* lhs = assembler->Parameter(0);
1598 Node* rhs = assembler->Parameter(1); 1589 Node* rhs = assembler->Parameter(1);
1599 Node* context = assembler->Parameter(2); 1590 Node* context = assembler->Parameter(2);
1600 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); 1591 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1601 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); 1592 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1602 Node* value = assembler->Word32Or(lhs_value, rhs_value); 1593 Node* value = assembler->Word32Or(lhs_value, rhs_value);
1603 Node* result = assembler->ChangeInt32ToTagged(value); 1594 Node* result = assembler->ChangeInt32ToTagged(value);
1604 assembler->Return(result); 1595 assembler->Return(result);
1605 } 1596 }
1606 1597
1607 void BitwiseXorStub::GenerateAssembly( 1598 void BitwiseXorStub::GenerateAssembly(CodeStubAssembler* assembler) const {
1608 compiler::CodeStubAssembler* assembler) const {
1609 using compiler::Node; 1599 using compiler::Node;
1610 1600
1611 Node* lhs = assembler->Parameter(0); 1601 Node* lhs = assembler->Parameter(0);
1612 Node* rhs = assembler->Parameter(1); 1602 Node* rhs = assembler->Parameter(1);
1613 Node* context = assembler->Parameter(2); 1603 Node* context = assembler->Parameter(2);
1614 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); 1604 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1615 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); 1605 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1616 Node* value = assembler->Word32Xor(lhs_value, rhs_value); 1606 Node* value = assembler->Word32Xor(lhs_value, rhs_value);
1617 Node* result = assembler->ChangeInt32ToTagged(value); 1607 Node* result = assembler->ChangeInt32ToTagged(value);
1618 assembler->Return(result); 1608 assembler->Return(result);
1619 } 1609 }
1620 1610
1621 namespace { 1611 namespace {
1622 1612
1623 enum RelationalComparisonMode { 1613 enum RelationalComparisonMode {
1624 kLessThan, 1614 kLessThan,
1625 kLessThanOrEqual, 1615 kLessThanOrEqual,
1626 kGreaterThan, 1616 kGreaterThan,
1627 kGreaterThanOrEqual 1617 kGreaterThanOrEqual
1628 }; 1618 };
1629 1619
1630 void GenerateAbstractRelationalComparison( 1620 void GenerateAbstractRelationalComparison(CodeStubAssembler* assembler,
1631 compiler::CodeStubAssembler* assembler, RelationalComparisonMode mode) { 1621 RelationalComparisonMode mode) {
1632 typedef compiler::CodeStubAssembler::Label Label; 1622 typedef CodeStubAssembler::Label Label;
1633 typedef compiler::Node Node; 1623 typedef compiler::Node Node;
1634 typedef compiler::CodeStubAssembler::Variable Variable; 1624 typedef CodeStubAssembler::Variable Variable;
1635 1625
1636 Node* context = assembler->Parameter(2); 1626 Node* context = assembler->Parameter(2);
1637 1627
1638 Label return_true(assembler), return_false(assembler); 1628 Label return_true(assembler), return_false(assembler);
1639 1629
1640 // Shared entry for floating point comparison. 1630 // Shared entry for floating point comparison.
1641 Label do_fcmp(assembler); 1631 Label do_fcmp(assembler);
1642 Variable var_fcmp_lhs(assembler, MachineRepresentation::kFloat64), 1632 Variable var_fcmp_lhs(assembler, MachineRepresentation::kFloat64),
1643 var_fcmp_rhs(assembler, MachineRepresentation::kFloat64); 1633 var_fcmp_rhs(assembler, MachineRepresentation::kFloat64);
1644 1634
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1963 1953
1964 assembler->Bind(&return_true); 1954 assembler->Bind(&return_true);
1965 assembler->Return(assembler->BooleanConstant(true)); 1955 assembler->Return(assembler->BooleanConstant(true));
1966 1956
1967 assembler->Bind(&return_false); 1957 assembler->Bind(&return_false);
1968 assembler->Return(assembler->BooleanConstant(false)); 1958 assembler->Return(assembler->BooleanConstant(false));
1969 } 1959 }
1970 1960
1971 enum ResultMode { kDontNegateResult, kNegateResult }; 1961 enum ResultMode { kDontNegateResult, kNegateResult };
1972 1962
1973 void GenerateEqual_Same(compiler::CodeStubAssembler* assembler, 1963 void GenerateEqual_Same(CodeStubAssembler* assembler, compiler::Node* value,
1974 compiler::Node* value, 1964 CodeStubAssembler::Label* if_equal,
1975 compiler::CodeStubAssembler::Label* if_equal, 1965 CodeStubAssembler::Label* if_notequal) {
1976 compiler::CodeStubAssembler::Label* if_notequal) {
1977 // In case of abstract or strict equality checks, we need additional checks 1966 // In case of abstract or strict equality checks, we need additional checks
1978 // for NaN values because they are not considered equal, even if both the 1967 // for NaN values because they are not considered equal, even if both the
1979 // left and the right hand side reference exactly the same value. 1968 // left and the right hand side reference exactly the same value.
1980 // TODO(bmeurer): This seems to violate the SIMD.js specification, but it 1969 // TODO(bmeurer): This seems to violate the SIMD.js specification, but it
1981 // seems to be what is tested in the current SIMD.js testsuite. 1970 // seems to be what is tested in the current SIMD.js testsuite.
1982 1971
1983 typedef compiler::CodeStubAssembler::Label Label; 1972 typedef CodeStubAssembler::Label Label;
1984 typedef compiler::Node Node; 1973 typedef compiler::Node Node;
1985 1974
1986 // Check if {value} is a Smi or a HeapObject. 1975 // Check if {value} is a Smi or a HeapObject.
1987 Label if_valueissmi(assembler), if_valueisnotsmi(assembler); 1976 Label if_valueissmi(assembler), if_valueisnotsmi(assembler);
1988 assembler->Branch(assembler->WordIsSmi(value), &if_valueissmi, 1977 assembler->Branch(assembler->WordIsSmi(value), &if_valueissmi,
1989 &if_valueisnotsmi); 1978 &if_valueisnotsmi);
1990 1979
1991 assembler->Bind(&if_valueisnotsmi); 1980 assembler->Bind(&if_valueisnotsmi);
1992 { 1981 {
1993 // Load the map of {value}. 1982 // Load the map of {value}.
(...skipping 16 matching lines...) Expand all
2010 1999
2011 assembler->Bind(&if_valueisnotnumber); 2000 assembler->Bind(&if_valueisnotnumber);
2012 assembler->Goto(if_equal); 2001 assembler->Goto(if_equal);
2013 } 2002 }
2014 2003
2015 assembler->Bind(&if_valueissmi); 2004 assembler->Bind(&if_valueissmi);
2016 assembler->Goto(if_equal); 2005 assembler->Goto(if_equal);
2017 } 2006 }
2018 2007
2019 void GenerateEqual_Simd128Value_HeapObject( 2008 void GenerateEqual_Simd128Value_HeapObject(
2020 compiler::CodeStubAssembler* assembler, compiler::Node* lhs, 2009 CodeStubAssembler* assembler, compiler::Node* lhs, compiler::Node* lhs_map,
2021 compiler::Node* lhs_map, compiler::Node* rhs, compiler::Node* rhs_map, 2010 compiler::Node* rhs, compiler::Node* rhs_map,
2022 compiler::CodeStubAssembler::Label* if_equal, 2011 CodeStubAssembler::Label* if_equal, CodeStubAssembler::Label* if_notequal) {
2023 compiler::CodeStubAssembler::Label* if_notequal) { 2012 typedef CodeStubAssembler::Label Label;
2024 typedef compiler::CodeStubAssembler::Label Label;
2025 typedef compiler::Node Node; 2013 typedef compiler::Node Node;
2026 2014
2027 // Check if {lhs} and {rhs} have the same map. 2015 // Check if {lhs} and {rhs} have the same map.
2028 Label if_mapsame(assembler), if_mapnotsame(assembler); 2016 Label if_mapsame(assembler), if_mapnotsame(assembler);
2029 assembler->Branch(assembler->WordEqual(lhs_map, rhs_map), &if_mapsame, 2017 assembler->Branch(assembler->WordEqual(lhs_map, rhs_map), &if_mapsame,
2030 &if_mapnotsame); 2018 &if_mapnotsame);
2031 2019
2032 assembler->Bind(&if_mapsame); 2020 assembler->Bind(&if_mapsame);
2033 { 2021 {
2034 // Both {lhs} and {rhs} are Simd128Values with the same map, need special 2022 // Both {lhs} and {rhs} are Simd128Values with the same map, need special
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2089 // Bitwise comparison succeeded, {lhs} and {rhs} considered equal. 2077 // Bitwise comparison succeeded, {lhs} and {rhs} considered equal.
2090 assembler->Goto(if_equal); 2078 assembler->Goto(if_equal);
2091 } 2079 }
2092 } 2080 }
2093 2081
2094 assembler->Bind(&if_mapnotsame); 2082 assembler->Bind(&if_mapnotsame);
2095 assembler->Goto(if_notequal); 2083 assembler->Goto(if_notequal);
2096 } 2084 }
2097 2085
2098 // ES6 section 7.2.12 Abstract Equality Comparison 2086 // ES6 section 7.2.12 Abstract Equality Comparison
2099 void GenerateEqual(compiler::CodeStubAssembler* assembler, ResultMode mode) { 2087 void GenerateEqual(CodeStubAssembler* assembler, ResultMode mode) {
2100 // This is a slightly optimized version of Object::Equals represented as 2088 // This is a slightly optimized version of Object::Equals represented as
2101 // scheduled TurboFan graph utilizing the CodeStubAssembler. Whenever you 2089 // scheduled TurboFan graph utilizing the CodeStubAssembler. Whenever you
2102 // change something functionality wise in here, remember to update the 2090 // change something functionality wise in here, remember to update the
2103 // Object::Equals method as well. 2091 // Object::Equals method as well.
2104 typedef compiler::CodeStubAssembler::Label Label; 2092 typedef CodeStubAssembler::Label Label;
2105 typedef compiler::Node Node; 2093 typedef compiler::Node Node;
2106 typedef compiler::CodeStubAssembler::Variable Variable; 2094 typedef CodeStubAssembler::Variable Variable;
2107 2095
2108 Node* context = assembler->Parameter(2); 2096 Node* context = assembler->Parameter(2);
2109 2097
2110 Label if_equal(assembler), if_notequal(assembler); 2098 Label if_equal(assembler), if_notequal(assembler);
2111 2099
2112 // Shared entry for floating point comparison. 2100 // Shared entry for floating point comparison.
2113 Label do_fcmp(assembler); 2101 Label do_fcmp(assembler);
2114 Variable var_fcmp_lhs(assembler, MachineRepresentation::kFloat64), 2102 Variable var_fcmp_lhs(assembler, MachineRepresentation::kFloat64),
2115 var_fcmp_rhs(assembler, MachineRepresentation::kFloat64); 2103 var_fcmp_rhs(assembler, MachineRepresentation::kFloat64);
2116 2104
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after
2617 assembler->BranchIfFloat64Equal(lhs, rhs, &if_equal, &if_notequal); 2605 assembler->BranchIfFloat64Equal(lhs, rhs, &if_equal, &if_notequal);
2618 } 2606 }
2619 2607
2620 assembler->Bind(&if_equal); 2608 assembler->Bind(&if_equal);
2621 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); 2609 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult));
2622 2610
2623 assembler->Bind(&if_notequal); 2611 assembler->Bind(&if_notequal);
2624 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); 2612 assembler->Return(assembler->BooleanConstant(mode == kNegateResult));
2625 } 2613 }
2626 2614
2627 void GenerateStrictEqual(compiler::CodeStubAssembler* assembler, 2615 void GenerateStrictEqual(CodeStubAssembler* assembler, ResultMode mode) {
2628 ResultMode mode) {
2629 // Here's pseudo-code for the algorithm below in case of kDontNegateResult 2616 // Here's pseudo-code for the algorithm below in case of kDontNegateResult
2630 // mode; for kNegateResult mode we properly negate the result. 2617 // mode; for kNegateResult mode we properly negate the result.
2631 // 2618 //
2632 // if (lhs == rhs) { 2619 // if (lhs == rhs) {
2633 // if (lhs->IsHeapNumber()) return HeapNumber::cast(lhs)->value() != NaN; 2620 // if (lhs->IsHeapNumber()) return HeapNumber::cast(lhs)->value() != NaN;
2634 // return true; 2621 // return true;
2635 // } 2622 // }
2636 // if (!lhs->IsSmi()) { 2623 // if (!lhs->IsSmi()) {
2637 // if (lhs->IsHeapNumber()) { 2624 // if (lhs->IsHeapNumber()) {
2638 // if (rhs->IsSmi()) { 2625 // if (rhs->IsSmi()) {
(...skipping 28 matching lines...) Expand all
2667 // return false; 2654 // return false;
2668 // } else { 2655 // } else {
2669 // if (rhs->IsHeapNumber()) { 2656 // if (rhs->IsHeapNumber()) {
2670 // return Smi::cast(lhs)->value() == HeapNumber::cast(rhs)->value(); 2657 // return Smi::cast(lhs)->value() == HeapNumber::cast(rhs)->value();
2671 // } else { 2658 // } else {
2672 // return false; 2659 // return false;
2673 // } 2660 // }
2674 // } 2661 // }
2675 // } 2662 // }
2676 2663
2677 typedef compiler::CodeStubAssembler::Label Label; 2664 typedef CodeStubAssembler::Label Label;
2678 typedef compiler::Node Node; 2665 typedef compiler::Node Node;
2679 2666
2680 Node* lhs = assembler->Parameter(0); 2667 Node* lhs = assembler->Parameter(0);
2681 Node* rhs = assembler->Parameter(1); 2668 Node* rhs = assembler->Parameter(1);
2682 Node* context = assembler->Parameter(2); 2669 Node* context = assembler->Parameter(2);
2683 2670
2684 Label if_equal(assembler), if_notequal(assembler); 2671 Label if_equal(assembler), if_notequal(assembler);
2685 2672
2686 // Check if {lhs} and {rhs} refer to the same object. 2673 // Check if {lhs} and {rhs} refer to the same object.
2687 Label if_same(assembler), if_notsame(assembler); 2674 Label if_same(assembler), if_notsame(assembler);
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
2874 } 2861 }
2875 } 2862 }
2876 2863
2877 assembler->Bind(&if_equal); 2864 assembler->Bind(&if_equal);
2878 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); 2865 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult));
2879 2866
2880 assembler->Bind(&if_notequal); 2867 assembler->Bind(&if_notequal);
2881 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); 2868 assembler->Return(assembler->BooleanConstant(mode == kNegateResult));
2882 } 2869 }
2883 2870
2884 void GenerateStringRelationalComparison(compiler::CodeStubAssembler* assembler, 2871 void GenerateStringRelationalComparison(CodeStubAssembler* assembler,
2885 RelationalComparisonMode mode) { 2872 RelationalComparisonMode mode) {
2886 typedef compiler::CodeStubAssembler::Label Label; 2873 typedef CodeStubAssembler::Label Label;
2887 typedef compiler::Node Node; 2874 typedef compiler::Node Node;
2888 typedef compiler::CodeStubAssembler::Variable Variable; 2875 typedef CodeStubAssembler::Variable Variable;
2889 2876
2890 Node* lhs = assembler->Parameter(0); 2877 Node* lhs = assembler->Parameter(0);
2891 Node* rhs = assembler->Parameter(1); 2878 Node* rhs = assembler->Parameter(1);
2892 Node* context = assembler->Parameter(2); 2879 Node* context = assembler->Parameter(2);
2893 2880
2894 Label if_less(assembler), if_equal(assembler), if_greater(assembler); 2881 Label if_less(assembler), if_equal(assembler), if_greater(assembler);
2895 2882
2896 // Fast check to see if {lhs} and {rhs} refer to the same String object. 2883 // Fast check to see if {lhs} and {rhs} refer to the same String object.
2897 Label if_same(assembler), if_notsame(assembler); 2884 Label if_same(assembler), if_notsame(assembler);
2898 assembler->Branch(assembler->WordEqual(lhs, rhs), &if_same, &if_notsame); 2885 assembler->Branch(assembler->WordEqual(lhs, rhs), &if_same, &if_notsame);
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
3057 assembler->Return(assembler->BooleanConstant(false)); 3044 assembler->Return(assembler->BooleanConstant(false));
3058 break; 3045 break;
3059 3046
3060 case kGreaterThan: 3047 case kGreaterThan:
3061 case kGreaterThanOrEqual: 3048 case kGreaterThanOrEqual:
3062 assembler->Return(assembler->BooleanConstant(true)); 3049 assembler->Return(assembler->BooleanConstant(true));
3063 break; 3050 break;
3064 } 3051 }
3065 } 3052 }
3066 3053
3067 void GenerateStringEqual(compiler::CodeStubAssembler* assembler, 3054 void GenerateStringEqual(CodeStubAssembler* assembler, ResultMode mode) {
3068 ResultMode mode) {
3069 // Here's pseudo-code for the algorithm below in case of kDontNegateResult 3055 // Here's pseudo-code for the algorithm below in case of kDontNegateResult
3070 // mode; for kNegateResult mode we properly negate the result. 3056 // mode; for kNegateResult mode we properly negate the result.
3071 // 3057 //
3072 // if (lhs == rhs) return true; 3058 // if (lhs == rhs) return true;
3073 // if (lhs->length() != rhs->length()) return false; 3059 // if (lhs->length() != rhs->length()) return false;
3074 // if (lhs->IsInternalizedString() && rhs->IsInternalizedString()) { 3060 // if (lhs->IsInternalizedString() && rhs->IsInternalizedString()) {
3075 // return false; 3061 // return false;
3076 // } 3062 // }
3077 // if (lhs->IsSeqOneByteString() && rhs->IsSeqOneByteString()) { 3063 // if (lhs->IsSeqOneByteString() && rhs->IsSeqOneByteString()) {
3078 // for (i = 0; i != lhs->length(); ++i) { 3064 // for (i = 0; i != lhs->length(); ++i) {
3079 // if (lhs[i] != rhs[i]) return false; 3065 // if (lhs[i] != rhs[i]) return false;
3080 // } 3066 // }
3081 // return true; 3067 // return true;
3082 // } 3068 // }
3083 // return %StringEqual(lhs, rhs); 3069 // return %StringEqual(lhs, rhs);
3084 3070
3085 typedef compiler::CodeStubAssembler::Label Label; 3071 typedef CodeStubAssembler::Label Label;
3086 typedef compiler::Node Node; 3072 typedef compiler::Node Node;
3087 typedef compiler::CodeStubAssembler::Variable Variable; 3073 typedef CodeStubAssembler::Variable Variable;
3088 3074
3089 Node* lhs = assembler->Parameter(0); 3075 Node* lhs = assembler->Parameter(0);
3090 Node* rhs = assembler->Parameter(1); 3076 Node* rhs = assembler->Parameter(1);
3091 Node* context = assembler->Parameter(2); 3077 Node* context = assembler->Parameter(2);
3092 3078
3093 Label if_equal(assembler), if_notequal(assembler); 3079 Label if_equal(assembler), if_notequal(assembler);
3094 3080
3095 // Fast check to see if {lhs} and {rhs} refer to the same String object. 3081 // Fast check to see if {lhs} and {rhs} refer to the same String object.
3096 Label if_same(assembler), if_notsame(assembler); 3082 Label if_same(assembler), if_notsame(assembler);
3097 assembler->Branch(assembler->WordEqual(lhs, rhs), &if_same, &if_notsame); 3083 assembler->Branch(assembler->WordEqual(lhs, rhs), &if_same, &if_notsame);
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
3236 3222
3237 assembler->Bind(&if_equal); 3223 assembler->Bind(&if_equal);
3238 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult)); 3224 assembler->Return(assembler->BooleanConstant(mode == kDontNegateResult));
3239 3225
3240 assembler->Bind(&if_notequal); 3226 assembler->Bind(&if_notequal);
3241 assembler->Return(assembler->BooleanConstant(mode == kNegateResult)); 3227 assembler->Return(assembler->BooleanConstant(mode == kNegateResult));
3242 } 3228 }
3243 3229
3244 } // namespace 3230 } // namespace
3245 3231
3246 void LessThanStub::GenerateAssembly( 3232 void LessThanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3247 compiler::CodeStubAssembler* assembler) const {
3248 GenerateAbstractRelationalComparison(assembler, kLessThan); 3233 GenerateAbstractRelationalComparison(assembler, kLessThan);
3249 } 3234 }
3250 3235
3251 void LessThanOrEqualStub::GenerateAssembly( 3236 void LessThanOrEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3252 compiler::CodeStubAssembler* assembler) const {
3253 GenerateAbstractRelationalComparison(assembler, kLessThanOrEqual); 3237 GenerateAbstractRelationalComparison(assembler, kLessThanOrEqual);
3254 } 3238 }
3255 3239
3256 void GreaterThanStub::GenerateAssembly( 3240 void GreaterThanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3257 compiler::CodeStubAssembler* assembler) const {
3258 GenerateAbstractRelationalComparison(assembler, kGreaterThan); 3241 GenerateAbstractRelationalComparison(assembler, kGreaterThan);
3259 } 3242 }
3260 3243
3261 void GreaterThanOrEqualStub::GenerateAssembly( 3244 void GreaterThanOrEqualStub::GenerateAssembly(
3262 compiler::CodeStubAssembler* assembler) const { 3245 CodeStubAssembler* assembler) const {
3263 GenerateAbstractRelationalComparison(assembler, kGreaterThanOrEqual); 3246 GenerateAbstractRelationalComparison(assembler, kGreaterThanOrEqual);
3264 } 3247 }
3265 3248
3266 void EqualStub::GenerateAssembly(compiler::CodeStubAssembler* assembler) const { 3249 void EqualStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3267 GenerateEqual(assembler, kDontNegateResult); 3250 GenerateEqual(assembler, kDontNegateResult);
3268 } 3251 }
3269 3252
3270 void NotEqualStub::GenerateAssembly( 3253 void NotEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3271 compiler::CodeStubAssembler* assembler) const {
3272 GenerateEqual(assembler, kNegateResult); 3254 GenerateEqual(assembler, kNegateResult);
3273 } 3255 }
3274 3256
3275 void StrictEqualStub::GenerateAssembly( 3257 void StrictEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3276 compiler::CodeStubAssembler* assembler) const {
3277 GenerateStrictEqual(assembler, kDontNegateResult); 3258 GenerateStrictEqual(assembler, kDontNegateResult);
3278 } 3259 }
3279 3260
3280 void StrictNotEqualStub::GenerateAssembly( 3261 void StrictNotEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3281 compiler::CodeStubAssembler* assembler) const {
3282 GenerateStrictEqual(assembler, kNegateResult); 3262 GenerateStrictEqual(assembler, kNegateResult);
3283 } 3263 }
3284 3264
3285 void StringEqualStub::GenerateAssembly( 3265 void StringEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3286 compiler::CodeStubAssembler* assembler) const {
3287 GenerateStringEqual(assembler, kDontNegateResult); 3266 GenerateStringEqual(assembler, kDontNegateResult);
3288 } 3267 }
3289 3268
3290 void StringNotEqualStub::GenerateAssembly( 3269 void StringNotEqualStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3291 compiler::CodeStubAssembler* assembler) const {
3292 GenerateStringEqual(assembler, kNegateResult); 3270 GenerateStringEqual(assembler, kNegateResult);
3293 } 3271 }
3294 3272
3295 void StringLessThanStub::GenerateAssembly( 3273 void StringLessThanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3296 compiler::CodeStubAssembler* assembler) const {
3297 GenerateStringRelationalComparison(assembler, kLessThan); 3274 GenerateStringRelationalComparison(assembler, kLessThan);
3298 } 3275 }
3299 3276
3300 void StringLessThanOrEqualStub::GenerateAssembly( 3277 void StringLessThanOrEqualStub::GenerateAssembly(
3301 compiler::CodeStubAssembler* assembler) const { 3278 CodeStubAssembler* assembler) const {
3302 GenerateStringRelationalComparison(assembler, kLessThanOrEqual); 3279 GenerateStringRelationalComparison(assembler, kLessThanOrEqual);
3303 } 3280 }
3304 3281
3305 void StringGreaterThanStub::GenerateAssembly( 3282 void StringGreaterThanStub::GenerateAssembly(
3306 compiler::CodeStubAssembler* assembler) const { 3283 CodeStubAssembler* assembler) const {
3307 GenerateStringRelationalComparison(assembler, kGreaterThan); 3284 GenerateStringRelationalComparison(assembler, kGreaterThan);
3308 } 3285 }
3309 3286
3310 void StringGreaterThanOrEqualStub::GenerateAssembly( 3287 void StringGreaterThanOrEqualStub::GenerateAssembly(
3311 compiler::CodeStubAssembler* assembler) const { 3288 CodeStubAssembler* assembler) const {
3312 GenerateStringRelationalComparison(assembler, kGreaterThanOrEqual); 3289 GenerateStringRelationalComparison(assembler, kGreaterThanOrEqual);
3313 } 3290 }
3314 3291
3315 void ToLengthStub::GenerateAssembly( 3292 void ToLengthStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3316 compiler::CodeStubAssembler* assembler) const { 3293 typedef CodeStubAssembler::Label Label;
3317 typedef compiler::CodeStubAssembler::Label Label;
3318 typedef compiler::Node Node; 3294 typedef compiler::Node Node;
3319 typedef compiler::CodeStubAssembler::Variable Variable; 3295 typedef CodeStubAssembler::Variable Variable;
3320 3296
3321 Node* context = assembler->Parameter(1); 3297 Node* context = assembler->Parameter(1);
3322 3298
3323 // We might need to loop once for ToNumber conversion. 3299 // We might need to loop once for ToNumber conversion.
3324 Variable var_len(assembler, MachineRepresentation::kTagged); 3300 Variable var_len(assembler, MachineRepresentation::kTagged);
3325 Label loop(assembler, &var_len); 3301 Label loop(assembler, &var_len);
3326 var_len.Bind(assembler->Parameter(0)); 3302 var_len.Bind(assembler->Parameter(0));
3327 assembler->Goto(&loop); 3303 assembler->Goto(&loop);
3328 assembler->Bind(&loop); 3304 assembler->Bind(&loop);
3329 { 3305 {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3382 assembler->Return(var_len.value()); 3358 assembler->Return(var_len.value());
3383 3359
3384 assembler->Bind(&return_two53minus1); 3360 assembler->Bind(&return_two53minus1);
3385 assembler->Return(assembler->NumberConstant(kMaxSafeInteger)); 3361 assembler->Return(assembler->NumberConstant(kMaxSafeInteger));
3386 3362
3387 assembler->Bind(&return_zero); 3363 assembler->Bind(&return_zero);
3388 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); 3364 assembler->Return(assembler->SmiConstant(Smi::FromInt(0)));
3389 } 3365 }
3390 } 3366 }
3391 3367
3392 void ToBooleanStub::GenerateAssembly( 3368 void ToBooleanStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3393 compiler::CodeStubAssembler* assembler) const {
3394 typedef compiler::Node Node; 3369 typedef compiler::Node Node;
3395 typedef compiler::CodeStubAssembler::Label Label; 3370 typedef CodeStubAssembler::Label Label;
3396 3371
3397 Node* value = assembler->Parameter(0); 3372 Node* value = assembler->Parameter(0);
3398 Label if_valueissmi(assembler), if_valueisnotsmi(assembler); 3373 Label if_valueissmi(assembler), if_valueisnotsmi(assembler);
3399 3374
3400 // Check if {value} is a Smi or a HeapObject. 3375 // Check if {value} is a Smi or a HeapObject.
3401 assembler->Branch(assembler->WordIsSmi(value), &if_valueissmi, 3376 assembler->Branch(assembler->WordIsSmi(value), &if_valueissmi,
3402 &if_valueisnotsmi); 3377 &if_valueisnotsmi);
3403 3378
3404 assembler->Bind(&if_valueissmi); 3379 assembler->Bind(&if_valueissmi);
3405 { 3380 {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
3521 3496
3522 assembler->Bind(&if_valueisundetectable); 3497 assembler->Bind(&if_valueisundetectable);
3523 assembler->Return(assembler->BooleanConstant(false)); 3498 assembler->Return(assembler->BooleanConstant(false));
3524 3499
3525 assembler->Bind(&if_valueisnotundetectable); 3500 assembler->Bind(&if_valueisnotundetectable);
3526 assembler->Return(assembler->BooleanConstant(true)); 3501 assembler->Return(assembler->BooleanConstant(true));
3527 } 3502 }
3528 } 3503 }
3529 } 3504 }
3530 3505
3531 void ToIntegerStub::GenerateAssembly( 3506 void ToIntegerStub::GenerateAssembly(CodeStubAssembler* assembler) const {
3532 compiler::CodeStubAssembler* assembler) const { 3507 typedef CodeStubAssembler::Label Label;
3533 typedef compiler::CodeStubAssembler::Label Label;
3534 typedef compiler::Node Node; 3508 typedef compiler::Node Node;
3535 typedef compiler::CodeStubAssembler::Variable Variable; 3509 typedef CodeStubAssembler::Variable Variable;
3536 3510
3537 Node* context = assembler->Parameter(1); 3511 Node* context = assembler->Parameter(1);
3538 3512
3539 // We might need to loop once for ToNumber conversion. 3513 // We might need to loop once for ToNumber conversion.
3540 Variable var_arg(assembler, MachineRepresentation::kTagged); 3514 Variable var_arg(assembler, MachineRepresentation::kTagged);
3541 Label loop(assembler, &var_arg); 3515 Label loop(assembler, &var_arg);
3542 var_arg.Bind(assembler->Parameter(0)); 3516 var_arg.Bind(assembler->Parameter(0));
3543 assembler->Goto(&loop); 3517 assembler->Goto(&loop);
3544 assembler->Bind(&loop); 3518 assembler->Bind(&loop);
3545 { 3519 {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3584 3558
3585 assembler->Bind(&return_arg); 3559 assembler->Bind(&return_arg);
3586 assembler->Return(var_arg.value()); 3560 assembler->Return(var_arg.value());
3587 3561
3588 assembler->Bind(&return_zero); 3562 assembler->Bind(&return_zero);
3589 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); 3563 assembler->Return(assembler->SmiConstant(Smi::FromInt(0)));
3590 } 3564 }
3591 } 3565 }
3592 3566
3593 void StoreInterceptorStub::GenerateAssembly( 3567 void StoreInterceptorStub::GenerateAssembly(
3594 compiler::CodeStubAssembler* assembler) const { 3568 CodeStubAssembler* assembler) const {
3595 typedef compiler::Node Node; 3569 typedef compiler::Node Node;
3596 Node* receiver = assembler->Parameter(0); 3570 Node* receiver = assembler->Parameter(0);
3597 Node* name = assembler->Parameter(1); 3571 Node* name = assembler->Parameter(1);
3598 Node* value = assembler->Parameter(2); 3572 Node* value = assembler->Parameter(2);
3599 Node* context = assembler->Parameter(3); 3573 Node* context = assembler->Parameter(3);
3600 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, 3574 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context,
3601 receiver, name, value); 3575 receiver, name, value);
3602 } 3576 }
3603 3577
3604 void LoadIndexedInterceptorStub::GenerateAssembly( 3578 void LoadIndexedInterceptorStub::GenerateAssembly(
3605 compiler::CodeStubAssembler* assembler) const { 3579 CodeStubAssembler* assembler) const {
3606 typedef compiler::Node Node; 3580 typedef compiler::Node Node;
3607 typedef compiler::CodeStubAssembler::Label Label; 3581 typedef CodeStubAssembler::Label Label;
3608 Node* receiver = assembler->Parameter(0); 3582 Node* receiver = assembler->Parameter(0);
3609 Node* key = assembler->Parameter(1); 3583 Node* key = assembler->Parameter(1);
3610 Node* slot = assembler->Parameter(2); 3584 Node* slot = assembler->Parameter(2);
3611 Node* vector = assembler->Parameter(3); 3585 Node* vector = assembler->Parameter(3);
3612 Node* context = assembler->Parameter(4); 3586 Node* context = assembler->Parameter(4);
3613 3587
3614 Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler); 3588 Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler);
3615 assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi, 3589 assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi,
3616 &if_keyisinvalid); 3590 &if_keyisinvalid);
3617 assembler->Bind(&if_keyispositivesmi); 3591 assembler->Bind(&if_keyispositivesmi);
3618 assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, 3592 assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context,
3619 receiver, key); 3593 receiver, key);
3620 3594
3621 assembler->Bind(&if_keyisinvalid); 3595 assembler->Bind(&if_keyisinvalid);
3622 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, 3596 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key,
3623 slot, vector); 3597 slot, vector);
3624 } 3598 }
3625 3599
3626 void FastCloneShallowObjectStub::GenerateAssembly( 3600 void FastCloneShallowObjectStub::GenerateAssembly(
3627 compiler::CodeStubAssembler* assembler) const { 3601 CodeStubAssembler* assembler) const {
3628 typedef compiler::CodeStubAssembler::Label Label; 3602 typedef CodeStubAssembler::Label Label;
3629 typedef compiler::Node Node; 3603 typedef compiler::Node Node;
3630 Label call_runtime(assembler); 3604 Label call_runtime(assembler);
3631 Node* closure = assembler->Parameter(0); 3605 Node* closure = assembler->Parameter(0);
3632 Node* literals_index = assembler->Parameter(1); 3606 Node* literals_index = assembler->Parameter(1);
3633 3607
3634 Node* undefined = assembler->UndefinedConstant(); 3608 Node* undefined = assembler->UndefinedConstant();
3635 Node* literals_array = 3609 Node* literals_array =
3636 assembler->LoadObjectField(closure, JSFunction::kLiteralsOffset); 3610 assembler->LoadObjectField(closure, JSFunction::kLiteralsOffset);
3637 Node* allocation_site = assembler->LoadFixedArrayElementSmiIndex( 3611 Node* allocation_site = assembler->LoadFixedArrayElementSmiIndex(
3638 literals_array, literals_index, 3612 literals_array, literals_index,
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after
4122 if (type->Is(Type::UntaggedPointer())) { 4096 if (type->Is(Type::UntaggedPointer())) {
4123 return Representation::External(); 4097 return Representation::External();
4124 } 4098 }
4125 4099
4126 DCHECK(!type->Is(Type::Untagged())); 4100 DCHECK(!type->Is(Type::Untagged()));
4127 return Representation::Tagged(); 4101 return Representation::Tagged();
4128 } 4102 }
4129 4103
4130 } // namespace internal 4104 } // namespace internal
4131 } // namespace v8 4105 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stubs.h ('k') | src/compiler/code-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698