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 #include "src/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 1568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1579 | 1579 |
1580 assembler->Bind(&if_valueiszero); | 1580 assembler->Bind(&if_valueiszero); |
1581 assembler->Return(assembler->BooleanConstant(false)); | 1581 assembler->Return(assembler->BooleanConstant(false)); |
1582 | 1582 |
1583 assembler->Bind(&if_valueisnotzero); | 1583 assembler->Bind(&if_valueisnotzero); |
1584 assembler->Return(assembler->BooleanConstant(true)); | 1584 assembler->Return(assembler->BooleanConstant(true)); |
1585 } | 1585 } |
1586 | 1586 |
1587 assembler->Bind(&if_valueisnotsmi); | 1587 assembler->Bind(&if_valueisnotsmi); |
1588 { | 1588 { |
1589 Label if_valueisstring(assembler), if_valueisheapnumber(assembler), | 1589 Label if_valueisstring(assembler), if_valueisnotstring(assembler), |
1590 if_valueisoddball(assembler), if_valueisother(assembler); | 1590 if_valueisheapnumber(assembler), if_valueisoddball(assembler), |
1591 if_valueisother(assembler); | |
1591 | 1592 |
1592 // The {value} is a HeapObject, load its map. | 1593 // The {value} is a HeapObject, load its map. |
1593 Node* value_map = assembler->LoadObjectField(value, HeapObject::kMapOffset); | 1594 Node* value_map = assembler->LoadObjectField(value, HeapObject::kMapOffset); |
1594 | 1595 |
1595 // Load the {value}s instance type. | 1596 // Load the {value}s instance type. |
1596 Node* value_instancetype = assembler->Load( | 1597 Node* value_instancetype = assembler->Load( |
1597 MachineType::Uint8(), value_map, | 1598 MachineType::Uint8(), value_map, |
1598 assembler->IntPtrConstant(Map::kInstanceTypeOffset - kHeapObjectTag)); | 1599 assembler->IntPtrConstant(Map::kInstanceTypeOffset - kHeapObjectTag)); |
1599 | 1600 |
1600 // Dispatch based on the instance type; we distinguish all String instance | 1601 // Dispatch based on the instance type; we distinguish all String instance |
1601 // types, the HeapNumber type and the Oddball type. | 1602 // types, the HeapNumber type and the Oddball type. |
1602 size_t const kNumCases = FIRST_NONSTRING_TYPE + 2; | 1603 assembler->Branch( |
1604 assembler->Int32LessThan( | |
1605 value_instancetype, assembler->Int32Constant(FIRST_NONSTRING_TYPE)), | |
1606 &if_valueisstring, &if_valueisnotstring); | |
1607 assembler->Bind(&if_valueisnotstring); | |
1608 size_t const kNumCases = 2; | |
1603 Label* case_labels[kNumCases]; | 1609 Label* case_labels[kNumCases]; |
1604 int32_t case_values[kNumCases]; | 1610 int32_t case_values[kNumCases]; |
1605 for (int32_t i = 0; i < FIRST_NONSTRING_TYPE; ++i) { | 1611 case_labels[0] = &if_valueisheapnumber; |
1606 case_labels[i] = new Label(assembler); | 1612 case_values[0] = HEAP_NUMBER_TYPE; |
1607 case_values[i] = i; | 1613 case_labels[1] = &if_valueisoddball; |
1608 } | 1614 case_values[1] = ODDBALL_TYPE; |
1609 case_labels[FIRST_NONSTRING_TYPE + 0] = &if_valueisheapnumber; | |
1610 case_values[FIRST_NONSTRING_TYPE + 0] = HEAP_NUMBER_TYPE; | |
1611 case_labels[FIRST_NONSTRING_TYPE + 1] = &if_valueisoddball; | |
1612 case_values[FIRST_NONSTRING_TYPE + 1] = ODDBALL_TYPE; | |
1613 assembler->Switch(value_instancetype, &if_valueisother, case_values, | 1615 assembler->Switch(value_instancetype, &if_valueisother, case_values, |
1614 case_labels, arraysize(case_values)); | 1616 case_labels, arraysize(case_values)); |
1615 for (int32_t i = 0; i < FIRST_NONSTRING_TYPE; ++i) { | |
1616 assembler->Bind(case_labels[i]); | |
1617 assembler->Goto(&if_valueisstring); | |
1618 delete case_labels[i]; | |
1619 } | |
1620 | 1617 |
1621 assembler->Bind(&if_valueisstring); | 1618 assembler->Bind(&if_valueisstring); |
1622 { | 1619 { |
1623 // Load the string length field of the {value}. | 1620 // Load the string length field of the {value}. |
1624 Node* value_length = | 1621 Node* value_length = |
1625 assembler->LoadObjectField(value, String::kLengthOffset); | 1622 assembler->LoadObjectField(value, String::kLengthOffset); |
1626 | 1623 |
1627 // Check if the {value} is the empty string. | 1624 // Check if the {value} is the empty string. |
1628 Label if_valueisempty(assembler), if_valueisnotempty(assembler); | 1625 Label if_valueisempty(assembler), if_valueisnotempty(assembler); |
1629 assembler->Branch( | 1626 assembler->Branch( |
1630 assembler->SmiEqual(value_length, assembler->SmiConstant(0)), | 1627 assembler->SmiEqual(value_length, assembler->SmiConstant(0)), |
1631 &if_valueisempty, &if_valueisnotempty); | 1628 &if_valueisempty, &if_valueisnotempty); |
1632 | 1629 |
1633 assembler->Bind(&if_valueisempty); | 1630 assembler->Bind(&if_valueisempty); |
1634 assembler->Return(assembler->BooleanConstant(false)); | 1631 assembler->Return(assembler->BooleanConstant(false)); |
Benedikt Meurer
2016/04/21 18:04:13
You could even further reduce code size by having
| |
1635 | 1632 |
1636 assembler->Bind(&if_valueisnotempty); | 1633 assembler->Bind(&if_valueisnotempty); |
1637 assembler->Return(assembler->BooleanConstant(true)); | 1634 assembler->Return(assembler->BooleanConstant(true)); |
1638 } | 1635 } |
1639 | 1636 |
1640 assembler->Bind(&if_valueisheapnumber); | 1637 assembler->Bind(&if_valueisheapnumber); |
1641 { | 1638 { |
1642 Node* value_value = assembler->Load( | 1639 Node* value_value = assembler->Load( |
1643 MachineType::Float64(), value, | 1640 MachineType::Float64(), value, |
1644 assembler->IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag)); | 1641 assembler->IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag)); |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2126 if (type->Is(Type::UntaggedPointer())) { | 2123 if (type->Is(Type::UntaggedPointer())) { |
2127 return Representation::External(); | 2124 return Representation::External(); |
2128 } | 2125 } |
2129 | 2126 |
2130 DCHECK(!type->Is(Type::Untagged())); | 2127 DCHECK(!type->Is(Type::Untagged())); |
2131 return Representation::Tagged(); | 2128 return Representation::Tagged(); |
2132 } | 2129 } |
2133 | 2130 |
2134 } // namespace internal | 2131 } // namespace internal |
2135 } // namespace v8 | 2132 } // namespace v8 |
OLD | NEW |