| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "stub-cache.h" | 35 #include "stub-cache.h" |
| 36 | 36 |
| 37 namespace v8 { | 37 namespace v8 { |
| 38 namespace internal { | 38 namespace internal { |
| 39 | 39 |
| 40 // ---------------------------------------------------------------------------- | 40 // ---------------------------------------------------------------------------- |
| 41 // Static IC stub generators. | 41 // Static IC stub generators. |
| 42 // | 42 // |
| 43 | 43 |
| 44 #define __ ACCESS_MASM(masm) | 44 #define __ ACCESS_MASM(masm) |
| 45 | 45 #define __k __ |
| 46 #define __a __ |
| 46 | 47 |
| 47 static void GenerateGlobalInstanceTypeCheck(MacroAssembler* masm, | 48 static void GenerateGlobalInstanceTypeCheck(MacroAssembler* masm, |
| 48 Register type, | 49 Register type, |
| 49 Label* global_object) { | 50 Label* global_object) { |
| 50 // Register usage: | 51 // Register usage: |
| 51 // type: holds the receiver instance type on entry. | 52 // type: holds the receiver instance type on entry. |
| 52 __ cmpb(type, Immediate(JS_GLOBAL_OBJECT_TYPE)); | 53 __ cmpb(type, Immediate(JS_GLOBAL_OBJECT_TYPE)); |
| 53 __ j(equal, global_object); | 54 __ j(equal, global_object); |
| 54 __ cmpb(type, Immediate(JS_BUILTINS_OBJECT_TYPE)); | 55 __ cmpb(type, Immediate(JS_BUILTINS_OBJECT_TYPE)); |
| 55 __ j(equal, global_object); | 56 __ j(equal, global_object); |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 __ movq(rcx, FieldOperand(rdx, HeapObject::kMapOffset)); | 564 __ movq(rcx, FieldOperand(rdx, HeapObject::kMapOffset)); |
| 564 | 565 |
| 565 // Check that it has indexed interceptor and access checks | 566 // Check that it has indexed interceptor and access checks |
| 566 // are not enabled for this object. | 567 // are not enabled for this object. |
| 567 __ movb(rcx, FieldOperand(rcx, Map::kBitFieldOffset)); | 568 __ movb(rcx, FieldOperand(rcx, Map::kBitFieldOffset)); |
| 568 __ andb(rcx, Immediate(kSlowCaseBitFieldMask)); | 569 __ andb(rcx, Immediate(kSlowCaseBitFieldMask)); |
| 569 __ cmpb(rcx, Immediate(1 << Map::kHasIndexedInterceptor)); | 570 __ cmpb(rcx, Immediate(1 << Map::kHasIndexedInterceptor)); |
| 570 __ j(not_zero, &slow); | 571 __ j(not_zero, &slow); |
| 571 | 572 |
| 572 // Everything is fine, call runtime. | 573 // Everything is fine, call runtime. |
| 573 __ pop(rcx); | 574 __k pop(rcx); |
| 574 __ push(rdx); // receiver | 575 __ push(rdx); // receiver |
| 575 __ push(rax); // key | 576 __ push(rax); // key |
| 576 __ push(rcx); // return address | 577 __k push(rcx); // return address |
| 577 | 578 |
| 578 // Perform tail call to the entry. | 579 // Perform tail call to the entry. |
| 579 __ TailCallExternalReference( | 580 __ TailCallExternalReference( |
| 580 ExternalReference(IC_Utility(kKeyedLoadPropertyWithInterceptor), | 581 ExternalReference(IC_Utility(kKeyedLoadPropertyWithInterceptor), |
| 581 masm->isolate()), | 582 masm->isolate()), |
| 582 2, | 583 2, |
| 583 1); | 584 1); |
| 584 | 585 |
| 585 __ bind(&slow); | 586 __ bind(&slow); |
| 586 GenerateMiss(masm, MISS); | 587 GenerateMiss(masm, MISS); |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 // rsp[0] : return address | 899 // rsp[0] : return address |
| 899 // rsp[8] : argument argc | 900 // rsp[8] : argument argc |
| 900 // rsp[16] : argument argc - 1 | 901 // rsp[16] : argument argc - 1 |
| 901 // ... | 902 // ... |
| 902 // rsp[argc * 8] : argument 1 | 903 // rsp[argc * 8] : argument 1 |
| 903 // rsp[(argc + 1) * 8] : argument 0 = receiver | 904 // rsp[(argc + 1) * 8] : argument 0 = receiver |
| 904 // ----------------------------------- | 905 // ----------------------------------- |
| 905 Label miss; | 906 Label miss; |
| 906 | 907 |
| 907 // Get the receiver of the function from the stack. | 908 // Get the receiver of the function from the stack. |
| 908 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); | 909 __a movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
| 909 | 910 |
| 910 GenerateNameDictionaryReceiverCheck(masm, rdx, rax, rbx, &miss); | 911 GenerateNameDictionaryReceiverCheck(masm, rdx, rax, rbx, &miss); |
| 911 | 912 |
| 912 // rax: elements | 913 // rax: elements |
| 913 // Search the dictionary placing the result in rdi. | 914 // Search the dictionary placing the result in rdi. |
| 914 GenerateDictionaryLoad(masm, &miss, rax, rcx, rbx, rdi, rdi); | 915 GenerateDictionaryLoad(masm, &miss, rax, rcx, rbx, rdi, rdi); |
| 915 | 916 |
| 916 GenerateFunctionTailCall(masm, argc, &miss); | 917 GenerateFunctionTailCall(masm, argc, &miss); |
| 917 | 918 |
| 918 __ bind(&miss); | 919 __ bind(&miss); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 934 // ----------------------------------- | 935 // ----------------------------------- |
| 935 | 936 |
| 936 Counters* counters = masm->isolate()->counters(); | 937 Counters* counters = masm->isolate()->counters(); |
| 937 if (id == IC::kCallIC_Miss) { | 938 if (id == IC::kCallIC_Miss) { |
| 938 __ IncrementCounter(counters->call_miss(), 1); | 939 __ IncrementCounter(counters->call_miss(), 1); |
| 939 } else { | 940 } else { |
| 940 __ IncrementCounter(counters->keyed_call_miss(), 1); | 941 __ IncrementCounter(counters->keyed_call_miss(), 1); |
| 941 } | 942 } |
| 942 | 943 |
| 943 // Get the receiver of the function from the stack; 1 ~ return address. | 944 // Get the receiver of the function from the stack; 1 ~ return address. |
| 944 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); | 945 __a movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
| 945 | 946 |
| 946 // Enter an internal frame. | 947 // Enter an internal frame. |
| 947 { | 948 { |
| 948 FrameScope scope(masm, StackFrame::INTERNAL); | 949 FrameScope scope(masm, StackFrame::INTERNAL); |
| 949 | 950 |
| 950 // Push the receiver and the name of the function. | 951 // Push the receiver and the name of the function. |
| 951 __ push(rdx); | 952 __ push(rdx); |
| 952 __ push(rcx); | 953 __ push(rcx); |
| 953 | 954 |
| 954 // Call the entry. | 955 // Call the entry. |
| 955 CEntryStub stub(1); | 956 CEntryStub stub(1); |
| 956 __ Set(rax, 2); | 957 __ Set(rax, 2); |
| 957 __ LoadAddress(rbx, ExternalReference(IC_Utility(id), masm->isolate())); | 958 __ LoadAddress(rbx, ExternalReference(IC_Utility(id), masm->isolate())); |
| 958 __ CallStub(&stub); | 959 __ CallStub(&stub); |
| 959 | 960 |
| 960 // Move result to rdi and exit the internal frame. | 961 // Move result to rdi and exit the internal frame. |
| 961 __ movq(rdi, rax); | 962 __ movq(rdi, rax); |
| 962 } | 963 } |
| 963 | 964 |
| 964 // Check if the receiver is a global object of some sort. | 965 // Check if the receiver is a global object of some sort. |
| 965 // This can happen only for regular CallIC but not KeyedCallIC. | 966 // This can happen only for regular CallIC but not KeyedCallIC. |
| 966 if (id == IC::kCallIC_Miss) { | 967 if (id == IC::kCallIC_Miss) { |
| 967 Label invoke, global; | 968 Label invoke, global; |
| 968 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); // receiver | 969 // receiver |
| 970 __a movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
| 969 __ JumpIfSmi(rdx, &invoke); | 971 __ JumpIfSmi(rdx, &invoke); |
| 970 __ CmpObjectType(rdx, JS_GLOBAL_OBJECT_TYPE, rcx); | 972 __ CmpObjectType(rdx, JS_GLOBAL_OBJECT_TYPE, rcx); |
| 971 __ j(equal, &global); | 973 __ j(equal, &global); |
| 972 __ CmpInstanceType(rcx, JS_BUILTINS_OBJECT_TYPE); | 974 __ CmpInstanceType(rcx, JS_BUILTINS_OBJECT_TYPE); |
| 973 __ j(not_equal, &invoke); | 975 __ j(not_equal, &invoke); |
| 974 | 976 |
| 975 // Patch the receiver on the stack. | 977 // Patch the receiver on the stack. |
| 976 __ bind(&global); | 978 __ bind(&global); |
| 977 __ movq(rdx, FieldOperand(rdx, GlobalObject::kGlobalReceiverOffset)); | 979 __ movq(rdx, FieldOperand(rdx, GlobalObject::kGlobalReceiverOffset)); |
| 978 __ movq(Operand(rsp, (argc + 1) * kPointerSize), rdx); | 980 __a movq(Operand(rsp, (argc + 1) * kPointerSize), rdx); |
| 979 __ bind(&invoke); | 981 __ bind(&invoke); |
| 980 } | 982 } |
| 981 | 983 |
| 982 // Invoke the function. | 984 // Invoke the function. |
| 983 CallKind call_kind = CallICBase::Contextual::decode(extra_state) | 985 CallKind call_kind = CallICBase::Contextual::decode(extra_state) |
| 984 ? CALL_AS_FUNCTION | 986 ? CALL_AS_FUNCTION |
| 985 : CALL_AS_METHOD; | 987 : CALL_AS_METHOD; |
| 986 ParameterCount actual(argc); | 988 ParameterCount actual(argc); |
| 987 __ InvokeFunction(rdi, | 989 __ InvokeFunction(rdi, |
| 988 actual, | 990 actual, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 999 // rcx : function name | 1001 // rcx : function name |
| 1000 // rsp[0] : return address | 1002 // rsp[0] : return address |
| 1001 // rsp[8] : argument argc | 1003 // rsp[8] : argument argc |
| 1002 // rsp[16] : argument argc - 1 | 1004 // rsp[16] : argument argc - 1 |
| 1003 // ... | 1005 // ... |
| 1004 // rsp[argc * 8] : argument 1 | 1006 // rsp[argc * 8] : argument 1 |
| 1005 // rsp[(argc + 1) * 8] : argument 0 = receiver | 1007 // rsp[(argc + 1) * 8] : argument 0 = receiver |
| 1006 // ----------------------------------- | 1008 // ----------------------------------- |
| 1007 | 1009 |
| 1008 // Get the receiver of the function from the stack; 1 ~ return address. | 1010 // Get the receiver of the function from the stack; 1 ~ return address. |
| 1009 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); | 1011 __a movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
| 1010 GenerateMonomorphicCacheProbe(masm, argc, Code::CALL_IC, extra_ic_state); | 1012 GenerateMonomorphicCacheProbe(masm, argc, Code::CALL_IC, extra_ic_state); |
| 1011 GenerateMiss(masm, argc, extra_ic_state); | 1013 GenerateMiss(masm, argc, extra_ic_state); |
| 1012 } | 1014 } |
| 1013 | 1015 |
| 1014 | 1016 |
| 1015 void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) { | 1017 void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) { |
| 1016 // ----------- S t a t e ------------- | 1018 // ----------- S t a t e ------------- |
| 1017 // rcx : function name | 1019 // rcx : function name |
| 1018 // rsp[0] : return address | 1020 // rsp[0] : return address |
| 1019 // rsp[8] : argument argc | 1021 // rsp[8] : argument argc |
| 1020 // rsp[16] : argument argc - 1 | 1022 // rsp[16] : argument argc - 1 |
| 1021 // ... | 1023 // ... |
| 1022 // rsp[argc * 8] : argument 1 | 1024 // rsp[argc * 8] : argument 1 |
| 1023 // rsp[(argc + 1) * 8] : argument 0 = receiver | 1025 // rsp[(argc + 1) * 8] : argument 0 = receiver |
| 1024 // ----------------------------------- | 1026 // ----------------------------------- |
| 1025 | 1027 |
| 1026 // Get the receiver of the function from the stack; 1 ~ return address. | 1028 // Get the receiver of the function from the stack; 1 ~ return address. |
| 1027 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); | 1029 __a movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
| 1028 | 1030 |
| 1029 Label do_call, slow_call, slow_load; | 1031 Label do_call, slow_call, slow_load; |
| 1030 Label check_number_dictionary, check_name, lookup_monomorphic_cache; | 1032 Label check_number_dictionary, check_name, lookup_monomorphic_cache; |
| 1031 Label index_smi, index_name; | 1033 Label index_smi, index_name; |
| 1032 | 1034 |
| 1033 // Check that the key is a smi. | 1035 // Check that the key is a smi. |
| 1034 __ JumpIfNotSmi(rcx, &check_name); | 1036 __ JumpIfNotSmi(rcx, &check_name); |
| 1035 | 1037 |
| 1036 __ bind(&index_smi); | 1038 __ bind(&index_smi); |
| 1037 // Now the key is known to be a smi. This place is also jumped to from below | 1039 // Now the key is known to be a smi. This place is also jumped to from below |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1295 // ----------- S t a t e ------------- | 1297 // ----------- S t a t e ------------- |
| 1296 // rcx : function name | 1298 // rcx : function name |
| 1297 // rsp[0] : return address | 1299 // rsp[0] : return address |
| 1298 // rsp[8] : argument argc | 1300 // rsp[8] : argument argc |
| 1299 // rsp[16] : argument argc - 1 | 1301 // rsp[16] : argument argc - 1 |
| 1300 // ... | 1302 // ... |
| 1301 // rsp[argc * 8] : argument 1 | 1303 // rsp[argc * 8] : argument 1 |
| 1302 // rsp[(argc + 1) * 8] : argument 0 = receiver | 1304 // rsp[(argc + 1) * 8] : argument 0 = receiver |
| 1303 // ----------------------------------- | 1305 // ----------------------------------- |
| 1304 Label slow, notin; | 1306 Label slow, notin; |
| 1305 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); | 1307 __a movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
| 1306 Operand mapped_location = GenerateMappedArgumentsLookup( | 1308 Operand mapped_location = GenerateMappedArgumentsLookup( |
| 1307 masm, rdx, rcx, rbx, rax, r8, ¬in, &slow); | 1309 masm, rdx, rcx, rbx, rax, r8, ¬in, &slow); |
| 1308 __ movq(rdi, mapped_location); | 1310 __ movq(rdi, mapped_location); |
| 1309 GenerateFunctionTailCall(masm, argc, &slow); | 1311 GenerateFunctionTailCall(masm, argc, &slow); |
| 1310 __ bind(¬in); | 1312 __ bind(¬in); |
| 1311 // The unmapped lookup expects that the parameter map is in rbx. | 1313 // The unmapped lookup expects that the parameter map is in rbx. |
| 1312 Operand unmapped_location = | 1314 Operand unmapped_location = |
| 1313 GenerateUnmappedArgumentsLookup(masm, rcx, rbx, rax, &slow); | 1315 GenerateUnmappedArgumentsLookup(masm, rcx, rbx, rax, &slow); |
| 1314 __ CompareRoot(unmapped_location, Heap::kTheHoleValueRootIndex); | 1316 __ CompareRoot(unmapped_location, Heap::kTheHoleValueRootIndex); |
| 1315 __ j(equal, &slow); | 1317 __ j(equal, &slow); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1362 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 1364 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
| 1363 // ----------- S t a t e ------------- | 1365 // ----------- S t a t e ------------- |
| 1364 // -- rax : receiver | 1366 // -- rax : receiver |
| 1365 // -- rcx : name | 1367 // -- rcx : name |
| 1366 // -- rsp[0] : return address | 1368 // -- rsp[0] : return address |
| 1367 // ----------------------------------- | 1369 // ----------------------------------- |
| 1368 | 1370 |
| 1369 Counters* counters = masm->isolate()->counters(); | 1371 Counters* counters = masm->isolate()->counters(); |
| 1370 __ IncrementCounter(counters->load_miss(), 1); | 1372 __ IncrementCounter(counters->load_miss(), 1); |
| 1371 | 1373 |
| 1372 __ pop(rbx); | 1374 __k pop(rbx); |
| 1373 __ push(rax); // receiver | 1375 __ push(rax); // receiver |
| 1374 __ push(rcx); // name | 1376 __ push(rcx); // name |
| 1375 __ push(rbx); // return address | 1377 __k push(rbx); // return address |
| 1376 | 1378 |
| 1377 // Perform tail call to the entry. | 1379 // Perform tail call to the entry. |
| 1378 ExternalReference ref = | 1380 ExternalReference ref = |
| 1379 ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate()); | 1381 ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate()); |
| 1380 __ TailCallExternalReference(ref, 2, 1); | 1382 __ TailCallExternalReference(ref, 2, 1); |
| 1381 } | 1383 } |
| 1382 | 1384 |
| 1383 | 1385 |
| 1384 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 1386 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| 1385 // ----------- S t a t e ------------- | 1387 // ----------- S t a t e ------------- |
| 1386 // -- rax : receiver | 1388 // -- rax : receiver |
| 1387 // -- rcx : name | 1389 // -- rcx : name |
| 1388 // -- rsp[0] : return address | 1390 // -- rsp[0] : return address |
| 1389 // ----------------------------------- | 1391 // ----------------------------------- |
| 1390 | 1392 |
| 1391 __ pop(rbx); | 1393 __k pop(rbx); |
| 1392 __ push(rax); // receiver | 1394 __ push(rax); // receiver |
| 1393 __ push(rcx); // name | 1395 __ push(rcx); // name |
| 1394 __ push(rbx); // return address | 1396 __k push(rbx); // return address |
| 1395 | 1397 |
| 1396 // Perform tail call to the entry. | 1398 // Perform tail call to the entry. |
| 1397 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); | 1399 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); |
| 1398 } | 1400 } |
| 1399 | 1401 |
| 1400 | 1402 |
| 1401 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { | 1403 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { |
| 1402 // ----------- S t a t e ------------- | 1404 // ----------- S t a t e ------------- |
| 1403 // -- rax : key | 1405 // -- rax : key |
| 1404 // -- rdx : receiver | 1406 // -- rdx : receiver |
| 1405 // -- rsp[0] : return address | 1407 // -- rsp[0] : return address |
| 1406 // ----------------------------------- | 1408 // ----------------------------------- |
| 1407 | 1409 |
| 1408 Counters* counters = masm->isolate()->counters(); | 1410 Counters* counters = masm->isolate()->counters(); |
| 1409 __ IncrementCounter(counters->keyed_load_miss(), 1); | 1411 __ IncrementCounter(counters->keyed_load_miss(), 1); |
| 1410 | 1412 |
| 1411 __ pop(rbx); | 1413 __k pop(rbx); |
| 1412 __ push(rdx); // receiver | 1414 __ push(rdx); // receiver |
| 1413 __ push(rax); // name | 1415 __ push(rax); // name |
| 1414 __ push(rbx); // return address | 1416 __k push(rbx); // return address |
| 1415 | 1417 |
| 1416 // Perform tail call to the entry. | 1418 // Perform tail call to the entry. |
| 1417 ExternalReference ref = miss_mode == MISS_FORCE_GENERIC | 1419 ExternalReference ref = miss_mode == MISS_FORCE_GENERIC |
| 1418 ? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), | 1420 ? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), |
| 1419 masm->isolate()) | 1421 masm->isolate()) |
| 1420 : ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); | 1422 : ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); |
| 1421 __ TailCallExternalReference(ref, 2, 1); | 1423 __ TailCallExternalReference(ref, 2, 1); |
| 1422 } | 1424 } |
| 1423 | 1425 |
| 1424 | 1426 |
| 1425 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 1427 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| 1426 // ----------- S t a t e ------------- | 1428 // ----------- S t a t e ------------- |
| 1427 // -- rax : key | 1429 // -- rax : key |
| 1428 // -- rdx : receiver | 1430 // -- rdx : receiver |
| 1429 // -- rsp[0] : return address | 1431 // -- rsp[0] : return address |
| 1430 // ----------------------------------- | 1432 // ----------------------------------- |
| 1431 | 1433 |
| 1432 __ pop(rbx); | 1434 __k pop(rbx); |
| 1433 __ push(rdx); // receiver | 1435 __ push(rdx); // receiver |
| 1434 __ push(rax); // name | 1436 __ push(rax); // name |
| 1435 __ push(rbx); // return address | 1437 __k push(rbx); // return address |
| 1436 | 1438 |
| 1437 // Perform tail call to the entry. | 1439 // Perform tail call to the entry. |
| 1438 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); | 1440 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |
| 1439 } | 1441 } |
| 1440 | 1442 |
| 1441 | 1443 |
| 1442 void StoreIC::GenerateMegamorphic(MacroAssembler* masm, | 1444 void StoreIC::GenerateMegamorphic(MacroAssembler* masm, |
| 1443 StrictModeFlag strict_mode) { | 1445 StrictModeFlag strict_mode) { |
| 1444 // ----------- S t a t e ------------- | 1446 // ----------- S t a t e ------------- |
| 1445 // -- rax : value | 1447 // -- rax : value |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1460 | 1462 |
| 1461 | 1463 |
| 1462 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 1464 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
| 1463 // ----------- S t a t e ------------- | 1465 // ----------- S t a t e ------------- |
| 1464 // -- rax : value | 1466 // -- rax : value |
| 1465 // -- rcx : name | 1467 // -- rcx : name |
| 1466 // -- rdx : receiver | 1468 // -- rdx : receiver |
| 1467 // -- rsp[0] : return address | 1469 // -- rsp[0] : return address |
| 1468 // ----------------------------------- | 1470 // ----------------------------------- |
| 1469 | 1471 |
| 1470 __ pop(rbx); | 1472 __k pop(rbx); |
| 1471 __ push(rdx); // receiver | 1473 __ push(rdx); // receiver |
| 1472 __ push(rcx); // name | 1474 __ push(rcx); // name |
| 1473 __ push(rax); // value | 1475 __ push(rax); // value |
| 1474 __ push(rbx); // return address | 1476 __k push(rbx); // return address |
| 1475 | 1477 |
| 1476 // Perform tail call to the entry. | 1478 // Perform tail call to the entry. |
| 1477 ExternalReference ref = | 1479 ExternalReference ref = |
| 1478 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); | 1480 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); |
| 1479 __ TailCallExternalReference(ref, 3, 1); | 1481 __ TailCallExternalReference(ref, 3, 1); |
| 1480 } | 1482 } |
| 1481 | 1483 |
| 1482 | 1484 |
| 1483 void StoreIC::GenerateNormal(MacroAssembler* masm) { | 1485 void StoreIC::GenerateNormal(MacroAssembler* masm) { |
| 1484 // ----------- S t a t e ------------- | 1486 // ----------- S t a t e ------------- |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1504 | 1506 |
| 1505 | 1507 |
| 1506 void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, | 1508 void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, |
| 1507 StrictModeFlag strict_mode) { | 1509 StrictModeFlag strict_mode) { |
| 1508 // ----------- S t a t e ------------- | 1510 // ----------- S t a t e ------------- |
| 1509 // -- rax : value | 1511 // -- rax : value |
| 1510 // -- rcx : name | 1512 // -- rcx : name |
| 1511 // -- rdx : receiver | 1513 // -- rdx : receiver |
| 1512 // -- rsp[0] : return address | 1514 // -- rsp[0] : return address |
| 1513 // ----------------------------------- | 1515 // ----------------------------------- |
| 1514 __ pop(rbx); | 1516 __k pop(rbx); |
| 1515 __ push(rdx); | 1517 __ push(rdx); |
| 1516 __ push(rcx); | 1518 __ push(rcx); |
| 1517 __ push(rax); | 1519 __ push(rax); |
| 1518 __ Push(Smi::FromInt(NONE)); // PropertyAttributes | 1520 __ Push(Smi::FromInt(NONE)); // PropertyAttributes |
| 1519 __ Push(Smi::FromInt(strict_mode)); | 1521 __ Push(Smi::FromInt(strict_mode)); |
| 1520 __ push(rbx); // return address | 1522 __k push(rbx); // return address |
| 1521 | 1523 |
| 1522 // Do tail-call to runtime routine. | 1524 // Do tail-call to runtime routine. |
| 1523 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); | 1525 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); |
| 1524 } | 1526 } |
| 1525 | 1527 |
| 1526 | 1528 |
| 1527 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, | 1529 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, |
| 1528 StrictModeFlag strict_mode) { | 1530 StrictModeFlag strict_mode) { |
| 1529 // ----------- S t a t e ------------- | 1531 // ----------- S t a t e ------------- |
| 1530 // -- rax : value | 1532 // -- rax : value |
| 1531 // -- rcx : key | 1533 // -- rcx : key |
| 1532 // -- rdx : receiver | 1534 // -- rdx : receiver |
| 1533 // -- rsp[0] : return address | 1535 // -- rsp[0] : return address |
| 1534 // ----------------------------------- | 1536 // ----------------------------------- |
| 1535 | 1537 |
| 1536 __ pop(rbx); | 1538 __k pop(rbx); |
| 1537 __ push(rdx); // receiver | 1539 __ push(rdx); // receiver |
| 1538 __ push(rcx); // key | 1540 __ push(rcx); // key |
| 1539 __ push(rax); // value | 1541 __ push(rax); // value |
| 1540 __ Push(Smi::FromInt(NONE)); // PropertyAttributes | 1542 __ Push(Smi::FromInt(NONE)); // PropertyAttributes |
| 1541 __ Push(Smi::FromInt(strict_mode)); // Strict mode. | 1543 __ Push(Smi::FromInt(strict_mode)); // Strict mode. |
| 1542 __ push(rbx); // return address | 1544 __k push(rbx); // return address |
| 1543 | 1545 |
| 1544 // Do tail-call to runtime routine. | 1546 // Do tail-call to runtime routine. |
| 1545 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); | 1547 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); |
| 1546 } | 1548 } |
| 1547 | 1549 |
| 1548 | 1550 |
| 1549 void StoreIC::GenerateSlow(MacroAssembler* masm) { | 1551 void StoreIC::GenerateSlow(MacroAssembler* masm) { |
| 1550 // ----------- S t a t e ------------- | 1552 // ----------- S t a t e ------------- |
| 1551 // -- rax : value | 1553 // -- rax : value |
| 1552 // -- rcx : key | 1554 // -- rcx : key |
| 1553 // -- rdx : receiver | 1555 // -- rdx : receiver |
| 1554 // -- rsp[0] : return address | 1556 // -- rsp[0] : return address |
| 1555 // ----------------------------------- | 1557 // ----------------------------------- |
| 1556 | 1558 |
| 1557 __ pop(rbx); | 1559 __k pop(rbx); |
| 1558 __ push(rdx); // receiver | 1560 __ push(rdx); // receiver |
| 1559 __ push(rcx); // key | 1561 __ push(rcx); // key |
| 1560 __ push(rax); // value | 1562 __ push(rax); // value |
| 1561 __ push(rbx); // return address | 1563 __k push(rbx); // return address |
| 1562 | 1564 |
| 1563 // Do tail-call to runtime routine. | 1565 // Do tail-call to runtime routine. |
| 1564 ExternalReference ref(IC_Utility(kStoreIC_Slow), masm->isolate()); | 1566 ExternalReference ref(IC_Utility(kStoreIC_Slow), masm->isolate()); |
| 1565 __ TailCallExternalReference(ref, 3, 1); | 1567 __ TailCallExternalReference(ref, 3, 1); |
| 1566 } | 1568 } |
| 1567 | 1569 |
| 1568 | 1570 |
| 1569 void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) { | 1571 void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) { |
| 1570 // ----------- S t a t e ------------- | 1572 // ----------- S t a t e ------------- |
| 1571 // -- rax : value | 1573 // -- rax : value |
| 1572 // -- rcx : key | 1574 // -- rcx : key |
| 1573 // -- rdx : receiver | 1575 // -- rdx : receiver |
| 1574 // -- rsp[0] : return address | 1576 // -- rsp[0] : return address |
| 1575 // ----------------------------------- | 1577 // ----------------------------------- |
| 1576 | 1578 |
| 1577 __ pop(rbx); | 1579 __k pop(rbx); |
| 1578 __ push(rdx); // receiver | 1580 __ push(rdx); // receiver |
| 1579 __ push(rcx); // key | 1581 __ push(rcx); // key |
| 1580 __ push(rax); // value | 1582 __ push(rax); // value |
| 1581 __ push(rbx); // return address | 1583 __k push(rbx); // return address |
| 1582 | 1584 |
| 1583 // Do tail-call to runtime routine. | 1585 // Do tail-call to runtime routine. |
| 1584 ExternalReference ref(IC_Utility(kKeyedStoreIC_Slow), masm->isolate()); | 1586 ExternalReference ref(IC_Utility(kKeyedStoreIC_Slow), masm->isolate()); |
| 1585 __ TailCallExternalReference(ref, 3, 1); | 1587 __ TailCallExternalReference(ref, 3, 1); |
| 1586 } | 1588 } |
| 1587 | 1589 |
| 1588 | 1590 |
| 1589 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { | 1591 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { |
| 1590 // ----------- S t a t e ------------- | 1592 // ----------- S t a t e ------------- |
| 1591 // -- rax : value | 1593 // -- rax : value |
| 1592 // -- rcx : key | 1594 // -- rcx : key |
| 1593 // -- rdx : receiver | 1595 // -- rdx : receiver |
| 1594 // -- rsp[0] : return address | 1596 // -- rsp[0] : return address |
| 1595 // ----------------------------------- | 1597 // ----------------------------------- |
| 1596 | 1598 |
| 1597 __ pop(rbx); | 1599 __k pop(rbx); |
| 1598 __ push(rdx); // receiver | 1600 __ push(rdx); // receiver |
| 1599 __ push(rcx); // key | 1601 __ push(rcx); // key |
| 1600 __ push(rax); // value | 1602 __ push(rax); // value |
| 1601 __ push(rbx); // return address | 1603 __k push(rbx); // return address |
| 1602 | 1604 |
| 1603 // Do tail-call to runtime routine. | 1605 // Do tail-call to runtime routine. |
| 1604 ExternalReference ref = miss_mode == MISS_FORCE_GENERIC | 1606 ExternalReference ref = miss_mode == MISS_FORCE_GENERIC |
| 1605 ? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric), | 1607 ? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric), |
| 1606 masm->isolate()) | 1608 masm->isolate()) |
| 1607 : ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); | 1609 : ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); |
| 1608 __ TailCallExternalReference(ref, 3, 1); | 1610 __ TailCallExternalReference(ref, 3, 1); |
| 1609 } | 1611 } |
| 1610 | 1612 |
| 1611 | 1613 |
| 1612 void KeyedStoreIC::GenerateTransitionElementsSmiToDouble(MacroAssembler* masm) { | 1614 void KeyedStoreIC::GenerateTransitionElementsSmiToDouble(MacroAssembler* masm) { |
| 1613 // ----------- S t a t e ------------- | 1615 // ----------- S t a t e ------------- |
| 1614 // -- rbx : target map | 1616 // -- rbx : target map |
| 1615 // -- rdx : receiver | 1617 // -- rdx : receiver |
| 1616 // -- rsp[0] : return address | 1618 // -- rsp[0] : return address |
| 1617 // ----------------------------------- | 1619 // ----------------------------------- |
| 1618 // Must return the modified receiver in eax. | 1620 // Must return the modified receiver in eax. |
| 1619 if (!FLAG_trace_elements_transitions) { | 1621 if (!FLAG_trace_elements_transitions) { |
| 1620 Label fail; | 1622 Label fail; |
| 1621 AllocationSiteMode mode = AllocationSiteInfo::GetMode(FAST_SMI_ELEMENTS, | 1623 AllocationSiteMode mode = AllocationSiteInfo::GetMode(FAST_SMI_ELEMENTS, |
| 1622 FAST_DOUBLE_ELEMENTS); | 1624 FAST_DOUBLE_ELEMENTS); |
| 1623 ElementsTransitionGenerator::GenerateSmiToDouble(masm, mode, &fail); | 1625 ElementsTransitionGenerator::GenerateSmiToDouble(masm, mode, &fail); |
| 1624 __ movq(rax, rdx); | 1626 __ movq(rax, rdx); |
| 1625 __ Ret(); | 1627 __ Ret(); |
| 1626 __ bind(&fail); | 1628 __ bind(&fail); |
| 1627 } | 1629 } |
| 1628 | 1630 |
| 1629 __ pop(rbx); | 1631 __k pop(rbx); |
| 1630 __ push(rdx); | 1632 __ push(rdx); |
| 1631 __ push(rbx); // return address | 1633 __k push(rbx); // return address |
| 1632 __ TailCallRuntime(Runtime::kTransitionElementsSmiToDouble, 1, 1); | 1634 __ TailCallRuntime(Runtime::kTransitionElementsSmiToDouble, 1, 1); |
| 1633 } | 1635 } |
| 1634 | 1636 |
| 1635 | 1637 |
| 1636 void KeyedStoreIC::GenerateTransitionElementsDoubleToObject( | 1638 void KeyedStoreIC::GenerateTransitionElementsDoubleToObject( |
| 1637 MacroAssembler* masm) { | 1639 MacroAssembler* masm) { |
| 1638 // ----------- S t a t e ------------- | 1640 // ----------- S t a t e ------------- |
| 1639 // -- rbx : target map | 1641 // -- rbx : target map |
| 1640 // -- rdx : receiver | 1642 // -- rdx : receiver |
| 1641 // -- rsp[0] : return address | 1643 // -- rsp[0] : return address |
| 1642 // ----------------------------------- | 1644 // ----------------------------------- |
| 1643 // Must return the modified receiver in eax. | 1645 // Must return the modified receiver in eax. |
| 1644 if (!FLAG_trace_elements_transitions) { | 1646 if (!FLAG_trace_elements_transitions) { |
| 1645 Label fail; | 1647 Label fail; |
| 1646 AllocationSiteMode mode = AllocationSiteInfo::GetMode(FAST_DOUBLE_ELEMENTS, | 1648 AllocationSiteMode mode = AllocationSiteInfo::GetMode(FAST_DOUBLE_ELEMENTS, |
| 1647 FAST_ELEMENTS); | 1649 FAST_ELEMENTS); |
| 1648 ElementsTransitionGenerator::GenerateDoubleToObject(masm, mode, &fail); | 1650 ElementsTransitionGenerator::GenerateDoubleToObject(masm, mode, &fail); |
| 1649 __ movq(rax, rdx); | 1651 __ movq(rax, rdx); |
| 1650 __ Ret(); | 1652 __ Ret(); |
| 1651 __ bind(&fail); | 1653 __ bind(&fail); |
| 1652 } | 1654 } |
| 1653 | 1655 |
| 1654 __ pop(rbx); | 1656 __k pop(rbx); |
| 1655 __ push(rdx); | 1657 __ push(rdx); |
| 1656 __ push(rbx); // return address | 1658 __k push(rbx); // return address |
| 1657 __ TailCallRuntime(Runtime::kTransitionElementsDoubleToObject, 1, 1); | 1659 __ TailCallRuntime(Runtime::kTransitionElementsDoubleToObject, 1, 1); |
| 1658 } | 1660 } |
| 1659 | 1661 |
| 1660 | 1662 |
| 1663 #undef __a |
| 1664 #undef __k |
| 1661 #undef __ | 1665 #undef __ |
| 1662 | 1666 |
| 1663 | 1667 |
| 1664 Condition CompareIC::ComputeCondition(Token::Value op) { | 1668 Condition CompareIC::ComputeCondition(Token::Value op) { |
| 1665 switch (op) { | 1669 switch (op) { |
| 1666 case Token::EQ_STRICT: | 1670 case Token::EQ_STRICT: |
| 1667 case Token::EQ: | 1671 case Token::EQ: |
| 1668 return equal; | 1672 return equal; |
| 1669 case Token::LT: | 1673 case Token::LT: |
| 1670 return less; | 1674 return less; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1725 Condition cc = (check == ENABLE_INLINED_SMI_CHECK) | 1729 Condition cc = (check == ENABLE_INLINED_SMI_CHECK) |
| 1726 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) | 1730 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) |
| 1727 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); | 1731 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); |
| 1728 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 1732 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
| 1729 } | 1733 } |
| 1730 | 1734 |
| 1731 | 1735 |
| 1732 } } // namespace v8::internal | 1736 } } // namespace v8::internal |
| 1733 | 1737 |
| 1734 #endif // V8_TARGET_ARCH_X64 | 1738 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |