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

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: Ported to ARM and x64 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
« no previous file with comments | « src/stub-cache.h ('k') | src/x64/full-codegen-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // 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(holder),
227 field.translate(holder)); 228 field.translate(holder),
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(object, receiver(), holder, name, &miss);
1504 1510
1505 GenerateLoadField(reg, holder, field); 1511 GenerateLoadField(reg, holder, field, representation);
1506 1512
1507 __ bind(&miss); 1513 __ bind(&miss);
1508 TailCallBuiltin(masm(), MissBuiltin(kind())); 1514 TailCallBuiltin(masm(), MissBuiltin(kind()));
1509 1515
1510 // Return the generated code. 1516 // Return the generated code.
1511 return GetCode(kind(), Code::FIELD, name); 1517 return GetCode(kind(), Code::FIELD, name);
1512 } 1518 }
1513 1519
1514 1520
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( 1521 Handle<Code> BaseLoadStubCompiler::CompileLoadConstant(
1529 Handle<JSObject> object, 1522 Handle<JSObject> object,
1530 Handle<JSObject> holder, 1523 Handle<JSObject> holder,
1531 Handle<Name> name, 1524 Handle<Name> name,
1532 Handle<JSFunction> value) { 1525 Handle<JSFunction> value) {
1533 Label success; 1526 Label success;
1534 HandlerFrontend(object, receiver(), holder, name, &success); 1527 HandlerFrontend(object, receiver(), holder, name, &success);
1535 __ bind(&success); 1528 __ bind(&success);
1536 GenerateLoadConstant(value); 1529 GenerateLoadConstant(value);
1537 1530
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1580 void BaseLoadStubCompiler::GenerateLoadPostInterceptor( 1573 void BaseLoadStubCompiler::GenerateLoadPostInterceptor(
1581 Register interceptor_reg, 1574 Register interceptor_reg,
1582 Handle<JSObject> interceptor_holder, 1575 Handle<JSObject> interceptor_holder,
1583 Handle<Name> name, 1576 Handle<Name> name,
1584 LookupResult* lookup) { 1577 LookupResult* lookup) {
1585 Label success; 1578 Label success;
1586 Handle<JSObject> holder(lookup->holder()); 1579 Handle<JSObject> holder(lookup->holder());
1587 if (lookup->IsField()) { 1580 if (lookup->IsField()) {
1588 PropertyIndex field = lookup->GetFieldIndex(); 1581 PropertyIndex field = lookup->GetFieldIndex();
1589 if (interceptor_holder.is_identical_to(holder)) { 1582 if (interceptor_holder.is_identical_to(holder)) {
1590 GenerateLoadField(interceptor_reg, holder, field); 1583 GenerateLoadField(
1584 interceptor_reg, holder, field, lookup->representation());
1591 } else { 1585 } else {
1592 // We found FIELD property in prototype chain of interceptor's holder. 1586 // We found FIELD property in prototype chain of interceptor's holder.
1593 // Retrieve a field from field's holder. 1587 // Retrieve a field from field's holder.
1594 Register reg = HandlerFrontend( 1588 Register reg = HandlerFrontend(
1595 interceptor_holder, interceptor_reg, holder, name, &success); 1589 interceptor_holder, interceptor_reg, holder, name, &success);
1596 __ bind(&success); 1590 __ bind(&success);
1597 GenerateLoadField(reg, holder, field); 1591 GenerateLoadField(
1592 reg, holder, field, lookup->representation());
1598 } 1593 }
1599 } else { 1594 } else {
1600 // We found CALLBACKS property in prototype chain of interceptor's 1595 // We found CALLBACKS property in prototype chain of interceptor's
1601 // holder. 1596 // holder.
1602 ASSERT(lookup->type() == CALLBACKS); 1597 ASSERT(lookup->type() == CALLBACKS);
1603 Handle<ExecutableAccessorInfo> callback( 1598 Handle<ExecutableAccessorInfo> callback(
1604 ExecutableAccessorInfo::cast(lookup->GetCallbackObject())); 1599 ExecutableAccessorInfo::cast(lookup->GetCallbackObject()));
1605 ASSERT(callback->getter() != NULL); 1600 ASSERT(callback->getter() != NULL);
1606 1601
1607 Register reg = CallbackHandlerFrontend( 1602 Register reg = CallbackHandlerFrontend(
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1639 // Return the generated code. 1634 // Return the generated code.
1640 return GetCode(kind(), Code::CALLBACKS, name); 1635 return GetCode(kind(), Code::CALLBACKS, name);
1641 } 1636 }
1642 1637
1643 1638
1644 Handle<Code> BaseStoreStubCompiler::CompileStoreTransition( 1639 Handle<Code> BaseStoreStubCompiler::CompileStoreTransition(
1645 Handle<JSObject> object, 1640 Handle<JSObject> object,
1646 LookupResult* lookup, 1641 LookupResult* lookup,
1647 Handle<Map> transition, 1642 Handle<Map> transition,
1648 Handle<Name> name) { 1643 Handle<Name> name) {
1649 Label miss, miss_restore_name; 1644 Label miss, miss_restore_name, slow;
1650 1645
1651 GenerateNameCheck(name, this->name(), &miss); 1646 GenerateNameCheck(name, this->name(), &miss);
1652 1647
1653 GenerateStoreTransition(masm(), 1648 GenerateStoreTransition(masm(),
1654 object, 1649 object,
1655 lookup, 1650 lookup,
1656 transition, 1651 transition,
1657 name, 1652 name,
1658 receiver(), this->name(), value(), 1653 receiver(), this->name(), value(),
1659 scratch1(), scratch2(), 1654 scratch1(), scratch2(), scratch3(),
1660 &miss, 1655 &miss,
1661 &miss_restore_name); 1656 &miss_restore_name,
1657 &slow);
1662 1658
1663 // Handle store cache miss. 1659 // Handle store cache miss.
1664 GenerateRestoreName(masm(), &miss_restore_name, name); 1660 GenerateRestoreName(masm(), &miss_restore_name, name);
1665 __ bind(&miss); 1661 __ bind(&miss);
1666 TailCallBuiltin(masm(), MissBuiltin(kind())); 1662 TailCallBuiltin(masm(), MissBuiltin(kind()));
1667 1663
1664 GenerateRestoreName(masm(), &slow, name);
1665 TailCallBuiltin(masm(), SlowBuiltin(kind()));
1666
1668 // Return the generated code. 1667 // Return the generated code.
1669 return GetICCode(kind(), Code::MAP_TRANSITION, name); 1668 return GetICCode(kind(), Code::MAP_TRANSITION, name);
1670 } 1669 }
1671 1670
1672 1671
1673 Handle<Code> BaseStoreStubCompiler::CompileStoreField(Handle<JSObject> object, 1672 Handle<Code> BaseStoreStubCompiler::CompileStoreField(Handle<JSObject> object,
1674 LookupResult* lookup, 1673 LookupResult* lookup,
1675 Handle<Name> name) { 1674 Handle<Name> name) {
1676 Label miss; 1675 Label miss;
1677 1676
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
2089 Handle<FunctionTemplateInfo>( 2088 Handle<FunctionTemplateInfo>(
2090 FunctionTemplateInfo::cast(signature->receiver())); 2089 FunctionTemplateInfo::cast(signature->receiver()));
2091 } 2090 }
2092 } 2091 }
2093 2092
2094 is_simple_api_call_ = true; 2093 is_simple_api_call_ = true;
2095 } 2094 }
2096 2095
2097 2096
2098 } } // namespace v8::internal 2097 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/stub-cache.h ('k') | src/x64/full-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698