Commit f8e622a6 authored by whesse@chromium.org's avatar whesse@chromium.org

Added inline caching for calls to a field to X64. Changed a use of...

Added inline caching for calls to a field to X64.  Changed a use of Array::kHeaderSize to FixedArray::kHeaderSize on all platforms.
Review URL: http://codereview.chromium.org/149798

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2496 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 38f5a847
...@@ -164,7 +164,7 @@ void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm, ...@@ -164,7 +164,7 @@ void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm,
__ ldr(dst, FieldMemOperand(src, offset)); __ ldr(dst, FieldMemOperand(src, offset));
} else { } else {
// Calculate the offset into the properties array. // Calculate the offset into the properties array.
int offset = index * kPointerSize + Array::kHeaderSize; int offset = index * kPointerSize + FixedArray::kHeaderSize;
__ ldr(dst, FieldMemOperand(src, JSObject::kPropertiesOffset)); __ ldr(dst, FieldMemOperand(src, JSObject::kPropertiesOffset));
__ ldr(dst, FieldMemOperand(dst, offset)); __ ldr(dst, FieldMemOperand(dst, offset));
} }
...@@ -330,7 +330,7 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm, ...@@ -330,7 +330,7 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm,
__ RecordWrite(receiver_reg, name_reg, scratch); __ RecordWrite(receiver_reg, name_reg, scratch);
} else { } else {
// Write to the properties array. // Write to the properties array.
int offset = index * kPointerSize + Array::kHeaderSize; int offset = index * kPointerSize + FixedArray::kHeaderSize;
// Get the properties array // Get the properties array
__ ldr(scratch, FieldMemOperand(receiver_reg, JSObject::kPropertiesOffset)); __ ldr(scratch, FieldMemOperand(receiver_reg, JSObject::kPropertiesOffset));
__ str(r0, FieldMemOperand(scratch, offset)); __ str(r0, FieldMemOperand(scratch, offset));
......
...@@ -266,15 +266,13 @@ void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm, ...@@ -266,15 +266,13 @@ void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm,
__ mov(dst, FieldOperand(src, offset)); __ mov(dst, FieldOperand(src, offset));
} else { } else {
// Calculate the offset into the properties array. // Calculate the offset into the properties array.
int offset = index * kPointerSize + Array::kHeaderSize; int offset = index * kPointerSize + FixedArray::kHeaderSize;
__ mov(dst, FieldOperand(src, JSObject::kPropertiesOffset)); __ mov(dst, FieldOperand(src, JSObject::kPropertiesOffset));
__ mov(dst, FieldOperand(dst, offset)); __ mov(dst, FieldOperand(dst, offset));
} }
} }
void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) {
ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC); ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC);
Code* code = NULL; Code* code = NULL;
...@@ -349,7 +347,7 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm, ...@@ -349,7 +347,7 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm,
__ RecordWrite(receiver_reg, offset, name_reg, scratch); __ RecordWrite(receiver_reg, offset, name_reg, scratch);
} else { } else {
// Write to the properties array. // Write to the properties array.
int offset = index * kPointerSize + Array::kHeaderSize; int offset = index * kPointerSize + FixedArray::kHeaderSize;
// Get the properties array (optimistically). // Get the properties array (optimistically).
__ mov(scratch, FieldOperand(receiver_reg, JSObject::kPropertiesOffset)); __ mov(scratch, FieldOperand(receiver_reg, JSObject::kPropertiesOffset));
__ mov(FieldOperand(scratch, offset), eax); __ mov(FieldOperand(scratch, offset), eax);
......
...@@ -171,12 +171,59 @@ Object* CallStubCompiler::CompileCallConstant(Object* object, ...@@ -171,12 +171,59 @@ Object* CallStubCompiler::CompileCallConstant(Object* object,
} }
Object* CallStubCompiler::CompileCallField(Object* a, Object* CallStubCompiler::CompileCallField(Object* object,
JSObject* b, JSObject* holder,
int c, int index,
String* d) { String* name) {
// TODO(X64): Implement a real stub. // ----------- S t a t e -------------
return Failure::InternalError(); // -----------------------------------
// rsp[0] return address
// rsp[8] argument argc
// rsp[16] argument argc - 1
// ...
// rsp[argc * 8] argument 1
// rsp[(argc + 1) * 8] argument 0 = receiver
// rsp[(argc + 2) * 8] function name
Label miss;
// Get the receiver from the stack.
const int argc = arguments().immediate();
__ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize));
// Check that the receiver isn't a smi.
__ testl(rdx, Immediate(kSmiTagMask));
__ j(zero, &miss);
// Do the right check and compute the holder register.
Register reg =
CheckPrototypes(JSObject::cast(object), rdx, holder,
rbx, rcx, name, &miss);
GenerateFastPropertyLoad(masm(), rdi, reg, holder, index);
// Check that the function really is a function.
__ testl(rdi, Immediate(kSmiTagMask));
__ j(zero, &miss);
__ CmpObjectType(rdi, JS_FUNCTION_TYPE, rbx);
__ j(not_equal, &miss);
// Patch the receiver on the stack with the global proxy if
// necessary.
if (object->IsGlobalObject()) {
__ movq(rdx, FieldOperand(rdx, GlobalObject::kGlobalReceiverOffset));
__ movq(Operand(rsp, (argc + 1) * kPointerSize), rdx);
}
// Invoke the function.
__ InvokeFunction(rdi, arguments(), JUMP_FUNCTION);
// Handle call cache miss.
__ bind(&miss);
Handle<Code> ic = ComputeCallMiss(arguments().immediate());
__ Jump(ic, RelocInfo::CODE_TARGET);
// Return the generated code.
return GetCode(FIELD, name);
} }
...@@ -334,23 +381,50 @@ Register StubCompiler::CheckPrototypes(JSObject* object, ...@@ -334,23 +381,50 @@ Register StubCompiler::CheckPrototypes(JSObject* object,
return result; return result;
} }
#undef __
//-----------------------------------------------------------------------------
// StubCompiler static helper functions
#define __ ACCESS_MASM(masm)
void StubCompiler::GenerateLoadGlobalFunctionPrototype(MacroAssembler* masm, void StubCompiler::GenerateLoadGlobalFunctionPrototype(MacroAssembler* masm,
int index, int index,
Register prototype) { Register prototype) {
// Load the global or builtins object from the current context. // Load the global or builtins object from the current context.
masm->movq(prototype, __ movq(prototype,
Operand(rsi, Context::SlotOffset(Context::GLOBAL_INDEX))); Operand(rsi, Context::SlotOffset(Context::GLOBAL_INDEX)));
// Load the global context from the global or builtins object. // Load the global context from the global or builtins object.
masm->movq(prototype, __ movq(prototype,
FieldOperand(prototype, GlobalObject::kGlobalContextOffset)); FieldOperand(prototype, GlobalObject::kGlobalContextOffset));
// Load the function from the global context. // Load the function from the global context.
masm->movq(prototype, Operand(prototype, Context::SlotOffset(index))); __ movq(prototype, Operand(prototype, Context::SlotOffset(index)));
// Load the initial map. The global functions all have initial maps. // Load the initial map. The global functions all have initial maps.
masm->movq(prototype, __ movq(prototype,
FieldOperand(prototype, JSFunction::kPrototypeOrInitialMapOffset)); FieldOperand(prototype, JSFunction::kPrototypeOrInitialMapOffset));
// Load the prototype from the initial map. // Load the prototype from the initial map.
masm->movq(prototype, FieldOperand(prototype, Map::kPrototypeOffset)); __ movq(prototype, FieldOperand(prototype, Map::kPrototypeOffset));
}
// Load a fast property out of a holder object (src). In-object properties
// are loaded directly otherwise the property is loaded from the properties
// fixed array.
void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm,
Register dst, Register src,
JSObject* holder, int index) {
// Adjust for the number of properties stored in the holder.
index -= holder->map()->inobject_properties();
if (index < 0) {
// Get the property straight out of the holder.
int offset = holder->map()->instance_size() + (index * kPointerSize);
__ movq(dst, FieldOperand(src, offset));
} else {
// Calculate the offset into the properties array.
int offset = index * kPointerSize + FixedArray::kHeaderSize;
__ movq(dst, FieldOperand(src, JSObject::kPropertiesOffset));
__ movq(dst, FieldOperand(dst, offset));
}
} }
#undef __ #undef __
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment