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

Side by Side Diff: src/stub-cache.cc

Issue 14850006: Use mutable heapnumbers to store doubles in fields. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 7 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
OLDNEW
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 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 handler = 214 handler =
215 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); 215 compiler.CompileLoadNonexistent(receiver, current, cache_name, global);
216 JSObject::UpdateMapCodeCache(receiver, cache_name, handler); 216 JSObject::UpdateMapCodeCache(receiver, cache_name, handler);
217 return handler; 217 return handler;
218 } 218 }
219 219
220 220
221 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, 221 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name,
222 Handle<JSObject> receiver, 222 Handle<JSObject> receiver,
223 Handle<JSObject> holder, 223 Handle<JSObject> holder,
224 PropertyIndex field) { 224 PropertyIndex field,
225 Representation representation) {
225 if (receiver.is_identical_to(holder)) { 226 if (receiver.is_identical_to(holder)) {
226 LoadFieldStub stub(field.is_inobject(holder), 227 LoadFieldStub stub(field.is_inobject(receiver),
227 field.translate(holder)); 228 field.translate(receiver),
danno 2013/05/07 13:04:47 Extraneous change?
Toon Verwaest 2013/05/07 15:08:52 Done.
229 representation);
228 return stub.GetCode(isolate()); 230 return stub.GetCode(isolate());
229 } 231 }
230 232
231 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 233 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
232 Handle<Code> stub = FindHandler( 234 Handle<Code> stub = FindHandler(
233 name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD); 235 name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD);
234 if (!stub.is_null()) return stub; 236 if (!stub.is_null()) return stub;
235 237
236 LoadStubCompiler compiler(isolate_); 238 LoadStubCompiler compiler(isolate_);
237 Handle<Code> handler = 239 Handle<Code> handler =
238 compiler.CompileLoadField(receiver, holder, name, field); 240 compiler.CompileLoadField(receiver, holder, name, field, representation);
239 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 241 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
240 return handler; 242 return handler;
241 } 243 }
242 244
243 245
244 Handle<Code> StubCache::ComputeLoadCallback( 246 Handle<Code> StubCache::ComputeLoadCallback(
245 Handle<Name> name, 247 Handle<Name> name,
246 Handle<JSObject> receiver, 248 Handle<JSObject> receiver,
247 Handle<JSObject> holder, 249 Handle<JSObject> holder,
248 Handle<ExecutableAccessorInfo> callback) { 250 Handle<ExecutableAccessorInfo> callback) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 Handle<Code> ic = 331 Handle<Code> ic =
330 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); 332 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete);
331 JSObject::UpdateMapCodeCache(stub_holder, name, ic); 333 JSObject::UpdateMapCodeCache(stub_holder, name, ic);
332 return ic; 334 return ic;
333 } 335 }
334 336
335 337
336 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, 338 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name,
337 Handle<JSObject> receiver, 339 Handle<JSObject> receiver,
338 Handle<JSObject> holder, 340 Handle<JSObject> holder,
339 PropertyIndex field) { 341 PropertyIndex field,
342 Representation representation) {
340 if (receiver.is_identical_to(holder)) { 343 if (receiver.is_identical_to(holder)) {
341 KeyedLoadFieldStub stub(field.is_inobject(holder), 344 KeyedLoadFieldStub stub(field.is_inobject(holder),
342 field.translate(holder)); 345 field.translate(holder),
346 representation);
343 return stub.GetCode(isolate()); 347 return stub.GetCode(isolate());
344 } 348 }
345 349
346 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 350 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
347 Handle<Code> stub = FindHandler( 351 Handle<Code> stub = FindHandler(
348 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); 352 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD);
349 if (!stub.is_null()) return stub; 353 if (!stub.is_null()) return stub;
350 354
351 KeyedLoadStubCompiler compiler(isolate_); 355 KeyedLoadStubCompiler compiler(isolate_);
352 Handle<Code> handler = 356 Handle<Code> handler =
353 compiler.CompileLoadField(receiver, holder, name, field); 357 compiler.CompileLoadField(receiver, holder, name, field, representation);
354 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 358 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
355 return handler; 359 return handler;
356 } 360 }
357 361
358 362
359 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, 363 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name,
360 Handle<JSObject> receiver, 364 Handle<JSObject> receiver,
361 Handle<JSObject> holder, 365 Handle<JSObject> holder,
362 Handle<JSFunction> value) { 366 Handle<JSFunction> value) {
363 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 367 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
(...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1487 Label* success) { 1491 Label* success) {
1488 Label miss; 1492 Label miss;
1489 1493
1490 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss); 1494 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss);
1491 1495
1492 HandlerFrontendFooter(success, &miss); 1496 HandlerFrontendFooter(success, &miss);
1493 return reg; 1497 return reg;
1494 } 1498 }
1495 1499
1496 1500
1497 Handle<Code> BaseLoadStubCompiler::CompileLoadField(Handle<JSObject> object, 1501 Handle<Code> BaseLoadStubCompiler::CompileLoadField(
1498 Handle<JSObject> holder, 1502 Handle<JSObject> object,
1499 Handle<Name> name, 1503 Handle<JSObject> holder,
1500 PropertyIndex field) { 1504 Handle<Name> name,
1505 PropertyIndex field,
1506 Representation representation) {
1501 Label miss; 1507 Label miss;
1502 1508
1503 Register reg = HandlerFrontendHeader(object, receiver(), holder, name, &miss); 1509 Register reg = HandlerFrontendHeader(
1510 object, receiver(), holder, name, &miss);
danno 2013/05/07 13:04:47 Extraneous whitespace change
Toon Verwaest 2013/05/07 15:08:52 Done.
1504 1511
1505 GenerateLoadField(reg, holder, field); 1512 GenerateLoadField(reg, holder, field, representation);
1506 1513
1507 __ bind(&miss); 1514 __ bind(&miss);
1508 TailCallBuiltin(masm(), MissBuiltin(kind())); 1515 TailCallBuiltin(masm(), MissBuiltin(kind()));
1509 1516
1510 // Return the generated code. 1517 // Return the generated code.
1511 return GetCode(kind(), Code::FIELD, name); 1518 return GetCode(kind(), Code::FIELD, name);
1512 } 1519 }
1513 1520
1514 1521
1515 // Load a fast property out of a holder object (src). In-object properties
1516 // are loaded directly otherwise the property is loaded from the properties
1517 // fixed array.
1518 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm,
1519 Register dst,
1520 Register src,
1521 Handle<JSObject> holder,
1522 PropertyIndex index) {
1523 DoGenerateFastPropertyLoad(
1524 masm, dst, src, index.is_inobject(holder), index.translate(holder));
1525 }
1526
1527
1528 Handle<Code> BaseLoadStubCompiler::CompileLoadConstant( 1522 Handle<Code> BaseLoadStubCompiler::CompileLoadConstant(
1529 Handle<JSObject> object, 1523 Handle<JSObject> object,
1530 Handle<JSObject> holder, 1524 Handle<JSObject> holder,
1531 Handle<Name> name, 1525 Handle<Name> name,
1532 Handle<JSFunction> value) { 1526 Handle<JSFunction> value) {
1533 Label success; 1527 Label success;
1534 HandlerFrontend(object, receiver(), holder, name, &success); 1528 HandlerFrontend(object, receiver(), holder, name, &success);
1535 __ bind(&success); 1529 __ bind(&success);
1536 GenerateLoadConstant(value); 1530 GenerateLoadConstant(value);
1537 1531
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1580 void BaseLoadStubCompiler::GenerateLoadPostInterceptor( 1574 void BaseLoadStubCompiler::GenerateLoadPostInterceptor(
1581 Register interceptor_reg, 1575 Register interceptor_reg,
1582 Handle<JSObject> interceptor_holder, 1576 Handle<JSObject> interceptor_holder,
1583 Handle<Name> name, 1577 Handle<Name> name,
1584 LookupResult* lookup) { 1578 LookupResult* lookup) {
1585 Label success; 1579 Label success;
1586 Handle<JSObject> holder(lookup->holder()); 1580 Handle<JSObject> holder(lookup->holder());
1587 if (lookup->IsField()) { 1581 if (lookup->IsField()) {
1588 PropertyIndex field = lookup->GetFieldIndex(); 1582 PropertyIndex field = lookup->GetFieldIndex();
1589 if (interceptor_holder.is_identical_to(holder)) { 1583 if (interceptor_holder.is_identical_to(holder)) {
1590 GenerateLoadField(interceptor_reg, holder, field); 1584 GenerateLoadField(
1585 interceptor_reg, holder, field, lookup->representation());
1591 } else { 1586 } else {
1592 // We found FIELD property in prototype chain of interceptor's holder. 1587 // We found FIELD property in prototype chain of interceptor's holder.
1593 // Retrieve a field from field's holder. 1588 // Retrieve a field from field's holder.
1594 Register reg = HandlerFrontend( 1589 Register reg = HandlerFrontend(
1595 interceptor_holder, interceptor_reg, holder, name, &success); 1590 interceptor_holder, interceptor_reg, holder, name, &success);
1596 __ bind(&success); 1591 __ bind(&success);
1597 GenerateLoadField(reg, holder, field); 1592 GenerateLoadField(
1593 reg, holder, field, lookup->representation());
1598 } 1594 }
1599 } else { 1595 } else {
1600 // We found CALLBACKS property in prototype chain of interceptor's 1596 // We found CALLBACKS property in prototype chain of interceptor's
1601 // holder. 1597 // holder.
1602 ASSERT(lookup->type() == CALLBACKS); 1598 ASSERT(lookup->type() == CALLBACKS);
1603 Handle<ExecutableAccessorInfo> callback( 1599 Handle<ExecutableAccessorInfo> callback(
1604 ExecutableAccessorInfo::cast(lookup->GetCallbackObject())); 1600 ExecutableAccessorInfo::cast(lookup->GetCallbackObject()));
1605 ASSERT(callback->getter() != NULL); 1601 ASSERT(callback->getter() != NULL);
1606 1602
1607 Register reg = CallbackHandlerFrontend( 1603 Register reg = CallbackHandlerFrontend(
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1639 // Return the generated code. 1635 // Return the generated code.
1640 return GetCode(kind(), Code::CALLBACKS, name); 1636 return GetCode(kind(), Code::CALLBACKS, name);
1641 } 1637 }
1642 1638
1643 1639
1644 Handle<Code> BaseStoreStubCompiler::CompileStoreTransition( 1640 Handle<Code> BaseStoreStubCompiler::CompileStoreTransition(
1645 Handle<JSObject> object, 1641 Handle<JSObject> object,
1646 LookupResult* lookup, 1642 LookupResult* lookup,
1647 Handle<Map> transition, 1643 Handle<Map> transition,
1648 Handle<Name> name) { 1644 Handle<Name> name) {
1649 Label miss, miss_restore_name; 1645 Label miss, miss_restore_name, slow;
1650 1646
1651 GenerateNameCheck(name, this->name(), &miss); 1647 GenerateNameCheck(name, this->name(), &miss);
1652 1648
1653 GenerateStoreTransition(masm(), 1649 GenerateStoreTransition(masm(),
1654 object, 1650 object,
1655 lookup, 1651 lookup,
1656 transition, 1652 transition,
1657 name, 1653 name,
1658 receiver(), this->name(), value(), 1654 receiver(), this->name(), value(),
1659 scratch1(), scratch2(), 1655 scratch1(), scratch2(),
1660 &miss, 1656 &miss,
1661 &miss_restore_name); 1657 &miss_restore_name,
1658 &slow);
1662 1659
1663 // Handle store cache miss. 1660 // Handle store cache miss.
1664 GenerateRestoreName(masm(), &miss_restore_name, name); 1661 GenerateRestoreName(masm(), &miss_restore_name, name);
1665 __ bind(&miss); 1662 __ bind(&miss);
1666 TailCallBuiltin(masm(), MissBuiltin(kind())); 1663 TailCallBuiltin(masm(), MissBuiltin(kind()));
1667 1664
1665 GenerateRestoreName(masm(), &slow, name);
1666 TailCallBuiltin(masm(), SlowBuiltin(kind()));
1667
1668 // Return the generated code. 1668 // Return the generated code.
1669 return GetICCode(kind(), Code::MAP_TRANSITION, name); 1669 return GetICCode(kind(), Code::MAP_TRANSITION, name);
1670 } 1670 }
1671 1671
1672 1672
1673 Handle<Code> BaseStoreStubCompiler::CompileStoreField(Handle<JSObject> object, 1673 Handle<Code> BaseStoreStubCompiler::CompileStoreField(Handle<JSObject> object,
1674 LookupResult* lookup, 1674 LookupResult* lookup,
1675 Handle<Name> name) { 1675 Handle<Name> name) {
1676 Label miss; 1676 Label miss;
1677 1677
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
2089 Handle<FunctionTemplateInfo>( 2089 Handle<FunctionTemplateInfo>(
2090 FunctionTemplateInfo::cast(signature->receiver())); 2090 FunctionTemplateInfo::cast(signature->receiver()));
2091 } 2091 }
2092 } 2092 }
2093 2093
2094 is_simple_api_call_ = true; 2094 is_simple_api_call_ = true;
2095 } 2095 }
2096 2096
2097 2097
2098 } } // namespace v8::internal 2098 } } // namespace v8::internal
OLDNEW
« src/runtime.cc ('K') | « src/stub-cache.h ('k') | test/cctest/test-heap-profiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698