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

Side by Side Diff: src/x64/ic-x64.cc

Issue 583008: Eliminate *IC::Generate() function on all platforms. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « src/ic.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 } 221 }
222 222
223 223
224 void KeyedStoreIC::RestoreInlinedVersion(Address address) { 224 void KeyedStoreIC::RestoreInlinedVersion(Address address) {
225 // Restore the fast-case elements map check so that the inlined 225 // Restore the fast-case elements map check so that the inlined
226 // version can be used again. 226 // version can be used again.
227 PatchInlinedStore(address, Heap::fixed_array_map()); 227 PatchInlinedStore(address, Heap::fixed_array_map());
228 } 228 }
229 229
230 230
231 void KeyedLoadIC::Generate(MacroAssembler* masm, 231 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
232 ExternalReference const& f) {
233 // ----------- S t a t e ------------- 232 // ----------- S t a t e -------------
234 // -- rsp[0] : return address 233 // -- rsp[0] : return address
235 // -- rsp[8] : name 234 // -- rsp[8] : name
236 // -- rsp[16] : receiver 235 // -- rsp[16] : receiver
237 // ----------------------------------- 236 // -----------------------------------
238 237
239 __ movq(rax, Operand(rsp, kPointerSize));
240 __ movq(rcx, Operand(rsp, 2 * kPointerSize));
241 __ pop(rbx); 238 __ pop(rbx);
242 __ push(rcx); // receiver 239 __ push(Operand(rsp, 1 * kPointerSize)); // receiver
243 __ push(rax); // name 240 __ push(Operand(rsp, 1 * kPointerSize)); // name
244 __ push(rbx); // return address 241 __ push(rbx); // return address
245 242
246 // Perform tail call to the entry. 243 // Perform tail call to the entry.
247 __ TailCallRuntime(f, 2, 1); 244 __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedLoadIC_Miss)), 2, 1);
245 }
246
247
248 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
249 // ----------- S t a t e -------------
250 // -- rsp[0] : return address
251 // -- rsp[8] : name
252 // -- rsp[16] : receiver
253 // -----------------------------------
254
255 __ pop(rbx);
256 __ push(Operand(rsp, 1 * kPointerSize)); // receiver
257 __ push(Operand(rsp, 1 * kPointerSize)); // name
258 __ push(rbx); // return address
259
260 // Perform tail call to the entry.
261 __ TailCallRuntime(ExternalReference(Runtime::kKeyedGetProperty), 2, 1);
248 } 262 }
249 263
250 264
251 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { 265 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
252 // ----------- S t a t e ------------- 266 // ----------- S t a t e -------------
253 // -- rsp[0] : return address 267 // -- rsp[0] : return address
254 // -- rsp[8] : name 268 // -- rsp[8] : name
255 // -- rsp[16] : receiver 269 // -- rsp[16] : receiver
256 // ----------------------------------- 270 // -----------------------------------
257 Label slow, check_string, index_int, index_string; 271 Label slow, check_string, index_int, index_string;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 __ cmpl(rax, FieldOperand(rcx, PixelArray::kLengthOffset)); 324 __ cmpl(rax, FieldOperand(rcx, PixelArray::kLengthOffset));
311 __ j(above_equal, &slow); 325 __ j(above_equal, &slow);
312 __ movq(rcx, FieldOperand(rcx, PixelArray::kExternalPointerOffset)); 326 __ movq(rcx, FieldOperand(rcx, PixelArray::kExternalPointerOffset));
313 __ movzxbq(rax, Operand(rcx, rax, times_1, 0)); 327 __ movzxbq(rax, Operand(rcx, rax, times_1, 0));
314 __ Integer32ToSmi(rax, rax); 328 __ Integer32ToSmi(rax, rax);
315 __ ret(0); 329 __ ret(0);
316 330
317 // Slow case: Load name and receiver from stack and jump to runtime. 331 // Slow case: Load name and receiver from stack and jump to runtime.
318 __ bind(&slow); 332 __ bind(&slow);
319 __ IncrementCounter(&Counters::keyed_load_generic_slow, 1); 333 __ IncrementCounter(&Counters::keyed_load_generic_slow, 1);
320 Generate(masm, ExternalReference(Runtime::kKeyedGetProperty)); 334 GenerateRuntimeGetProperty(masm);
321 __ bind(&check_string); 335 __ bind(&check_string);
322 // The key is not a smi. 336 // The key is not a smi.
323 // Is it a string? 337 // Is it a string?
324 __ CmpObjectType(rax, FIRST_NONSTRING_TYPE, rdx); 338 __ CmpObjectType(rax, FIRST_NONSTRING_TYPE, rdx);
325 __ j(above_equal, &slow); 339 __ j(above_equal, &slow);
326 // Is the string an array index, with cached numeric value? 340 // Is the string an array index, with cached numeric value?
327 __ movl(rbx, FieldOperand(rax, String::kHashFieldOffset)); 341 __ movl(rbx, FieldOperand(rax, String::kHashFieldOffset));
328 __ testl(rbx, Immediate(String::kIsArrayIndexMask)); 342 __ testl(rbx, Immediate(String::kIsArrayIndexMask));
329 343
330 // Is the string a symbol? 344 // Is the string a symbol?
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 // If we fail allocation of the HeapNumber, we still have a value on 562 // If we fail allocation of the HeapNumber, we still have a value on
549 // top of the FPU stack. Remove it. 563 // top of the FPU stack. Remove it.
550 __ bind(&failed_allocation); 564 __ bind(&failed_allocation);
551 __ ffree(); 565 __ ffree();
552 __ fincstp(); 566 __ fincstp();
553 // Fall through to slow case. 567 // Fall through to slow case.
554 568
555 // Slow case: Load name and receiver from stack and jump to runtime. 569 // Slow case: Load name and receiver from stack and jump to runtime.
556 __ bind(&slow); 570 __ bind(&slow);
557 __ IncrementCounter(&Counters::keyed_load_external_array_slow, 1); 571 __ IncrementCounter(&Counters::keyed_load_external_array_slow, 1);
558 Generate(masm, ExternalReference(Runtime::kKeyedGetProperty)); 572 GenerateRuntimeGetProperty(masm);
559 } 573 }
560 574
561 575
562 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { 576 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) {
563 // ----------- S t a t e ------------- 577 // ----------- S t a t e -------------
564 // -- rsp[0] : return address 578 // -- rax : value
565 // -- rsp[8] : name 579 // -- rsp[0] : return address
580 // -- rsp[8] : key
566 // -- rsp[16] : receiver 581 // -- rsp[16] : receiver
567 // ----------------------------------- 582 // -----------------------------------
568 Generate(masm, ExternalReference(IC_Utility(kKeyedLoadIC_Miss))); 583
584 __ pop(rcx);
585 __ push(Operand(rsp, 1 * kPointerSize)); // receiver
586 __ push(Operand(rsp, 1 * kPointerSize)); // key
587 __ push(rax); // value
588 __ push(rcx); // return address
589
590 // Do tail-call to runtime routine.
591 __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedStoreIC_Miss)), 3, 1);
569 } 592 }
570 593
571 594
572 void KeyedStoreIC::Generate(MacroAssembler* masm, ExternalReference const& f) { 595 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm) {
573 // ----------- S t a t e ------------- 596 // ----------- S t a t e -------------
574 // -- rax : value 597 // -- rax : value
575 // -- rsp[0] : return address 598 // -- rsp[0] : return address
576 // -- rsp[8] : key 599 // -- rsp[8] : key
577 // -- rsp[16] : receiver 600 // -- rsp[16] : receiver
578 // ----------------------------------- 601 // -----------------------------------
579 602
580 __ pop(rcx); 603 __ pop(rcx);
581 __ push(Operand(rsp, 1 * kPointerSize)); // receiver 604 __ push(Operand(rsp, 1 * kPointerSize)); // receiver
582 __ push(Operand(rsp, 1 * kPointerSize)); // key 605 __ push(Operand(rsp, 1 * kPointerSize)); // key
583 __ push(rax); // value 606 __ push(rax); // value
584 __ push(rcx); // return address 607 __ push(rcx); // return address
585 608
586 // Do tail-call to runtime routine. 609 // Do tail-call to runtime routine.
587 __ TailCallRuntime(f, 3, 1); 610 __ TailCallRuntime(ExternalReference(Runtime::kSetProperty), 3, 1);
588 } 611 }
589 612
590 613
591 void KeyedStoreIC::GenerateExtendStorage(MacroAssembler* masm) { 614 void KeyedStoreIC::GenerateExtendStorage(MacroAssembler* masm) {
592 // ----------- S t a t e ------------- 615 // ----------- S t a t e -------------
593 // -- rax : value 616 // -- rax : value
594 // -- rcx : transition map 617 // -- rcx : transition map
595 // -- rsp[0] : return address 618 // -- rsp[0] : return address
596 // -- rsp[8] : key 619 // -- rsp[8] : key
597 // -- rsp[16] : receiver 620 // -- rsp[16] : receiver
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 // Untag the key (for checking against untagged length in the fixed array). 675 // Untag the key (for checking against untagged length in the fixed array).
653 __ SmiToInteger32(rdx, rbx); 676 __ SmiToInteger32(rdx, rbx);
654 __ cmpl(rdx, FieldOperand(rcx, Array::kLengthOffset)); 677 __ cmpl(rdx, FieldOperand(rcx, Array::kLengthOffset));
655 // rax: value 678 // rax: value
656 // rcx: FixedArray 679 // rcx: FixedArray
657 // rbx: index (as a smi) 680 // rbx: index (as a smi)
658 __ j(below, &fast); 681 __ j(below, &fast);
659 682
660 // Slow case: call runtime. 683 // Slow case: call runtime.
661 __ bind(&slow); 684 __ bind(&slow);
662 Generate(masm, ExternalReference(Runtime::kSetProperty)); 685 GenerateRuntimeSetProperty(masm);
663 686
664 // Check whether the elements is a pixel array. 687 // Check whether the elements is a pixel array.
665 // rax: value 688 // rax: value
666 // rcx: elements array 689 // rcx: elements array
667 // rbx: index (as a smi), zero-extended. 690 // rbx: index (as a smi), zero-extended.
668 __ bind(&check_pixel_array); 691 __ bind(&check_pixel_array);
669 __ CompareRoot(FieldOperand(rcx, HeapObject::kMapOffset), 692 __ CompareRoot(FieldOperand(rcx, HeapObject::kMapOffset),
670 Heap::kPixelArrayMapRootIndex); 693 Heap::kPixelArrayMapRootIndex);
671 __ j(not_equal, &slow); 694 __ j(not_equal, &slow);
672 // Check that the value is a smi. If a conversion is needed call into the 695 // Check that the value is a smi. If a conversion is needed call into the
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 default: 939 default:
917 UNREACHABLE(); 940 UNREACHABLE();
918 break; 941 break;
919 } 942 }
920 __ movq(rax, rdx); // Return the original value. 943 __ movq(rax, rdx); // Return the original value.
921 __ ret(0); 944 __ ret(0);
922 } 945 }
923 946
924 // Slow case: call runtime. 947 // Slow case: call runtime.
925 __ bind(&slow); 948 __ bind(&slow);
926 Generate(masm, ExternalReference(Runtime::kSetProperty)); 949 GenerateRuntimeSetProperty(masm);
927 } 950 }
928 951
929 952
930 void CallIC::GenerateMiss(MacroAssembler* masm, int argc) { 953 void CallIC::GenerateMiss(MacroAssembler* masm, int argc) {
931 // Get the receiver of the function from the stack; 1 ~ return address. 954 // Get the receiver of the function from the stack; 1 ~ return address.
932 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); 955 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize));
933 // Get the name of the function to call from the stack. 956 // Get the name of the function to call from the stack.
934 // 2 ~ receiver, return address. 957 // 2 ~ receiver, return address.
935 __ movq(rbx, Operand(rsp, (argc + 2) * kPointerSize)); 958 __ movq(rbx, Operand(rsp, (argc + 2) * kPointerSize));
936 959
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1146 1169
1147 1170
1148 void LoadIC::ClearInlinedVersion(Address address) { 1171 void LoadIC::ClearInlinedVersion(Address address) {
1149 // Reset the map check of the inlined inobject property load (if 1172 // Reset the map check of the inlined inobject property load (if
1150 // present) to guarantee failure by holding an invalid map (the null 1173 // present) to guarantee failure by holding an invalid map (the null
1151 // value). The offset can be patched to anything. 1174 // value). The offset can be patched to anything.
1152 PatchInlinedLoad(address, Heap::null_value(), kMaxInt); 1175 PatchInlinedLoad(address, Heap::null_value(), kMaxInt);
1153 } 1176 }
1154 1177
1155 1178
1156 void LoadIC::Generate(MacroAssembler* masm, ExternalReference const& f) { 1179 void LoadIC::GenerateMiss(MacroAssembler* masm) {
1157 // ----------- S t a t e ------------- 1180 // ----------- S t a t e -------------
1158 // -- rcx : name 1181 // -- rcx : name
1159 // -- rsp[0] : return address 1182 // -- rsp[0] : return address
1160 // -- rsp[8] : receiver 1183 // -- rsp[8] : receiver
1161 // ----------------------------------- 1184 // -----------------------------------
1162 1185
1163 __ movq(rax, Operand(rsp, kPointerSize));
1164
1165 __ pop(rbx); 1186 __ pop(rbx);
1166 __ push(rax); // receiver 1187 __ push(Operand(rsp, 0)); // receiver
1167 __ push(rcx); // name 1188 __ push(rcx); // name
1168 __ push(rbx); // return address 1189 __ push(rbx); // return address
1169 1190
1170 // Perform tail call to the entry. 1191 // Perform tail call to the entry.
1171 __ TailCallRuntime(f, 2, 1); 1192 __ TailCallRuntime(ExternalReference(IC_Utility(kLoadIC_Miss)), 2, 1);
1172 } 1193 }
1173 1194
1174 1195
1175 void LoadIC::GenerateArrayLength(MacroAssembler* masm) { 1196 void LoadIC::GenerateArrayLength(MacroAssembler* masm) {
1176 // ----------- S t a t e ------------- 1197 // ----------- S t a t e -------------
1177 // -- rcx : name 1198 // -- rcx : name
1178 // -- rsp[0] : return address 1199 // -- rsp[0] : return address
1179 // -- rsp[8] : receiver 1200 // -- rsp[8] : receiver
1180 // ----------------------------------- 1201 // -----------------------------------
1181 Label miss; 1202 Label miss;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 Code::Flags flags = Code::ComputeFlags(Code::LOAD_IC, 1238 Code::Flags flags = Code::ComputeFlags(Code::LOAD_IC,
1218 NOT_IN_LOOP, 1239 NOT_IN_LOOP,
1219 MONOMORPHIC); 1240 MONOMORPHIC);
1220 StubCache::GenerateProbe(masm, flags, rax, rcx, rbx, rdx); 1241 StubCache::GenerateProbe(masm, flags, rax, rcx, rbx, rdx);
1221 1242
1222 // Cache miss: Jump to runtime. 1243 // Cache miss: Jump to runtime.
1223 StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC); 1244 StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC);
1224 } 1245 }
1225 1246
1226 1247
1227 void LoadIC::GenerateMiss(MacroAssembler* masm) {
1228 // ----------- S t a t e -------------
1229 // -- rcx : name
1230 // -- rsp[0] : return address
1231 // -- rsp[8] : receiver
1232 // -----------------------------------
1233
1234 Generate(masm, ExternalReference(IC_Utility(kLoadIC_Miss)));
1235 }
1236
1237
1238 void LoadIC::GenerateNormal(MacroAssembler* masm) { 1248 void LoadIC::GenerateNormal(MacroAssembler* masm) {
1239 // ----------- S t a t e ------------- 1249 // ----------- S t a t e -------------
1240 // -- rcx : name 1250 // -- rcx : name
1241 // -- rsp[0] : return address 1251 // -- rsp[0] : return address
1242 // -- rsp[8] : receiver 1252 // -- rsp[8] : receiver
1243 // ----------------------------------- 1253 // -----------------------------------
1244 Label miss, probe, global; 1254 Label miss, probe, global;
1245 1255
1246 __ movq(rax, Operand(rsp, kPointerSize)); 1256 __ movq(rax, Operand(rsp, kPointerSize));
1247 1257
(...skipping 23 matching lines...) Expand all
1271 __ ret(0); 1281 __ ret(0);
1272 1282
1273 // Global object access: Check access rights. 1283 // Global object access: Check access rights.
1274 __ bind(&global); 1284 __ bind(&global);
1275 __ CheckAccessGlobalProxy(rax, rdx, &miss); 1285 __ CheckAccessGlobalProxy(rax, rdx, &miss);
1276 __ jmp(&probe); 1286 __ jmp(&probe);
1277 1287
1278 // Cache miss: Restore receiver from stack and jump to runtime. 1288 // Cache miss: Restore receiver from stack and jump to runtime.
1279 __ bind(&miss); 1289 __ bind(&miss);
1280 __ movq(rax, Operand(rsp, 1 * kPointerSize)); 1290 __ movq(rax, Operand(rsp, 1 * kPointerSize));
1281 Generate(masm, ExternalReference(IC_Utility(kLoadIC_Miss))); 1291 GenerateMiss(masm);
1282 } 1292 }
1283 1293
1284 1294
1285 void LoadIC::GenerateStringLength(MacroAssembler* masm) { 1295 void LoadIC::GenerateStringLength(MacroAssembler* masm) {
1286 // ----------- S t a t e ------------- 1296 // ----------- S t a t e -------------
1287 // -- rcx : name 1297 // -- rcx : name
1288 // -- rsp[0] : return address 1298 // -- rsp[0] : return address
1289 // -- rsp[8] : receiver 1299 // -- rsp[8] : receiver
1290 // ----------------------------------- 1300 // -----------------------------------
1291 Label miss; 1301 Label miss;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 1389
1380 // Cache miss: Jump to runtime. 1390 // Cache miss: Jump to runtime.
1381 GenerateMiss(masm); 1391 GenerateMiss(masm);
1382 } 1392 }
1383 1393
1384 1394
1385 #undef __ 1395 #undef __
1386 1396
1387 1397
1388 } } // namespace v8::internal 1398 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ic.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698