OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 |
11 // with the distribution. | 11 // with the distribution. |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 | 294 |
295 void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( | 295 void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( |
296 MacroAssembler* masm, Label* fail) { | 296 MacroAssembler* masm, Label* fail) { |
297 // ----------- S t a t e ------------- | 297 // ----------- S t a t e ------------- |
298 // -- eax : value | 298 // -- eax : value |
299 // -- ebx : target map | 299 // -- ebx : target map |
300 // -- ecx : key | 300 // -- ecx : key |
301 // -- edx : receiver | 301 // -- edx : receiver |
302 // -- esp[0] : return address | 302 // -- esp[0] : return address |
303 // ----------------------------------- | 303 // ----------------------------------- |
304 Label loop, entry, convert_hole, gc_required; | 304 Label loop, entry, convert_hole, gc_required, only_change_map; |
| 305 |
| 306 // Check for empty arrays, which only require a map transition and no changes |
| 307 // to the backing store. |
| 308 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
| 309 __ cmp(edi, Immediate(masm->isolate()->factory()->empty_fixed_array())); |
| 310 __ j(equal, &only_change_map); |
| 311 |
305 __ push(eax); | 312 __ push(eax); |
306 __ push(ebx); | 313 __ push(ebx); |
307 | 314 |
308 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); | |
309 __ mov(edi, FieldOperand(edi, FixedArray::kLengthOffset)); | 315 __ mov(edi, FieldOperand(edi, FixedArray::kLengthOffset)); |
310 | 316 |
311 // Allocate new FixedDoubleArray. | 317 // Allocate new FixedDoubleArray. |
312 // edx: receiver | 318 // edx: receiver |
313 // edi: length of source FixedArray (smi-tagged) | 319 // edi: length of source FixedArray (smi-tagged) |
314 __ lea(esi, Operand(edi, times_4, FixedDoubleArray::kHeaderSize)); | 320 __ lea(esi, Operand(edi, times_4, FixedDoubleArray::kHeaderSize)); |
315 __ AllocateInNewSpace(esi, eax, ebx, no_reg, &gc_required, TAG_OBJECT); | 321 __ AllocateInNewSpace(esi, eax, ebx, no_reg, &gc_required, TAG_OBJECT); |
316 | 322 |
317 // eax: destination FixedDoubleArray | 323 // eax: destination FixedDoubleArray |
318 // edi: number of elements | 324 // edi: number of elements |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 __ fld_d(Operand::StaticVariable(canonical_the_hole_nan_reference)); | 398 __ fld_d(Operand::StaticVariable(canonical_the_hole_nan_reference)); |
393 __ fstp_d(FieldOperand(eax, edi, times_4, FixedDoubleArray::kHeaderSize)); | 399 __ fstp_d(FieldOperand(eax, edi, times_4, FixedDoubleArray::kHeaderSize)); |
394 } | 400 } |
395 | 401 |
396 __ bind(&entry); | 402 __ bind(&entry); |
397 __ sub(edi, Immediate(Smi::FromInt(1))); | 403 __ sub(edi, Immediate(Smi::FromInt(1))); |
398 __ j(not_sign, &loop); | 404 __ j(not_sign, &loop); |
399 | 405 |
400 __ pop(ebx); | 406 __ pop(ebx); |
401 __ pop(eax); | 407 __ pop(eax); |
| 408 |
| 409 // Restore esi. |
| 410 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
| 411 |
| 412 __ bind(&only_change_map); |
402 // eax: value | 413 // eax: value |
403 // ebx: target map | 414 // ebx: target map |
404 // Set transitioned map. | 415 // Set transitioned map. |
405 __ mov(FieldOperand(edx, HeapObject::kMapOffset), ebx); | 416 __ mov(FieldOperand(edx, HeapObject::kMapOffset), ebx); |
406 __ RecordWriteField(edx, | 417 __ RecordWriteField(edx, |
407 HeapObject::kMapOffset, | 418 HeapObject::kMapOffset, |
408 ebx, | 419 ebx, |
409 edi, | 420 edi, |
410 kDontSaveFPRegs, | 421 kDontSaveFPRegs, |
411 EMIT_REMEMBERED_SET, | 422 OMIT_REMEMBERED_SET, |
412 OMIT_SMI_CHECK); | 423 OMIT_SMI_CHECK); |
413 // Restore esi. | |
414 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | |
415 } | 424 } |
416 | 425 |
417 | 426 |
418 void ElementsTransitionGenerator::GenerateDoubleToObject( | 427 void ElementsTransitionGenerator::GenerateDoubleToObject( |
419 MacroAssembler* masm, Label* fail) { | 428 MacroAssembler* masm, Label* fail) { |
420 // ----------- S t a t e ------------- | 429 // ----------- S t a t e ------------- |
421 // -- eax : value | 430 // -- eax : value |
422 // -- ebx : target map | 431 // -- ebx : target map |
423 // -- ecx : key | 432 // -- ecx : key |
424 // -- edx : receiver | 433 // -- edx : receiver |
425 // -- esp[0] : return address | 434 // -- esp[0] : return address |
426 // ----------------------------------- | 435 // ----------------------------------- |
427 Label loop, entry, convert_hole, gc_required; | 436 Label loop, entry, convert_hole, gc_required, only_change_map, success; |
| 437 |
| 438 // Check for empty arrays, which only require a map transition and no changes |
| 439 // to the backing store. |
| 440 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
| 441 __ cmp(edi, Immediate(masm->isolate()->factory()->empty_fixed_array())); |
| 442 __ j(equal, &only_change_map); |
| 443 |
428 __ push(eax); | 444 __ push(eax); |
429 __ push(edx); | 445 __ push(edx); |
430 __ push(ebx); | 446 __ push(ebx); |
431 | 447 |
432 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); | |
433 __ mov(ebx, FieldOperand(edi, FixedDoubleArray::kLengthOffset)); | 448 __ mov(ebx, FieldOperand(edi, FixedDoubleArray::kLengthOffset)); |
434 | 449 |
435 // Allocate new FixedArray. | 450 // Allocate new FixedArray. |
436 // ebx: length of source FixedDoubleArray (smi-tagged) | 451 // ebx: length of source FixedDoubleArray (smi-tagged) |
437 __ lea(edi, Operand(ebx, times_2, FixedArray::kHeaderSize)); | 452 __ lea(edi, Operand(ebx, times_2, FixedArray::kHeaderSize)); |
438 __ AllocateInNewSpace(edi, eax, esi, no_reg, &gc_required, TAG_OBJECT); | 453 __ AllocateInNewSpace(edi, eax, esi, no_reg, &gc_required, TAG_OBJECT); |
439 | 454 |
440 // eax: destination FixedArray | 455 // eax: destination FixedArray |
441 // ebx: number of elements | 456 // ebx: number of elements |
442 __ mov(FieldOperand(eax, HeapObject::kMapOffset), | 457 __ mov(FieldOperand(eax, HeapObject::kMapOffset), |
443 Immediate(masm->isolate()->factory()->fixed_array_map())); | 458 Immediate(masm->isolate()->factory()->fixed_array_map())); |
444 __ mov(FieldOperand(eax, FixedArray::kLengthOffset), ebx); | 459 __ mov(FieldOperand(eax, FixedArray::kLengthOffset), ebx); |
445 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); | 460 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
446 | 461 |
447 __ jmp(&entry); | 462 __ jmp(&entry); |
448 | 463 |
| 464 // ebx: target map |
| 465 // edx: receiver |
| 466 // Set transitioned map. |
| 467 __ bind(&only_change_map); |
| 468 __ mov(FieldOperand(edx, HeapObject::kMapOffset), ebx); |
| 469 __ RecordWriteField(edx, |
| 470 HeapObject::kMapOffset, |
| 471 ebx, |
| 472 edi, |
| 473 kDontSaveFPRegs, |
| 474 OMIT_REMEMBERED_SET, |
| 475 OMIT_SMI_CHECK); |
| 476 __ jmp(&success); |
| 477 |
449 // Call into runtime if GC is required. | 478 // Call into runtime if GC is required. |
450 __ bind(&gc_required); | 479 __ bind(&gc_required); |
451 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | 480 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
452 __ pop(ebx); | 481 __ pop(ebx); |
453 __ pop(edx); | 482 __ pop(edx); |
454 __ pop(eax); | 483 __ pop(eax); |
455 __ jmp(fail); | 484 __ jmp(fail); |
456 | 485 |
457 // Box doubles into heap numbers. | 486 // Box doubles into heap numbers. |
458 // edi: source FixedDoubleArray | 487 // edi: source FixedDoubleArray |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 __ pop(edx); | 529 __ pop(edx); |
501 // ebx: target map | 530 // ebx: target map |
502 // edx: receiver | 531 // edx: receiver |
503 // Set transitioned map. | 532 // Set transitioned map. |
504 __ mov(FieldOperand(edx, HeapObject::kMapOffset), ebx); | 533 __ mov(FieldOperand(edx, HeapObject::kMapOffset), ebx); |
505 __ RecordWriteField(edx, | 534 __ RecordWriteField(edx, |
506 HeapObject::kMapOffset, | 535 HeapObject::kMapOffset, |
507 ebx, | 536 ebx, |
508 edi, | 537 edi, |
509 kDontSaveFPRegs, | 538 kDontSaveFPRegs, |
510 EMIT_REMEMBERED_SET, | 539 OMIT_REMEMBERED_SET, |
511 OMIT_SMI_CHECK); | 540 OMIT_SMI_CHECK); |
512 // Replace receiver's backing store with newly created and filled FixedArray. | 541 // Replace receiver's backing store with newly created and filled FixedArray. |
513 __ mov(FieldOperand(edx, JSObject::kElementsOffset), eax); | 542 __ mov(FieldOperand(edx, JSObject::kElementsOffset), eax); |
514 __ RecordWriteField(edx, | 543 __ RecordWriteField(edx, |
515 JSObject::kElementsOffset, | 544 JSObject::kElementsOffset, |
516 eax, | 545 eax, |
517 edi, | 546 edi, |
518 kDontSaveFPRegs, | 547 kDontSaveFPRegs, |
519 EMIT_REMEMBERED_SET, | 548 EMIT_REMEMBERED_SET, |
520 OMIT_SMI_CHECK); | 549 OMIT_SMI_CHECK); |
521 | 550 |
522 // Restore registers. | 551 // Restore registers. |
523 __ pop(eax); | 552 __ pop(eax); |
524 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | 553 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
| 554 |
| 555 __ bind(&success); |
525 } | 556 } |
526 | 557 |
527 | 558 |
528 void StringCharLoadGenerator::Generate(MacroAssembler* masm, | 559 void StringCharLoadGenerator::Generate(MacroAssembler* masm, |
529 Factory* factory, | 560 Factory* factory, |
530 Register string, | 561 Register string, |
531 Register index, | 562 Register index, |
532 Register result, | 563 Register result, |
533 Label* call_runtime) { | 564 Label* call_runtime) { |
534 // Fetch the instance type of the receiver into result register. | 565 // Fetch the instance type of the receiver into result register. |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 times_1, | 657 times_1, |
627 SeqAsciiString::kHeaderSize)); | 658 SeqAsciiString::kHeaderSize)); |
628 __ bind(&done); | 659 __ bind(&done); |
629 } | 660 } |
630 | 661 |
631 #undef __ | 662 #undef __ |
632 | 663 |
633 } } // namespace v8::internal | 664 } } // namespace v8::internal |
634 | 665 |
635 #endif // V8_TARGET_ARCH_IA32 | 666 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |