| Index: src/x64/lithium-codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/lithium-codegen-x64.cc (revision 7683)
|
| +++ src/x64/lithium-codegen-x64.cc (working copy)
|
| @@ -2350,6 +2350,9 @@
|
| XMMRegister result(ToDoubleRegister(instr->result()));
|
| __ movss(result, Operand(external_pointer, key, times_4, 0));
|
| __ cvtss2sd(result, result);
|
| + } else if (array_type == kExternalDoubleArray) {
|
| + __ movsd(ToDoubleRegister(instr->result()),
|
| + Operand(external_pointer, key, times_8, 0));
|
| } else {
|
| Register result(ToRegister(instr->result()));
|
| switch (array_type) {
|
| @@ -2378,6 +2381,7 @@
|
| DeoptimizeIf(negative, instr->environment());
|
| break;
|
| case kExternalFloatArray:
|
| + case kExternalDoubleArray:
|
| UNREACHABLE();
|
| break;
|
| }
|
| @@ -3037,6 +3041,9 @@
|
| XMMRegister value(ToDoubleRegister(instr->value()));
|
| __ cvtsd2ss(value, value);
|
| __ movss(Operand(external_pointer, key, times_4, 0), value);
|
| + } else if (array_type == kExternalDoubleArray) {
|
| + __ movsd(Operand(external_pointer, key, times_8, 0),
|
| + ToDoubleRegister(instr->value()));
|
| } else {
|
| Register value(ToRegister(instr->value()));
|
| switch (array_type) {
|
| @@ -3064,6 +3071,7 @@
|
| __ movl(Operand(external_pointer, key, times_4, 0), value);
|
| break;
|
| case kExternalFloatArray:
|
| + case kExternalDoubleArray:
|
| UNREACHABLE();
|
| break;
|
| }
|
| @@ -3990,6 +3998,26 @@
|
| }
|
|
|
|
|
| +void LCodeGen::DoIn(LIn* instr) {
|
| + LOperand* obj = instr->object();
|
| + LOperand* key = instr->key();
|
| + EmitPushTaggedOperand(key);
|
| + EmitPushTaggedOperand(obj);
|
| + 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());
|
| + __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, &safepoint_generator);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
| // Perform stack overflow check.
|
| NearLabel done;
|
|
|