| Index: src/arm/lithium-codegen-arm.cc
 | 
| ===================================================================
 | 
| --- src/arm/lithium-codegen-arm.cc	(revision 7683)
 | 
| +++ src/arm/lithium-codegen-arm.cc	(working copy)
 | 
| @@ -2479,6 +2479,11 @@
 | 
|      __ add(scratch0(), external_pointer, Operand(key, LSL, 2));
 | 
|      __ vldr(result.low(), scratch0(), 0);
 | 
|      __ vcvt_f64_f32(result, result.low());
 | 
| +  } else if (array_type == kExternalDoubleArray) {
 | 
| +    CpuFeatures::Scope scope(VFP3);
 | 
| +    DwVfpRegister result(ToDoubleRegister(instr->result()));
 | 
| +    __ add(scratch0(), external_pointer, Operand(key, LSL, 3));
 | 
| +    __ vldr(result, scratch0(), 0);
 | 
|    } else {
 | 
|      Register result(ToRegister(instr->result()));
 | 
|      switch (array_type) {
 | 
| @@ -2507,6 +2512,7 @@
 | 
|          DeoptimizeIf(cs, instr->environment());
 | 
|          break;
 | 
|        case kExternalFloatArray:
 | 
| +      case kExternalDoubleArray:
 | 
|          UNREACHABLE();
 | 
|          break;
 | 
|      }
 | 
| @@ -3232,12 +3238,18 @@
 | 
|    Register external_pointer = ToRegister(instr->external_pointer());
 | 
|    Register key = ToRegister(instr->key());
 | 
|    ExternalArrayType array_type = instr->array_type();
 | 
| +
 | 
|    if (array_type == kExternalFloatArray) {
 | 
|      CpuFeatures::Scope scope(VFP3);
 | 
|      DwVfpRegister value(ToDoubleRegister(instr->value()));
 | 
|      __ add(scratch0(), external_pointer, Operand(key, LSL, 2));
 | 
|      __ vcvt_f32_f64(double_scratch0().low(), value);
 | 
|      __ vstr(double_scratch0().low(), scratch0(), 0);
 | 
| +  } else if (array_type == kExternalDoubleArray) {
 | 
| +    CpuFeatures::Scope scope(VFP3);
 | 
| +    DwVfpRegister value(ToDoubleRegister(instr->value()));
 | 
| +    __ add(scratch0(), external_pointer, Operand(key, LSL, 3));
 | 
| +    __ vstr(value, scratch0(), 0);
 | 
|    } else {
 | 
|      Register value(ToRegister(instr->value()));
 | 
|      switch (array_type) {
 | 
| @@ -3259,6 +3271,7 @@
 | 
|          __ str(value, MemOperand(external_pointer, key, LSL, 2));
 | 
|          break;
 | 
|        case kExternalFloatArray:
 | 
| +      case kExternalDoubleArray:
 | 
|          UNREACHABLE();
 | 
|          break;
 | 
|      }
 | 
| @@ -4244,6 +4257,22 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void LCodeGen::DoIn(LIn* instr) {
 | 
| +  Register obj = ToRegister(instr->object());
 | 
| +  Register key = ToRegister(instr->key());
 | 
| +  __ Push(key, obj);
 | 
| +  ASSERT(instr->HasPointerMap() && instr->HasDeoptimizationEnvironment());
 | 
| +  LPointerMap* pointers = instr->pointer_map();
 | 
| +  LEnvironment* env = instr->deoptimization_environment();
 | 
| +  RecordPosition(pointers->position());
 | 
| +  RegisterEnvironmentForDeoptimization(env);
 | 
| +  SafepointGenerator safepoint_generator(this,
 | 
| +                                         pointers,
 | 
| +                                         env->deoptimization_index());
 | 
| +  __ InvokeBuiltin(Builtins::IN, CALL_JS, &safepoint_generator);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void LCodeGen::DoStackCheck(LStackCheck* instr) {
 | 
|    // Perform stack overflow check.
 | 
|    Label ok;
 | 
| @@ -4273,6 +4302,8 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +
 | 
| +
 | 
|  #undef __
 | 
|  
 | 
|  } }  // namespace v8::internal
 | 
| 
 |