Chromium Code Reviews| 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 |