| OLD | NEW | 
|---|
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 5478 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5489     __ bind(&slowcase); | 5489     __ bind(&slowcase); | 
| 5490     __ CallRuntime(Runtime::kRegExpConstructResult, 3); | 5490     __ CallRuntime(Runtime::kRegExpConstructResult, 3); | 
| 5491 | 5491 | 
| 5492     __ bind(&done); | 5492     __ bind(&done); | 
| 5493   } | 5493   } | 
| 5494   frame_->Forget(3); | 5494   frame_->Forget(3); | 
| 5495   frame_->EmitPush(r0); | 5495   frame_->EmitPush(r0); | 
| 5496 } | 5496 } | 
| 5497 | 5497 | 
| 5498 | 5498 | 
| 5499 void CodeGenerator::GenerateRegExpCloneResult(ZoneList<Expression*>* args) { |  | 
| 5500   ASSERT_EQ(1, args->length()); |  | 
| 5501 |  | 
| 5502   Load(args->at(0)); |  | 
| 5503   frame_->PopToR0(); |  | 
| 5504   { |  | 
| 5505     VirtualFrame::SpilledScope spilled_scope(frame_); |  | 
| 5506 |  | 
| 5507     Label done; |  | 
| 5508     Label call_runtime; |  | 
| 5509     __ BranchOnSmi(r0, &done); |  | 
| 5510 |  | 
| 5511     // Load JSRegExp map into r1. Check that argument object has this map. |  | 
| 5512     // Arguments to this function should be results of calling RegExp exec, |  | 
| 5513     // which is either an unmodified JSRegExpResult or null. Anything not having |  | 
| 5514     // the unmodified JSRegExpResult map is returned unmodified. |  | 
| 5515     // This also ensures that elements are fast. |  | 
| 5516 |  | 
| 5517     __ ldr(r1, ContextOperand(cp, Context::GLOBAL_INDEX)); |  | 
| 5518     __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalContextOffset)); |  | 
| 5519     __ ldr(r1, ContextOperand(r1, Context::REGEXP_RESULT_MAP_INDEX)); |  | 
| 5520     __ ldr(ip, FieldMemOperand(r0, HeapObject::kMapOffset)); |  | 
| 5521     __ cmp(r1, Operand(ip)); |  | 
| 5522     __ b(ne, &done); |  | 
| 5523 |  | 
| 5524     if (FLAG_debug_code) { |  | 
| 5525       __ LoadRoot(r2, Heap::kEmptyFixedArrayRootIndex); |  | 
| 5526       __ ldr(ip, FieldMemOperand(r0, JSObject::kPropertiesOffset)); |  | 
| 5527       __ cmp(ip, r2); |  | 
| 5528       __ Check(eq, "JSRegExpResult: default map but non-empty properties."); |  | 
| 5529     } |  | 
| 5530 |  | 
| 5531     // All set, copy the contents to a new object. |  | 
| 5532     __ AllocateInNewSpace(JSRegExpResult::kSize, |  | 
| 5533                           r2, |  | 
| 5534                           r3, |  | 
| 5535                           r4, |  | 
| 5536                           &call_runtime, |  | 
| 5537                           NO_ALLOCATION_FLAGS); |  | 
| 5538     // Store RegExpResult map as map of allocated object. |  | 
| 5539     ASSERT(JSRegExpResult::kSize == 6 * kPointerSize); |  | 
| 5540     // Copy all fields (map is already in r1) from (untagged) r0 to r2. |  | 
| 5541     // Change map of elements array (ends up in r4) to be a FixedCOWArray. |  | 
| 5542     __ bic(r0, r0, Operand(kHeapObjectTagMask)); |  | 
| 5543     __ ldm(ib, r0, r3.bit() | r4.bit() | r5.bit() | r6.bit() | r7.bit()); |  | 
| 5544     __ stm(ia, r2, |  | 
| 5545            r1.bit() | r3.bit() | r4.bit() | r5.bit() | r6.bit() | r7.bit()); |  | 
| 5546     ASSERT(JSRegExp::kElementsOffset == 2 * kPointerSize); |  | 
| 5547     // Check whether elements array is empty fixed array, and otherwise make |  | 
| 5548     // it copy-on-write (it never should be empty unless someone is messing |  | 
| 5549     // with the arguments to the runtime function). |  | 
| 5550     __ LoadRoot(ip, Heap::kEmptyFixedArrayRootIndex); |  | 
| 5551     __ add(r0, r2, Operand(kHeapObjectTag));  // Tag result and move it to r0. |  | 
| 5552     __ cmp(r4, ip); |  | 
| 5553     __ b(eq, &done); |  | 
| 5554     __ LoadRoot(ip, Heap::kFixedCOWArrayMapRootIndex); |  | 
| 5555     __ str(ip, FieldMemOperand(r4, HeapObject::kMapOffset)); |  | 
| 5556     __ b(&done); |  | 
| 5557     __ bind(&call_runtime); |  | 
| 5558     __ push(r0); |  | 
| 5559     __ CallRuntime(Runtime::kRegExpCloneResult, 1); |  | 
| 5560     __ bind(&done); |  | 
| 5561   } |  | 
| 5562   frame_->EmitPush(r0); |  | 
| 5563 } |  | 
| 5564 |  | 
| 5565 |  | 
| 5566 class DeferredSearchCache: public DeferredCode { | 5499 class DeferredSearchCache: public DeferredCode { | 
| 5567  public: | 5500  public: | 
| 5568   DeferredSearchCache(Register dst, Register cache, Register key) | 5501   DeferredSearchCache(Register dst, Register cache, Register key) | 
| 5569       : dst_(dst), cache_(cache), key_(key) { | 5502       : dst_(dst), cache_(cache), key_(key) { | 
| 5570     set_comment("[ DeferredSearchCache"); | 5503     set_comment("[ DeferredSearchCache"); | 
| 5571   } | 5504   } | 
| 5572 | 5505 | 
| 5573   virtual void Generate(); | 5506   virtual void Generate(); | 
| 5574 | 5507 | 
| 5575  private: | 5508  private: | 
| (...skipping 1747 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 7323                BinaryOpIC::GetName(runtime_operands_type_)); | 7256                BinaryOpIC::GetName(runtime_operands_type_)); | 
| 7324   return name_; | 7257   return name_; | 
| 7325 } | 7258 } | 
| 7326 | 7259 | 
| 7327 | 7260 | 
| 7328 #undef __ | 7261 #undef __ | 
| 7329 | 7262 | 
| 7330 } }  // namespace v8::internal | 7263 } }  // namespace v8::internal | 
| 7331 | 7264 | 
| 7332 #endif  // V8_TARGET_ARCH_ARM | 7265 #endif  // V8_TARGET_ARCH_ARM | 
| OLD | NEW | 
|---|