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