x64: Implement delete property in lithium backend.
Review URL: http://codereview.chromium.org/6570005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6907 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
bfb1cb4288
commit
a4ffbdc61b
@ -1940,8 +1940,8 @@ LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) {
|
||||
LDeleteProperty* result = new LDeleteProperty(Use(instr->object()),
|
||||
UseOrConstant(instr->key()));
|
||||
LDeleteProperty* result =
|
||||
new LDeleteProperty(Use(instr->object()), UseOrConstant(instr->key()));
|
||||
return MarkAsCall(DefineFixed(result, eax), instr);
|
||||
}
|
||||
|
||||
|
@ -2190,18 +2190,7 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) {
|
||||
void LCodeGen::DoPushArgument(LPushArgument* instr) {
|
||||
LOperand* argument = instr->InputAt(0);
|
||||
if (argument->IsConstantOperand()) {
|
||||
LConstantOperand* const_op = LConstantOperand::cast(argument);
|
||||
Handle<Object> literal = chunk_->LookupLiteral(const_op);
|
||||
Representation r = chunk_->LookupLiteralRepresentation(const_op);
|
||||
if (r.IsInteger32()) {
|
||||
ASSERT(literal->IsNumber());
|
||||
__ push(Immediate(static_cast<int32_t>(literal->Number())));
|
||||
} else if (r.IsDouble()) {
|
||||
Abort("unsupported double immediate");
|
||||
} else {
|
||||
ASSERT(r.IsTagged());
|
||||
__ Push(literal);
|
||||
}
|
||||
EmitPushConstantOperand(argument);
|
||||
} else if (argument->IsRegister()) {
|
||||
__ push(ToRegister(argument));
|
||||
} else {
|
||||
@ -3243,6 +3232,23 @@ void LCodeGen::EmitIsConstructCall(Register temp) {
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::EmitPushConstantOperand(LOperand* operand) {
|
||||
ASSERT(operand->IsConstantOperand());
|
||||
LConstantOperand* const_op = LConstantOperand::cast(operand);
|
||||
Handle<Object> literal = chunk_->LookupLiteral(const_op);
|
||||
Representation r = chunk_->LookupLiteralRepresentation(const_op);
|
||||
if (r.IsInteger32()) {
|
||||
ASSERT(literal->IsNumber());
|
||||
__ push(Immediate(static_cast<int32_t>(literal->Number())));
|
||||
} else if (r.IsDouble()) {
|
||||
Abort("unsupported double immediate");
|
||||
} else {
|
||||
ASSERT(r.IsTagged());
|
||||
__ Push(literal);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoTypeofIsAndBranch(LTypeofIsAndBranch* instr) {
|
||||
Register input = ToRegister(instr->InputAt(0));
|
||||
int true_block = chunk_->LookupDestination(instr->true_block_id());
|
||||
@ -3335,7 +3341,36 @@ void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
|
||||
|
||||
|
||||
void LCodeGen::DoDeleteProperty(LDeleteProperty* instr) {
|
||||
Abort("Unimplemented: %s", "DoDeleteProperty");
|
||||
LOperand* obj = instr->object();
|
||||
LOperand* key = instr->key();
|
||||
// Push object.
|
||||
if (obj->IsRegister()) {
|
||||
__ push(ToRegister(obj));
|
||||
} else {
|
||||
__ push(ToOperand(obj));
|
||||
}
|
||||
// Push key.
|
||||
if (key->IsConstantOperand()) {
|
||||
EmitPushConstantOperand(key);
|
||||
} else if (key->IsRegister()) {
|
||||
__ push(ToRegister(key));
|
||||
} else {
|
||||
__ push(ToOperand(key));
|
||||
}
|
||||
ASSERT(instr->HasPointerMap() && instr->HasDeoptimizationEnvironment());
|
||||
LPointerMap* pointers = instr->pointer_map();
|
||||
LEnvironment* env = instr->deoptimization_environment();
|
||||
RecordPosition(pointers->position());
|
||||
RegisterEnvironmentForDeoptimization(env);
|
||||
// Create safepoint generator that will also ensure enough space in the
|
||||
// reloc info for patching in deoptimization (since this is invoking a
|
||||
// builtin)
|
||||
SafepointGenerator safepoint_generator(this,
|
||||
pointers,
|
||||
env->deoptimization_index(),
|
||||
true);
|
||||
__ Push(Smi::FromInt(strict_mode_flag()));
|
||||
__ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION, &safepoint_generator);
|
||||
}
|
||||
|
||||
|
||||
|
@ -117,6 +117,10 @@ class LCodeGen BASE_EMBEDDED {
|
||||
bool is_done() const { return status_ == DONE; }
|
||||
bool is_aborted() const { return status_ == ABORTED; }
|
||||
|
||||
int strict_mode_flag() const {
|
||||
return info_->is_strict() ? kStrictMode : kNonStrictMode;
|
||||
}
|
||||
|
||||
LChunk* chunk() const { return chunk_; }
|
||||
Scope* scope() const { return scope_; }
|
||||
HGraph* graph() const { return chunk_->graph(); }
|
||||
@ -226,6 +230,9 @@ class LCodeGen BASE_EMBEDDED {
|
||||
// Caller should branch on equal condition.
|
||||
void EmitIsConstructCall(Register temp);
|
||||
|
||||
// Emits code for pushing a constant operand.
|
||||
void EmitPushConstantOperand(LOperand* operand);
|
||||
|
||||
LChunk* const chunk_;
|
||||
MacroAssembler* const masm_;
|
||||
CompilationInfo* const info_;
|
||||
|
@ -1883,8 +1883,9 @@ LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) {
|
||||
Abort("Unimplemented: %s", "DoDeleteProperty");
|
||||
return NULL;
|
||||
LDeleteProperty* result =
|
||||
new LDeleteProperty(Use(instr->object()), UseOrConstant(instr->key()));
|
||||
return MarkAsCall(DefineFixed(result, rax), instr);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user