Index: src/code-stub-assembler.cc |
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
index 2579b38cf5e18885eefc5010bedd4b0973805788..8a8e3160f7659e01029c48f0323c439b5b03e22b 100644 |
--- a/src/code-stub-assembler.cc |
+++ b/src/code-stub-assembler.cc |
@@ -438,45 +438,6 @@ Node* CodeStubAssembler::SmiToFloat64(Node* value) { |
return ChangeInt32ToFloat64(SmiToWord32(value)); |
} |
-Node* CodeStubAssembler::SmiAdd(Node* a, Node* b) { |
- return BitcastWordToTaggedSigned( |
- IntPtrAdd(BitcastTaggedToWord(a), BitcastTaggedToWord(b))); |
-} |
- |
-Node* CodeStubAssembler::SmiSub(Node* a, Node* b) { |
- return BitcastWordToTaggedSigned( |
- IntPtrSub(BitcastTaggedToWord(a), BitcastTaggedToWord(b))); |
-} |
- |
-Node* CodeStubAssembler::SmiEqual(Node* a, Node* b) { |
- return WordEqual(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); |
-} |
- |
-Node* CodeStubAssembler::SmiAbove(Node* a, Node* b) { |
- return UintPtrGreaterThan(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); |
-} |
- |
-Node* CodeStubAssembler::SmiAboveOrEqual(Node* a, Node* b) { |
- return UintPtrGreaterThanOrEqual(BitcastTaggedToWord(a), |
- BitcastTaggedToWord(b)); |
-} |
- |
-Node* CodeStubAssembler::SmiBelow(Node* a, Node* b) { |
- return UintPtrLessThan(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); |
-} |
- |
-Node* CodeStubAssembler::SmiLessThan(Node* a, Node* b) { |
- return IntPtrLessThan(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); |
-} |
- |
-Node* CodeStubAssembler::SmiLessThanOrEqual(Node* a, Node* b) { |
- return IntPtrLessThanOrEqual(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); |
-} |
- |
-Node* CodeStubAssembler::SmiGreaterThan(Node* a, Node* b) { |
- return IntPtrGreaterThan(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); |
-} |
- |
Node* CodeStubAssembler::SmiMax(Node* a, Node* b) { |
return SelectTaggedConstant(SmiLessThan(a, b), b, a); |
} |
@@ -1783,8 +1744,10 @@ Node* CodeStubAssembler::NewConsString(Node* context, Node* length, Node* left, |
Node* right_instance_type = LoadInstanceType(right); |
// Compute intersection and difference of instance types. |
- Node* anded_instance_types = WordAnd(left_instance_type, right_instance_type); |
- Node* xored_instance_types = WordXor(left_instance_type, right_instance_type); |
+ Node* anded_instance_types = |
+ Word32And(left_instance_type, right_instance_type); |
+ Node* xored_instance_types = |
+ Word32Xor(left_instance_type, right_instance_type); |
// We create a one-byte cons string if |
// 1. both strings are one-byte, or |
@@ -1801,15 +1764,15 @@ Node* CodeStubAssembler::NewConsString(Node* context, Node* length, Node* left, |
Label two_byte_map(this); |
Variable result(this, MachineRepresentation::kTagged); |
Label done(this, &result); |
- GotoIf(WordNotEqual( |
- WordAnd(anded_instance_types, |
- IntPtrConstant(kStringEncodingMask | kOneByteDataHintTag)), |
- IntPtrConstant(0)), |
+ GotoIf(Word32NotEqual(Word32And(anded_instance_types, |
+ Int32Constant(kStringEncodingMask | |
+ kOneByteDataHintTag)), |
+ Int32Constant(0)), |
&one_byte_map); |
- Branch(WordNotEqual(WordAnd(xored_instance_types, |
- IntPtrConstant(kStringEncodingMask | |
- kOneByteDataHintMask)), |
- IntPtrConstant(kOneByteStringTag | kOneByteDataHintTag)), |
+ Branch(Word32NotEqual(Word32And(xored_instance_types, |
+ Int32Constant(kStringEncodingMask | |
+ kOneByteDataHintMask)), |
+ Int32Constant(kOneByteStringTag | kOneByteDataHintTag)), |
&two_byte_map, &one_byte_map); |
Bind(&one_byte_map); |
@@ -2361,16 +2324,17 @@ Node* CodeStubAssembler::LoadElementAndPrepareForStore(Node* array, |
Node* CodeStubAssembler::CalculateNewElementsCapacity(Node* old_capacity, |
ParameterMode mode) { |
+ if (mode == SMI_PARAMETERS) { |
+ old_capacity = BitcastTaggedToWord(old_capacity); |
+ } |
Node* half_old_capacity = WordShr(old_capacity, IntPtrConstant(1)); |
Node* new_capacity = IntPtrAdd(half_old_capacity, old_capacity); |
- Node* unconditioned_result = |
- IntPtrAdd(new_capacity, IntPtrOrSmiConstant(16, mode)); |
- if (mode == INTEGER_PARAMETERS || mode == INTPTR_PARAMETERS) { |
- return unconditioned_result; |
+ Node* unconditioned_result = IntPtrAdd(new_capacity, IntPtrConstant(16)); |
+ if (mode == SMI_PARAMETERS) { |
+ return SmiAnd(BitcastWordToTaggedSigned(unconditioned_result), |
+ SmiConstant(-1)); |
} else { |
- int const kSmiShiftBits = kSmiShiftSize + kSmiTagSize; |
- return WordAnd(unconditioned_result, |
- IntPtrConstant(static_cast<size_t>(-1) << kSmiShiftBits)); |
+ return unconditioned_result; |
} |
} |
@@ -2396,12 +2360,12 @@ Node* CodeStubAssembler::TryGrowElementsCapacity(Node* object, Node* elements, |
// If the gap growth is too big, fall back to the runtime. |
Node* max_gap = IntPtrOrSmiConstant(JSObject::kMaxGap, mode); |
- Node* max_capacity = IntPtrAdd(capacity, max_gap); |
- GotoIf(UintPtrGreaterThanOrEqual(key, max_capacity), bailout); |
+ Node* max_capacity = IntPtrOrSmiAdd(capacity, max_gap, mode); |
+ GotoIf(UintPtrOrSmiGreaterThanOrEqual(key, max_capacity, mode), bailout); |
// Calculate the capacity of the new backing store. |
Node* new_capacity = CalculateNewElementsCapacity( |
- IntPtrAdd(key, IntPtrOrSmiConstant(1, mode)), mode); |
+ IntPtrOrSmiAdd(key, IntPtrOrSmiConstant(1, mode), mode), mode); |
return GrowElementsCapacity(object, elements, kind, kind, capacity, |
new_capacity, mode, bailout); |
} |
@@ -2413,8 +2377,8 @@ Node* CodeStubAssembler::GrowElementsCapacity( |
// If size of the allocation for the new capacity doesn't fit in a page |
// that we can bump-pointer allocate from, fall back to the runtime. |
int max_size = FixedArrayBase::GetMaxLengthForNewSpaceAllocation(to_kind); |
- GotoIf(UintPtrGreaterThanOrEqual(new_capacity, |
- IntPtrOrSmiConstant(max_size, mode)), |
+ GotoIf(UintPtrOrSmiGreaterThanOrEqual( |
+ new_capacity, IntPtrOrSmiConstant(max_size, mode), mode), |
bailout); |
// Allocate the new backing store. |
@@ -2606,7 +2570,7 @@ Node* CodeStubAssembler::ChangeFloat64ToTagged(Node* value) { |
Goto(&if_valueisheapnumber); |
Bind(&if_notoverflow); |
{ |
- Node* result = Projection(0, pair); |
+ Node* result = BitcastWordToTaggedSigned(Projection(0, pair)); |
var_result.Bind(result); |
Goto(&if_join); |
} |
@@ -3509,12 +3473,10 @@ Node* CodeStubAssembler::StringAdd(Node* context, Node* left, Node* right, |
CSA_ASSERT(this, TaggedIsSmi(left_length)); |
CSA_ASSERT(this, TaggedIsSmi(right_length)); |
Node* new_length = SmiAdd(left_length, right_length); |
- GotoIf(UintPtrGreaterThanOrEqual( |
- new_length, SmiConstant(Smi::FromInt(String::kMaxLength))), |
+ GotoIf(SmiAboveOrEqual(new_length, SmiConstant(String::kMaxLength)), |
&runtime); |
- GotoIf(IntPtrLessThan(new_length, |
- SmiConstant(Smi::FromInt(ConsString::kMinLength))), |
+ GotoIf(SmiLessThan(new_length, SmiConstant(ConsString::kMinLength)), |
&non_cons); |
result.Bind(NewConsString(context, new_length, left, right, flags)); |
@@ -3527,23 +3489,24 @@ Node* CodeStubAssembler::StringAdd(Node* context, Node* left, Node* right, |
Node* right_instance_type = LoadInstanceType(right); |
// Compute intersection and difference of instance types. |
- Node* ored_instance_types = WordOr(left_instance_type, right_instance_type); |
- Node* xored_instance_types = WordXor(left_instance_type, right_instance_type); |
+ Node* ored_instance_types = Word32Or(left_instance_type, right_instance_type); |
+ Node* xored_instance_types = |
+ Word32Xor(left_instance_type, right_instance_type); |
// Check if both strings have the same encoding and both are sequential. |
- GotoIf(WordNotEqual( |
- WordAnd(xored_instance_types, IntPtrConstant(kStringEncodingMask)), |
- IntPtrConstant(0)), |
+ GotoIf(Word32NotEqual(Word32And(xored_instance_types, |
+ Int32Constant(kStringEncodingMask)), |
+ Int32Constant(0)), |
&runtime); |
- GotoIf(WordNotEqual(WordAnd(ored_instance_types, |
- IntPtrConstant(kStringRepresentationMask)), |
- IntPtrConstant(0)), |
+ GotoIf(Word32NotEqual(Word32And(ored_instance_types, |
+ Int32Constant(kStringRepresentationMask)), |
+ Int32Constant(0)), |
&runtime); |
Label two_byte(this); |
- GotoIf(WordEqual( |
- WordAnd(ored_instance_types, IntPtrConstant(kStringEncodingMask)), |
- IntPtrConstant(kTwoByteStringTag)), |
+ GotoIf(Word32Equal( |
+ Word32And(ored_instance_types, Int32Constant(kStringEncodingMask)), |
+ Int32Constant(kTwoByteStringTag)), |
&two_byte); |
// One-byte sequential string case |
Node* new_string = |
@@ -3744,7 +3707,9 @@ Node* CodeStubAssembler::NumberToString(Node* context, Node* argument) { |
// Make the hash mask from the length of the number string cache. It |
// contains two elements (number and string) for each cache entry. |
- Node* mask = LoadFixedArrayBaseLength(number_string_cache); |
+ // TODO(ishell): cleanup mask handling. |
+ Node* mask = |
+ BitcastTaggedToWord(LoadFixedArrayBaseLength(number_string_cache)); |
Node* one = IntPtrConstant(1); |
mask = IntPtrSub(mask, one); |
@@ -3760,9 +3725,9 @@ Node* CodeStubAssembler::NumberToString(Node* context, Node* argument) { |
Node* high = LoadObjectField(argument, HeapNumber::kValueOffset + kIntSize, |
MachineType::Int32()); |
Node* hash = Word32Xor(low, high); |
- if (Is64()) hash = ChangeInt32ToInt64(hash); |
+ hash = ChangeInt32ToIntPtr(hash); |
hash = WordShl(hash, one); |
- Node* index = WordAnd(hash, SmiToWord(mask)); |
+ Node* index = WordAnd(hash, SmiUntag(BitcastWordToTagged(mask))); |
// Cache entry's key must be a heap number |
Node* number_key = |
@@ -3776,8 +3741,8 @@ Node* CodeStubAssembler::NumberToString(Node* context, Node* argument) { |
MachineType::Int32()); |
Node* high_compare = LoadObjectField( |
number_key, HeapNumber::kValueOffset + kIntSize, MachineType::Int32()); |
- GotoUnless(WordEqual(low, low_compare), &runtime); |
- GotoUnless(WordEqual(high, high_compare), &runtime); |
+ GotoUnless(Word32Equal(low, low_compare), &runtime); |
+ GotoUnless(Word32Equal(high, high_compare), &runtime); |
// Heap number match, return value fro cache entry. |
IncrementCounter(isolate()->counters()->number_to_string_native(), 1); |
@@ -3795,7 +3760,8 @@ Node* CodeStubAssembler::NumberToString(Node* context, Node* argument) { |
Bind(&smi); |
{ |
// Load the smi key, make sure it matches the smi we're looking for. |
- Node* smi_index = WordAnd(WordShl(argument, one), mask); |
+ Node* smi_index = BitcastWordToTagged( |
+ WordAnd(WordShl(BitcastTaggedToWord(argument), one), mask)); |
Node* smi_key = LoadFixedArrayElement(number_string_cache, smi_index, 0, |
SMI_PARAMETERS); |
GotoIf(WordNotEqual(smi_key, argument), &runtime); |
@@ -4599,9 +4565,9 @@ void CodeStubAssembler::InsertEntry<NameDictionary>(Node* dictionary, |
const int kInitialIndex = 0; |
PropertyDetails d(NONE, DATA, kInitialIndex, PropertyCellType::kNoCell); |
enum_index = |
- WordShl(enum_index, PropertyDetails::DictionaryStorageField::kShift); |
+ SmiShl(enum_index, PropertyDetails::DictionaryStorageField::kShift); |
STATIC_ASSERT(kInitialIndex == 0); |
- var_details.Bind(WordOr(SmiConstant(d.AsSmi()), enum_index)); |
+ var_details.Bind(SmiOr(SmiConstant(d.AsSmi()), enum_index)); |
// Private names must be marked non-enumerable. |
Label not_private(this, &var_details); |
@@ -4610,8 +4576,8 @@ void CodeStubAssembler::InsertEntry<NameDictionary>(Node* dictionary, |
const int kPrivateMask = 1 << Symbol::kPrivateBit; |
GotoUnless(IsSetWord32(flags, kPrivateMask), ¬_private); |
Node* dont_enum = |
- WordShl(SmiConstant(DONT_ENUM), PropertyDetails::AttributesField::kShift); |
- var_details.Bind(WordOr(var_details.value(), dont_enum)); |
+ SmiShl(SmiConstant(DONT_ENUM), PropertyDetails::AttributesField::kShift); |
+ var_details.Bind(SmiOr(var_details.value(), dont_enum)); |
Goto(¬_private); |
Bind(¬_private); |
@@ -4641,20 +4607,20 @@ void CodeStubAssembler::Add(Node* dictionary, Node* key, Node* value, |
// Require 33% to still be free after adding additional_elements. |
// Computing "x + (x >> 1)" on a Smi x does not return a valid Smi! |
// But that's OK here because it's only used for a comparison. |
- Node* required_capacity_pseudo_smi = SmiAdd(new_nof, WordShr(new_nof, 1)); |
- GotoIf(UintPtrLessThan(capacity, required_capacity_pseudo_smi), bailout); |
+ Node* required_capacity_pseudo_smi = SmiAdd(new_nof, SmiShr(new_nof, 1)); |
+ GotoIf(SmiBelow(capacity, required_capacity_pseudo_smi), bailout); |
// Require rehashing if more than 50% of free elements are deleted elements. |
Node* deleted = GetNumberOfDeletedElements<Dictionary>(dictionary); |
- CSA_ASSERT(this, UintPtrGreaterThan(capacity, new_nof)); |
- Node* half_of_free_elements = WordShr(SmiSub(capacity, new_nof), 1); |
- GotoIf(UintPtrGreaterThan(deleted, half_of_free_elements), bailout); |
+ CSA_ASSERT(this, SmiAbove(capacity, new_nof)); |
+ Node* half_of_free_elements = SmiShr(SmiSub(capacity, new_nof), 1); |
+ GotoIf(SmiAbove(deleted, half_of_free_elements), bailout); |
Node* enum_index = nullptr; |
if (Dictionary::kIsEnumerable) { |
enum_index = GetNextEnumerationIndex<Dictionary>(dictionary); |
Node* new_enum_index = SmiAdd(enum_index, SmiConstant(1)); |
Node* max_enum_index = |
SmiConstant(PropertyDetails::DictionaryStorageField::kMax); |
- GotoIf(UintPtrGreaterThan(new_enum_index, max_enum_index), bailout); |
+ GotoIf(SmiAbove(new_enum_index, max_enum_index), bailout); |
// No more bailouts after this point. |
// Operations from here on can have side effects. |
@@ -4806,8 +4772,8 @@ void CodeStubAssembler::LoadPropertyFromFastObject(Node* object, Node* map, |
(DescriptorArray::kDescriptorValue - DescriptorArray::kDescriptorKey) * |
kPointerSize; |
- Node* details = LoadAndUntagToWord32FixedArrayElement(descriptors, name_index, |
- name_to_details_offset); |
+ Node* details = LoadAndUntagToWord32FixedArrayElement( |
+ descriptors, name_index, name_to_details_offset, INTPTR_PARAMETERS); |
var_details->Bind(details); |
Node* location = DecodeWord32<PropertyDetails::LocationField>(details); |
@@ -4891,8 +4857,8 @@ void CodeStubAssembler::LoadPropertyFromFastObject(Node* object, Node* map, |
} |
Bind(&if_in_descriptor); |
{ |
- Node* value = |
- LoadFixedArrayElement(descriptors, name_index, name_to_value_offset); |
+ Node* value = LoadFixedArrayElement( |
+ descriptors, name_index, name_to_value_offset, INTPTR_PARAMETERS); |
var_value->Bind(value); |
Goto(&done); |
} |
@@ -4914,8 +4880,8 @@ void CodeStubAssembler::LoadPropertyFromNameDictionary(Node* dictionary, |
(NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * |
kPointerSize; |
- Node* details = LoadAndUntagToWord32FixedArrayElement(dictionary, name_index, |
- name_to_details_offset); |
+ Node* details = LoadAndUntagToWord32FixedArrayElement( |
+ dictionary, name_index, name_to_details_offset, INTPTR_PARAMETERS); |
var_details->Bind(details); |
var_value->Bind(LoadFixedArrayElement( |
@@ -6088,7 +6054,8 @@ void CodeStubAssembler::TrapAllocationMemento(Node* object, |
kMementoMapOffset + AllocationMemento::kSize - kPointerSize; |
// Bail out if the object is not in new space. |
- Node* object_page = PageFromAddress(object); |
+ Node* object_word = BitcastTaggedToWord(object); |
+ Node* object_page = PageFromAddress(object_word); |
{ |
Node* page_flags = Load(MachineType::IntPtr(), object_page, |
IntPtrConstant(Page::kFlagsOffset)); |
@@ -6099,7 +6066,7 @@ void CodeStubAssembler::TrapAllocationMemento(Node* object, |
} |
Node* memento_last_word = IntPtrAdd( |
- object, IntPtrConstant(kMementoLastWordOffset - kHeapObjectTag)); |
+ object_word, IntPtrConstant(kMementoLastWordOffset - kHeapObjectTag)); |
Node* memento_last_word_page = PageFromAddress(memento_last_word); |
Node* new_space_top = Load(MachineType::Pointer(), new_space_top_address); |