| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if V8_TARGET_ARCH_X87 | 5 #if V8_TARGET_ARCH_X87 |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/base/division-by-constant.h" | 8 #include "src/base/division-by-constant.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 1518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1529 NO_ALLOCATION_FLAGS); | 1529 NO_ALLOCATION_FLAGS); |
| 1530 | 1530 |
| 1531 Handle<Map> map = mode == MUTABLE | 1531 Handle<Map> map = mode == MUTABLE |
| 1532 ? isolate()->factory()->mutable_heap_number_map() | 1532 ? isolate()->factory()->mutable_heap_number_map() |
| 1533 : isolate()->factory()->heap_number_map(); | 1533 : isolate()->factory()->heap_number_map(); |
| 1534 | 1534 |
| 1535 // Set the map. | 1535 // Set the map. |
| 1536 mov(FieldOperand(result, HeapObject::kMapOffset), Immediate(map)); | 1536 mov(FieldOperand(result, HeapObject::kMapOffset), Immediate(map)); |
| 1537 } | 1537 } |
| 1538 | 1538 |
| 1539 | |
| 1540 void MacroAssembler::AllocateTwoByteString(Register result, | |
| 1541 Register length, | |
| 1542 Register scratch1, | |
| 1543 Register scratch2, | |
| 1544 Register scratch3, | |
| 1545 Label* gc_required) { | |
| 1546 // Calculate the number of bytes needed for the characters in the string while | |
| 1547 // observing object alignment. | |
| 1548 DCHECK((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0); | |
| 1549 DCHECK(kShortSize == 2); | |
| 1550 // scratch1 = length * 2 + kObjectAlignmentMask. | |
| 1551 lea(scratch1, Operand(length, length, times_1, kObjectAlignmentMask)); | |
| 1552 and_(scratch1, Immediate(~kObjectAlignmentMask)); | |
| 1553 | |
| 1554 // Allocate two byte string in new space. | |
| 1555 Allocate(SeqTwoByteString::kHeaderSize, times_1, scratch1, | |
| 1556 REGISTER_VALUE_IS_INT32, result, scratch2, scratch3, gc_required, | |
| 1557 NO_ALLOCATION_FLAGS); | |
| 1558 | |
| 1559 // Set the map, length and hash field. | |
| 1560 mov(FieldOperand(result, HeapObject::kMapOffset), | |
| 1561 Immediate(isolate()->factory()->string_map())); | |
| 1562 mov(scratch1, length); | |
| 1563 SmiTag(scratch1); | |
| 1564 mov(FieldOperand(result, String::kLengthOffset), scratch1); | |
| 1565 mov(FieldOperand(result, String::kHashFieldOffset), | |
| 1566 Immediate(String::kEmptyHashField)); | |
| 1567 } | |
| 1568 | |
| 1569 | |
| 1570 void MacroAssembler::AllocateOneByteString(Register result, Register length, | |
| 1571 Register scratch1, Register scratch2, | |
| 1572 Register scratch3, | |
| 1573 Label* gc_required) { | |
| 1574 // Calculate the number of bytes needed for the characters in the string while | |
| 1575 // observing object alignment. | |
| 1576 DCHECK((SeqOneByteString::kHeaderSize & kObjectAlignmentMask) == 0); | |
| 1577 mov(scratch1, length); | |
| 1578 DCHECK(kCharSize == 1); | |
| 1579 add(scratch1, Immediate(kObjectAlignmentMask)); | |
| 1580 and_(scratch1, Immediate(~kObjectAlignmentMask)); | |
| 1581 | |
| 1582 // Allocate one-byte string in new space. | |
| 1583 Allocate(SeqOneByteString::kHeaderSize, times_1, scratch1, | |
| 1584 REGISTER_VALUE_IS_INT32, result, scratch2, scratch3, gc_required, | |
| 1585 NO_ALLOCATION_FLAGS); | |
| 1586 | |
| 1587 // Set the map, length and hash field. | |
| 1588 mov(FieldOperand(result, HeapObject::kMapOffset), | |
| 1589 Immediate(isolate()->factory()->one_byte_string_map())); | |
| 1590 mov(scratch1, length); | |
| 1591 SmiTag(scratch1); | |
| 1592 mov(FieldOperand(result, String::kLengthOffset), scratch1); | |
| 1593 mov(FieldOperand(result, String::kHashFieldOffset), | |
| 1594 Immediate(String::kEmptyHashField)); | |
| 1595 } | |
| 1596 | |
| 1597 | |
| 1598 void MacroAssembler::AllocateOneByteString(Register result, int length, | |
| 1599 Register scratch1, Register scratch2, | |
| 1600 Label* gc_required) { | |
| 1601 DCHECK(length > 0); | |
| 1602 | |
| 1603 // Allocate one-byte string in new space. | |
| 1604 Allocate(SeqOneByteString::SizeFor(length), result, scratch1, scratch2, | |
| 1605 gc_required, NO_ALLOCATION_FLAGS); | |
| 1606 | |
| 1607 // Set the map, length and hash field. | |
| 1608 mov(FieldOperand(result, HeapObject::kMapOffset), | |
| 1609 Immediate(isolate()->factory()->one_byte_string_map())); | |
| 1610 mov(FieldOperand(result, String::kLengthOffset), | |
| 1611 Immediate(Smi::FromInt(length))); | |
| 1612 mov(FieldOperand(result, String::kHashFieldOffset), | |
| 1613 Immediate(String::kEmptyHashField)); | |
| 1614 } | |
| 1615 | |
| 1616 | |
| 1617 void MacroAssembler::AllocateTwoByteConsString(Register result, | |
| 1618 Register scratch1, | |
| 1619 Register scratch2, | |
| 1620 Label* gc_required) { | |
| 1621 // Allocate heap number in new space. | |
| 1622 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, | |
| 1623 NO_ALLOCATION_FLAGS); | |
| 1624 | |
| 1625 // Set the map. The other fields are left uninitialized. | |
| 1626 mov(FieldOperand(result, HeapObject::kMapOffset), | |
| 1627 Immediate(isolate()->factory()->cons_string_map())); | |
| 1628 } | |
| 1629 | |
| 1630 | |
| 1631 void MacroAssembler::AllocateOneByteConsString(Register result, | |
| 1632 Register scratch1, | |
| 1633 Register scratch2, | |
| 1634 Label* gc_required) { | |
| 1635 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, | |
| 1636 NO_ALLOCATION_FLAGS); | |
| 1637 | |
| 1638 // Set the map. The other fields are left uninitialized. | |
| 1639 mov(FieldOperand(result, HeapObject::kMapOffset), | |
| 1640 Immediate(isolate()->factory()->cons_one_byte_string_map())); | |
| 1641 } | |
| 1642 | |
| 1643 | |
| 1644 void MacroAssembler::AllocateTwoByteSlicedString(Register result, | |
| 1645 Register scratch1, | |
| 1646 Register scratch2, | |
| 1647 Label* gc_required) { | |
| 1648 // Allocate heap number in new space. | |
| 1649 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, | |
| 1650 NO_ALLOCATION_FLAGS); | |
| 1651 | |
| 1652 // Set the map. The other fields are left uninitialized. | |
| 1653 mov(FieldOperand(result, HeapObject::kMapOffset), | |
| 1654 Immediate(isolate()->factory()->sliced_string_map())); | |
| 1655 } | |
| 1656 | |
| 1657 | |
| 1658 void MacroAssembler::AllocateOneByteSlicedString(Register result, | |
| 1659 Register scratch1, | |
| 1660 Register scratch2, | |
| 1661 Label* gc_required) { | |
| 1662 // Allocate heap number in new space. | |
| 1663 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, | |
| 1664 NO_ALLOCATION_FLAGS); | |
| 1665 | |
| 1666 // Set the map. The other fields are left uninitialized. | |
| 1667 mov(FieldOperand(result, HeapObject::kMapOffset), | |
| 1668 Immediate(isolate()->factory()->sliced_one_byte_string_map())); | |
| 1669 } | |
| 1670 | |
| 1671 | |
| 1672 void MacroAssembler::AllocateJSValue(Register result, Register constructor, | 1539 void MacroAssembler::AllocateJSValue(Register result, Register constructor, |
| 1673 Register value, Register scratch, | 1540 Register value, Register scratch, |
| 1674 Label* gc_required) { | 1541 Label* gc_required) { |
| 1675 DCHECK(!result.is(constructor)); | 1542 DCHECK(!result.is(constructor)); |
| 1676 DCHECK(!result.is(scratch)); | 1543 DCHECK(!result.is(scratch)); |
| 1677 DCHECK(!result.is(value)); | 1544 DCHECK(!result.is(value)); |
| 1678 | 1545 |
| 1679 // Allocate JSValue in new space. | 1546 // Allocate JSValue in new space. |
| 1680 Allocate(JSValue::kSize, result, scratch, no_reg, gc_required, | 1547 Allocate(JSValue::kSize, result, scratch, no_reg, gc_required, |
| 1681 NO_ALLOCATION_FLAGS); | 1548 NO_ALLOCATION_FLAGS); |
| (...skipping 836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2518 int accessor_index, | 2385 int accessor_index, |
| 2519 AccessorComponent accessor) { | 2386 AccessorComponent accessor) { |
| 2520 mov(dst, FieldOperand(holder, HeapObject::kMapOffset)); | 2387 mov(dst, FieldOperand(holder, HeapObject::kMapOffset)); |
| 2521 LoadInstanceDescriptors(dst, dst); | 2388 LoadInstanceDescriptors(dst, dst); |
| 2522 mov(dst, FieldOperand(dst, DescriptorArray::GetValueOffset(accessor_index))); | 2389 mov(dst, FieldOperand(dst, DescriptorArray::GetValueOffset(accessor_index))); |
| 2523 int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset | 2390 int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset |
| 2524 : AccessorPair::kSetterOffset; | 2391 : AccessorPair::kSetterOffset; |
| 2525 mov(dst, FieldOperand(dst, offset)); | 2392 mov(dst, FieldOperand(dst, offset)); |
| 2526 } | 2393 } |
| 2527 | 2394 |
| 2528 | |
| 2529 void MacroAssembler::JumpIfInstanceTypeIsNotSequentialOneByte( | |
| 2530 Register instance_type, Register scratch, Label* failure) { | |
| 2531 if (!scratch.is(instance_type)) { | |
| 2532 mov(scratch, instance_type); | |
| 2533 } | |
| 2534 and_(scratch, | |
| 2535 kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask); | |
| 2536 cmp(scratch, kStringTag | kSeqStringTag | kOneByteStringTag); | |
| 2537 j(not_equal, failure); | |
| 2538 } | |
| 2539 | |
| 2540 | |
| 2541 void MacroAssembler::JumpIfNotBothSequentialOneByteStrings(Register object1, | 2395 void MacroAssembler::JumpIfNotBothSequentialOneByteStrings(Register object1, |
| 2542 Register object2, | 2396 Register object2, |
| 2543 Register scratch1, | 2397 Register scratch1, |
| 2544 Register scratch2, | 2398 Register scratch2, |
| 2545 Label* failure) { | 2399 Label* failure) { |
| 2546 // Check that both objects are not smis. | 2400 // Check that both objects are not smis. |
| 2547 STATIC_ASSERT(kSmiTag == 0); | 2401 STATIC_ASSERT(kSmiTag == 0); |
| 2548 mov(scratch1, object1); | 2402 mov(scratch1, object1); |
| 2549 and_(scratch1, object2); | 2403 and_(scratch1, object2); |
| 2550 JumpIfSmi(scratch1, failure); | 2404 JumpIfSmi(scratch1, failure); |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2942 mov(eax, dividend); | 2796 mov(eax, dividend); |
| 2943 shr(eax, 31); | 2797 shr(eax, 31); |
| 2944 add(edx, eax); | 2798 add(edx, eax); |
| 2945 } | 2799 } |
| 2946 | 2800 |
| 2947 | 2801 |
| 2948 } // namespace internal | 2802 } // namespace internal |
| 2949 } // namespace v8 | 2803 } // namespace v8 |
| 2950 | 2804 |
| 2951 #endif // V8_TARGET_ARCH_X87 | 2805 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |