| Index: runtime/vm/simulator_dbc.cc | 
| diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc | 
| index 2e271c7197aa8cd30001d5fd44ef6322e2bc1fa8..e02cec330ed5822e1a5fb1143b2f1f4588569044 100644 | 
| --- a/runtime/vm/simulator_dbc.cc | 
| +++ b/runtime/vm/simulator_dbc.cc | 
| @@ -256,8 +256,6 @@ class SimulatorHelpers { | 
| RawTypedData* array = reinterpret_cast<RawTypedData*>(obj); | 
| const intptr_t byte_offset = Smi::Value(RAW_CAST(Smi, index)); | 
| ASSERT(byte_offset >= 0); | 
| -    ASSERT(((byte_offset + (1 << scale)) >> scale) <= | 
| -               Smi::Value(array->ptr()->length_)); | 
| return array->ptr()->data() + byte_offset; | 
| } | 
| }; | 
| @@ -1826,9 +1824,8 @@ RawObject* Simulator::Call(const Code& code, | 
| { | 
| BYTECODE(WriteIntoDouble, A_D); | 
| const double value = bit_cast<double, RawObject*>(FP[rD]); | 
| -    RawDouble* box = RAW_CAST(Double, *SP--); | 
| +    RawDouble* box = RAW_CAST(Double, FP[rA]); | 
| box->ptr()->value_ = value; | 
| -    FP[rA] = box; | 
| DISPATCH(); | 
| } | 
|  | 
| @@ -2324,6 +2321,25 @@ RawObject* Simulator::Call(const Code& code, | 
| } | 
|  | 
| { | 
| +    BYTECODE(AllocateOpt, A_D); | 
| +    const uword tags = | 
| +        static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD)))); | 
| +    const intptr_t instance_size = RawObject::SizeTag::decode(tags); | 
| +    const uword start = thread->heap()->new_space()->TryAllocate(instance_size); | 
| +    if (LIKELY(start != 0)) { | 
| +      *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags; | 
| +      for (intptr_t current_offset = sizeof(RawInstance); | 
| +           current_offset < instance_size; | 
| +           current_offset += kWordSize) { | 
| +        *reinterpret_cast<RawObject**>(start + current_offset) = null_value; | 
| +      } | 
| +      FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag); | 
| +      pc += 2; | 
| +    } | 
| +    DISPATCH(); | 
| +  } | 
| + | 
| +  { | 
| BYTECODE(Allocate, A_D); | 
| SP[1] = 0;  // Space for the result. | 
| SP[2] = LOAD_CONSTANT(rD);  // Class object. | 
| @@ -2347,6 +2363,38 @@ RawObject* Simulator::Call(const Code& code, | 
| } | 
|  | 
| { | 
| +    BYTECODE(CreateArrayOpt, A_B_C); | 
| +    const intptr_t length = Smi::Value(RAW_CAST(Smi, FP[rB])); | 
| +    if (LIKELY(length <= Array::kMaxElements)) { | 
| +      const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1; | 
| +      const intptr_t instance_size = | 
| +          (fixed_size + length*kWordSize) & ~(kObjectAlignment - 1); | 
| +      const uword start = | 
| +          thread->heap()->new_space()->TryAllocate(instance_size); | 
| +      if (LIKELY(start != 0)) { | 
| +        const intptr_t cid = kArrayCid; | 
| +        uword tags = 0; | 
| +        if (LIKELY(instance_size < RawObject::SizeTag::kMaxSizeTag)) { | 
| +          tags = RawObject::SizeTag::update(instance_size, tags); | 
| +        } | 
| +        tags = RawObject::ClassIdTag::update(cid, tags); | 
| +        *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags; | 
| +        *reinterpret_cast<RawObject**>(start + Array::length_offset()) = FP[rB]; | 
| +        *reinterpret_cast<RawObject**>(start + Array::type_arguments_offset()) = | 
| +            FP[rC]; | 
| +        RawObject** data = | 
| +            reinterpret_cast<RawObject**>(start + Array::data_offset()); | 
| +        for (intptr_t i = 0; i < length; i++) { | 
| +          data[i] = null_value; | 
| +        } | 
| +        FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag); | 
| +        pc += 4; | 
| +      } | 
| +    } | 
| +    DISPATCH(); | 
| +  } | 
| + | 
| +  { | 
| BYTECODE(CreateArrayTOS, 0); | 
| SP[1] = SP[-0];  // Length. | 
| SP[2] = SP[-1];  // Type. | 
|  |