Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Side by Side Diff: src/code-stubs.cc

Issue 1765883002: [compiler] Reduce the code size of the ToBoolean stub. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698