| 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 7274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7285 __ bind(&slowcase); | 7285 __ bind(&slowcase); |
| 7286 __ CallRuntime(Runtime::kRegExpConstructResult, 3); | 7286 __ CallRuntime(Runtime::kRegExpConstructResult, 3); |
| 7287 | 7287 |
| 7288 __ bind(&done); | 7288 __ bind(&done); |
| 7289 } | 7289 } |
| 7290 frame_->Forget(3); | 7290 frame_->Forget(3); |
| 7291 frame_->Push(eax); | 7291 frame_->Push(eax); |
| 7292 } | 7292 } |
| 7293 | 7293 |
| 7294 | 7294 |
| 7295 void CodeGenerator::GenerateRegExpCloneResult(ZoneList<Expression*>* args) { | |
| 7296 ASSERT_EQ(1, args->length()); | |
| 7297 | |
| 7298 Load(args->at(0)); | |
| 7299 Result object_result = frame_->Pop(); | |
| 7300 object_result.ToRegister(eax); | |
| 7301 object_result.Unuse(); | |
| 7302 { | |
| 7303 VirtualFrame::SpilledScope spilled_scope; | |
| 7304 | |
| 7305 Label done; | |
| 7306 | |
| 7307 __ test(eax, Immediate(kSmiTagMask)); | |
| 7308 __ j(zero, &done); | |
| 7309 | |
| 7310 // Load JSRegExpResult map into edx. | |
| 7311 // Arguments to this function should be results of calling RegExp exec, | |
| 7312 // which is either an unmodified JSRegExpResult or null. Anything not having | |
| 7313 // the unmodified JSRegExpResult map is returned unmodified. | |
| 7314 // This also ensures that elements are fast. | |
| 7315 __ mov(edx, ContextOperand(esi, Context::GLOBAL_INDEX)); | |
| 7316 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalContextOffset)); | |
| 7317 __ mov(edx, ContextOperand(edx, Context::REGEXP_RESULT_MAP_INDEX)); | |
| 7318 __ cmp(edx, FieldOperand(eax, HeapObject::kMapOffset)); | |
| 7319 __ j(not_equal, &done); | |
| 7320 | |
| 7321 if (FLAG_debug_code) { | |
| 7322 // Check that object really has empty properties array, as the map | |
| 7323 // should guarantee. | |
| 7324 __ cmp(FieldOperand(eax, JSObject::kPropertiesOffset), | |
| 7325 Immediate(Factory::empty_fixed_array())); | |
| 7326 __ Check(equal, "JSRegExpResult: default map but non-empty properties."); | |
| 7327 } | |
| 7328 | |
| 7329 DeferredAllocateInNewSpace* allocate_fallback = | |
| 7330 new DeferredAllocateInNewSpace(JSRegExpResult::kSize, | |
| 7331 ebx, | |
| 7332 edx.bit() | eax.bit()); | |
| 7333 | |
| 7334 // All set, copy the contents to a new object. | |
| 7335 __ AllocateInNewSpace(JSRegExpResult::kSize, | |
| 7336 ebx, | |
| 7337 ecx, | |
| 7338 no_reg, | |
| 7339 allocate_fallback->entry_label(), | |
| 7340 TAG_OBJECT); | |
| 7341 __ bind(allocate_fallback->exit_label()); | |
| 7342 | |
| 7343 // Copy all fields from eax to ebx. | |
| 7344 STATIC_ASSERT(JSRegExpResult::kSize % (2 * kPointerSize) == 0); | |
| 7345 // There is an even number of fields, so unroll the loop once | |
| 7346 // for efficiency. | |
| 7347 for (int i = 0; i < JSRegExpResult::kSize; i += 2 * kPointerSize) { | |
| 7348 STATIC_ASSERT(JSObject::kMapOffset % (2 * kPointerSize) == 0); | |
| 7349 if (i != JSObject::kMapOffset) { | |
| 7350 // The map was already loaded into edx. | |
| 7351 __ mov(edx, FieldOperand(eax, i)); | |
| 7352 } | |
| 7353 __ mov(ecx, FieldOperand(eax, i + kPointerSize)); | |
| 7354 | |
| 7355 STATIC_ASSERT(JSObject::kElementsOffset % (2 * kPointerSize) == 0); | |
| 7356 if (i == JSObject::kElementsOffset) { | |
| 7357 // If the elements array isn't empty, make it copy-on-write | |
| 7358 // before copying it. | |
| 7359 Label empty; | |
| 7360 __ cmp(Operand(edx), Immediate(Factory::empty_fixed_array())); | |
| 7361 __ j(equal, &empty); | |
| 7362 __ mov(FieldOperand(edx, HeapObject::kMapOffset), | |
| 7363 Immediate(Factory::fixed_cow_array_map())); | |
| 7364 __ bind(&empty); | |
| 7365 } | |
| 7366 __ mov(FieldOperand(ebx, i), edx); | |
| 7367 __ mov(FieldOperand(ebx, i + kPointerSize), ecx); | |
| 7368 } | |
| 7369 __ mov(eax, ebx); | |
| 7370 | |
| 7371 __ bind(&done); | |
| 7372 } | |
| 7373 frame_->Push(eax); | |
| 7374 } | |
| 7375 | |
| 7376 | |
| 7377 class DeferredSearchCache: public DeferredCode { | 7295 class DeferredSearchCache: public DeferredCode { |
| 7378 public: | 7296 public: |
| 7379 DeferredSearchCache(Register dst, Register cache, Register key) | 7297 DeferredSearchCache(Register dst, Register cache, Register key) |
| 7380 : dst_(dst), cache_(cache), key_(key) { | 7298 : dst_(dst), cache_(cache), key_(key) { |
| 7381 set_comment("[ DeferredSearchCache"); | 7299 set_comment("[ DeferredSearchCache"); |
| 7382 } | 7300 } |
| 7383 | 7301 |
| 7384 virtual void Generate(); | 7302 virtual void Generate(); |
| 7385 | 7303 |
| 7386 private: | 7304 private: |
| (...skipping 2764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10151 masm.GetCode(&desc); | 10069 masm.GetCode(&desc); |
| 10152 // Call the function from C++. | 10070 // Call the function from C++. |
| 10153 return FUNCTION_CAST<MemCopyFunction>(buffer); | 10071 return FUNCTION_CAST<MemCopyFunction>(buffer); |
| 10154 } | 10072 } |
| 10155 | 10073 |
| 10156 #undef __ | 10074 #undef __ |
| 10157 | 10075 |
| 10158 } } // namespace v8::internal | 10076 } } // namespace v8::internal |
| 10159 | 10077 |
| 10160 #endif // V8_TARGET_ARCH_IA32 | 10078 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |