Index: src/code-stub-assembler.cc |
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
index f23b82829ecc3d8dbc81cf1a7622977a6a67bdca..6504c84287b0fb715c795760a180202c2697f1d5 100644 |
--- a/src/code-stub-assembler.cc |
+++ b/src/code-stub-assembler.cc |
@@ -658,8 +658,7 @@ void CodeStubAssembler::BranchIfFastJSArray(Node* object, Node* context, |
GotoIf(WordNotEqual(LoadMapInstanceType(map), Int32Constant(JS_ARRAY_TYPE)), |
if_false); |
- Node* bit_field2 = LoadMapBitField2(map); |
- Node* elements_kind = BitFieldDecode<Map::ElementsKindBits>(bit_field2); |
+ Node* elements_kind = LoadMapElementsKind(map); |
// Bailout if receiver has slow elements. |
GotoIf( |
@@ -1025,7 +1024,7 @@ Node* CodeStubAssembler::LoadMapInstanceType(Node* map) { |
Node* CodeStubAssembler::LoadMapElementsKind(Node* map) { |
Node* bit_field2 = LoadMapBitField2(map); |
- return BitFieldDecode<Map::ElementsKindBits>(bit_field2); |
+ return DecodeWord32<Map::ElementsKindBits>(bit_field2); |
} |
Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { |
@@ -3319,7 +3318,8 @@ Node* CodeStubAssembler::StringToNumber(Node* context, Node* input) { |
Word32And(hash, Int32Constant(String::kContainsCachedArrayIndexMask)); |
GotoIf(Word32NotEqual(bit, Int32Constant(0)), &runtime); |
- var_result.Bind(SmiTag(BitFieldDecode<String::ArrayIndexValueBits>(hash))); |
+ var_result.Bind( |
+ SmiTag(DecodeWordFromWord32<String::ArrayIndexValueBits>(hash))); |
Goto(&end); |
Bind(&runtime); |
@@ -3711,12 +3711,16 @@ Node* CodeStubAssembler::ToInteger(Node* context, Node* input, |
return var_arg.value(); |
} |
-Node* CodeStubAssembler::BitFieldDecode(Node* word32, uint32_t shift, |
- uint32_t mask) { |
+Node* CodeStubAssembler::DecodeWord32(Node* word32, uint32_t shift, |
+ uint32_t mask) { |
return Word32Shr(Word32And(word32, Int32Constant(mask)), |
static_cast<int>(shift)); |
} |
+Node* CodeStubAssembler::DecodeWord(Node* word, uint32_t shift, uint32_t mask) { |
+ return WordShr(WordAnd(word, IntPtrConstant(mask)), static_cast<int>(shift)); |
+} |
+ |
void CodeStubAssembler::SetCounter(StatsCounter* counter, int value) { |
if (FLAG_native_code_counters && counter->Enabled()) { |
Node* counter_address = ExternalConstant(ExternalReference(counter)); |
@@ -3786,7 +3790,7 @@ void CodeStubAssembler::TryToName(Node* key, Label* if_keyisindex, |
Goto(if_keyisunique); |
Bind(&if_hascachedindex); |
- var_index->Bind(BitFieldDecodeWord<Name::ArrayIndexValueBits>(hash)); |
+ var_index->Bind(DecodeWordFromWord32<Name::ArrayIndexValueBits>(hash)); |
Goto(if_keyisindex); |
} |
@@ -3999,13 +4003,14 @@ void CodeStubAssembler::TryLookupProperty( |
CSA_ASSERT(Word32Equal(Word32And(bit_field, mask), Int32Constant(0))); |
Node* bit_field3 = LoadMapBitField3(map); |
- Node* bit = BitFieldDecode<Map::DictionaryMap>(bit_field3); |
Label if_isfastmap(this), if_isslowmap(this); |
- Branch(Word32Equal(bit, Int32Constant(0)), &if_isfastmap, &if_isslowmap); |
+ Branch(IsSetWord32<Map::DictionaryMap>(bit_field3), &if_isslowmap, |
+ &if_isfastmap); |
Bind(&if_isfastmap); |
{ |
Comment("DescriptorArrayLookup"); |
- Node* nof = BitFieldDecodeWord<Map::NumberOfOwnDescriptorsBits>(bit_field3); |
+ Node* nof = |
+ DecodeWordFromWord32<Map::NumberOfOwnDescriptorsBits>(bit_field3); |
// Bail out to the runtime for large numbers of own descriptors. The stub |
// only does linear search, which becomes too expensive in that case. |
{ |
@@ -4093,7 +4098,7 @@ void CodeStubAssembler::LoadPropertyFromFastObject(Node* object, Node* map, |
name_to_details_offset); |
var_details->Bind(details); |
- Node* location = BitFieldDecode<PropertyDetails::LocationField>(details); |
+ Node* location = DecodeWord32<PropertyDetails::LocationField>(details); |
Label if_in_field(this), if_in_descriptor(this), done(this); |
Branch(Word32Equal(location, Int32Constant(kField)), &if_in_field, |
@@ -4101,9 +4106,9 @@ void CodeStubAssembler::LoadPropertyFromFastObject(Node* object, Node* map, |
Bind(&if_in_field); |
{ |
Node* field_index = |
- BitFieldDecodeWord<PropertyDetails::FieldIndexField>(details); |
+ DecodeWordFromWord32<PropertyDetails::FieldIndexField>(details); |
Node* representation = |
- BitFieldDecode<PropertyDetails::RepresentationField>(details); |
+ DecodeWord32<PropertyDetails::RepresentationField>(details); |
Node* inobject_properties = LoadMapInobjectProperties(map); |
@@ -4242,7 +4247,7 @@ Node* CodeStubAssembler::CallGetterIfAccessor(Node* value, Node* details, |
var_value.Bind(value); |
Label done(this); |
- Node* kind = BitFieldDecode<PropertyDetails::KindField>(details); |
+ Node* kind = DecodeWord32<PropertyDetails::KindField>(details); |
GotoIf(Word32Equal(kind, Int32Constant(kData)), &done); |
// Accessor case. |
@@ -5139,7 +5144,7 @@ void CodeStubAssembler::EmitElementLoad(Node* object, Node* elements, |
var_entry.value(), SeededNumberDictionary::kEntryDetailsIndex); |
Node* details = SmiToWord32( |
LoadFixedArrayElement(elements, details_index, 0, INTPTR_PARAMETERS)); |
- Node* kind = BitFieldDecode<PropertyDetails::KindField>(details); |
+ Node* kind = DecodeWord32<PropertyDetails::KindField>(details); |
// TODO(jkummerow): Support accessors without missing? |
GotoUnless(Word32Equal(kind, Int32Constant(kData)), miss); |
// Finally, load the value. |
@@ -5269,8 +5274,7 @@ void CodeStubAssembler::HandleLoadICHandlerCase( |
Node* holder = var_holder.value(); |
Node* handler_word = SmiUntag(var_smi_handler.value()); |
- Node* handler_type = |
- WordAnd(handler_word, IntPtrConstant(LoadHandlerTypeBits::kMask)); |
+ Node* handler_type = DecodeWord<LoadHandlerTypeBits>(handler_word); |
if (support_elements == kSupportElements) { |
Label property(this); |
GotoUnless( |
@@ -5280,10 +5284,8 @@ void CodeStubAssembler::HandleLoadICHandlerCase( |
Comment("element_load"); |
Node* intptr_index = TryToIntptr(p->name, miss); |
Node* elements = LoadElements(holder); |
- Node* is_jsarray = |
- WordAnd(handler_word, IntPtrConstant(KeyedLoadIsJsArray::kMask)); |
- Node* is_jsarray_condition = WordNotEqual(is_jsarray, IntPtrConstant(0)); |
- Node* elements_kind = BitFieldDecode<KeyedLoadElementsKind>(handler_word); |
+ Node* is_jsarray_condition = IsSetWord<KeyedLoadIsJsArray>(handler_word); |
+ Node* elements_kind = DecodeWord<KeyedLoadElementsKind>(handler_word); |
Label if_hole(this), unimplemented_elements_kind(this); |
Label* out_of_bounds = miss; |
EmitElementLoad(holder, elements, elements_kind, intptr_index, |
@@ -5302,9 +5304,7 @@ void CodeStubAssembler::HandleLoadICHandlerCase( |
Bind(&if_hole); |
{ |
Comment("convert hole"); |
- Node* convert_hole = |
- WordAnd(handler_word, IntPtrConstant(KeyedLoadConvertHole::kMask)); |
- GotoIf(WordEqual(convert_hole, IntPtrConstant(0)), miss); |
+ GotoUnless(IsSetWord<KeyedLoadConvertHole>(handler_word), miss); |
Node* protector_cell = LoadRoot(Heap::kArrayProtectorRootIndex); |
DCHECK(isolate()->heap()->array_protector()->IsPropertyCell()); |
GotoUnless( |
@@ -5326,40 +5326,41 @@ void CodeStubAssembler::HandleLoadICHandlerCase( |
Bind(&field); |
{ |
Comment("field_load"); |
- Label inobject_double(this), out_of_object(this), |
- out_of_object_double(this); |
- Node* inobject_bit = |
- WordAnd(handler_word, IntPtrConstant(FieldOffsetIsInobject::kMask)); |
- Node* double_bit = |
- WordAnd(handler_word, IntPtrConstant(FieldOffsetIsDouble::kMask)); |
- Node* offset = |
- WordSar(handler_word, IntPtrConstant(FieldOffsetOffset::kShift)); |
- |
- GotoIf(WordEqual(inobject_bit, IntPtrConstant(0)), &out_of_object); |
- |
- GotoUnless(WordEqual(double_bit, IntPtrConstant(0)), &inobject_double); |
- Return(LoadObjectField(holder, offset)); |
- |
- Bind(&inobject_double); |
- if (FLAG_unbox_double_fields) { |
- var_double_value.Bind( |
- LoadObjectField(holder, offset, MachineType::Float64())); |
- } else { |
- Node* mutable_heap_number = LoadObjectField(holder, offset); |
- var_double_value.Bind(LoadHeapNumberValue(mutable_heap_number)); |
+ Node* offset = DecodeWord<FieldOffsetOffset>(handler_word); |
+ |
+ Label inobject(this), out_of_object(this); |
+ Branch(IsSetWord<FieldOffsetIsInobject>(handler_word), &inobject, |
+ &out_of_object); |
+ |
+ Bind(&inobject); |
+ { |
+ Label is_double(this); |
+ GotoIf(IsSetWord<FieldOffsetIsDouble>(handler_word), &is_double); |
+ Return(LoadObjectField(holder, offset)); |
+ |
+ Bind(&is_double); |
+ if (FLAG_unbox_double_fields) { |
+ var_double_value.Bind( |
+ LoadObjectField(holder, offset, MachineType::Float64())); |
+ } else { |
+ Node* mutable_heap_number = LoadObjectField(holder, offset); |
+ var_double_value.Bind(LoadHeapNumberValue(mutable_heap_number)); |
+ } |
+ Goto(&rebox_double); |
} |
- Goto(&rebox_double); |
Bind(&out_of_object); |
- Node* properties = LoadProperties(holder); |
- Node* value = LoadObjectField(properties, offset); |
- GotoUnless(WordEqual(double_bit, IntPtrConstant(0)), |
- &out_of_object_double); |
- Return(value); |
+ { |
+ Label is_double(this); |
+ Node* properties = LoadProperties(holder); |
+ Node* value = LoadObjectField(properties, offset); |
+ GotoIf(IsSetWord<FieldOffsetIsDouble>(handler_word), &is_double); |
+ Return(value); |
- Bind(&out_of_object_double); |
- var_double_value.Bind(LoadHeapNumberValue(value)); |
- Goto(&rebox_double); |
+ Bind(&is_double); |
+ var_double_value.Bind(LoadHeapNumberValue(value)); |
+ Goto(&rebox_double); |
+ } |
Bind(&rebox_double); |
Return(AllocateHeapNumberWithValue(var_double_value.value())); |
@@ -5369,11 +5370,10 @@ void CodeStubAssembler::HandleLoadICHandlerCase( |
{ |
Comment("constant_load"); |
Node* descriptors = LoadMapDescriptors(LoadMap(holder)); |
- Node* descriptor = WordSar( |
- handler_word, IntPtrConstant(ValueIndexInDescriptorArray::kShift)); |
+ Node* descriptor = DecodeWord<ValueIndexInDescriptorArray>(handler_word); |
#if defined(DEBUG) |
- Assert(UintPtrLessThan(descriptor, |
- LoadAndUntagFixedArrayBaseLength(descriptors))); |
+ CSA_ASSERT(UintPtrLessThan( |
+ descriptor, LoadAndUntagFixedArrayBaseLength(descriptors))); |
#endif |
Return( |
LoadFixedArrayElement(descriptors, descriptor, 0, INTPTR_PARAMETERS)); |
@@ -5607,7 +5607,8 @@ void CodeStubAssembler::KeyedLoadICGeneric(const LoadICParameters* p) { |
const int32_t kMaxLinear = 210; |
Label stub_cache(this); |
Node* bitfield3 = LoadMapBitField3(receiver_map); |
- Node* nof = BitFieldDecodeWord<Map::NumberOfOwnDescriptorsBits>(bitfield3); |
+ Node* nof = |
+ DecodeWordFromWord32<Map::NumberOfOwnDescriptorsBits>(bitfield3); |
GotoIf(UintPtrGreaterThan(nof, IntPtrConstant(kMaxLinear)), &stub_cache); |
Node* descriptors = LoadMapDescriptors(receiver_map); |
Variable var_name_index(this, MachineType::PointerRepresentation()); |
@@ -6414,7 +6415,7 @@ Node* CodeStubAssembler::PageFromAddress(Node* address) { |
Node* CodeStubAssembler::EnumLength(Node* map) { |
Node* bitfield_3 = LoadMapBitField3(map); |
- Node* enum_length = BitFieldDecode<Map::EnumLengthBits>(bitfield_3); |
+ Node* enum_length = DecodeWordFromWord32<Map::EnumLengthBits>(bitfield_3); |
return SmiTag(enum_length); |
} |