| Index: src/x64/ic-x64.cc
|
| diff --git a/src/x64/ic-x64.cc b/src/x64/ic-x64.cc
|
| index bf415d925ba1b18ca0a96e28389eb9389d24f40e..d46198af135e80d0694fa51dc5c48af8af6751bf 100644
|
| --- a/src/x64/ic-x64.cc
|
| +++ b/src/x64/ic-x64.cc
|
| @@ -95,7 +95,7 @@ static void GenerateDictionaryLoad(MacroAssembler* masm, Label* miss_label,
|
| StringDictionary::kHeaderSize +
|
| StringDictionary::kCapacityIndex * kPointerSize;
|
| __ movq(r2, FieldOperand(r0, kCapacityOffset));
|
| - __ shrl(r2, Immediate(kSmiTagSize)); // convert smi to int
|
| + __ SmiToInteger32(r2, r2);
|
| __ decl(r2);
|
|
|
| // Generate an unrolled loop that performs a few probes before
|
| @@ -132,7 +132,7 @@ static void GenerateDictionaryLoad(MacroAssembler* masm, Label* miss_label,
|
| __ bind(&done);
|
| const int kDetailsOffset = kElementsStartOffset + 2 * kPointerSize;
|
| __ testl(Operand(r0, r1, times_pointer_size, kDetailsOffset - kHeapObjectTag),
|
| - Immediate(PropertyDetails::TypeField::mask() << kSmiTagSize));
|
| + Immediate(Smi::FromInt(PropertyDetails::TypeField::mask())));
|
| __ j(not_zero, miss_label);
|
|
|
| // Get the value at the masked, scaled index.
|
| @@ -148,8 +148,7 @@ static void GenerateCheckNonObjectOrLoaded(MacroAssembler* masm, Label* miss,
|
| Register value) {
|
| Label done;
|
| // Check if the value is a Smi.
|
| - __ testl(value, Immediate(kSmiTagMask));
|
| - __ j(zero, &done);
|
| + __ JumpIfSmi(value, &done);
|
| // Check if the object has been loaded.
|
| __ movq(kScratchRegister, FieldOperand(value, JSFunction::kMapOffset));
|
| __ testb(FieldOperand(kScratchRegister, Map::kBitField2Offset),
|
| @@ -265,8 +264,7 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
|
| __ movq(rcx, Operand(rsp, 2 * kPointerSize));
|
|
|
| // Check that the object isn't a smi.
|
| - __ testl(rcx, Immediate(kSmiTagMask));
|
| - __ j(zero, &slow);
|
| + __ JumpIfSmi(rcx, &slow);
|
|
|
| // Check that the object is some kind of JS object EXCEPT JS Value type.
|
| // In the case that the object is a value-wrapper object,
|
| @@ -283,9 +281,8 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
|
| __ j(not_zero, &slow);
|
|
|
| // Check that the key is a smi.
|
| - __ testl(rax, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &check_string);
|
| - __ sarl(rax, Immediate(kSmiTagSize));
|
| + __ JumpIfNotSmi(rax, &check_string);
|
| + __ SmiToInteger32(rax, rax);
|
| // Get the elements array of the object.
|
| __ bind(&index_int);
|
| __ movq(rcx, FieldOperand(rcx, JSObject::kElementsOffset));
|
| @@ -410,8 +407,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) {
|
| // Get the receiver from the stack.
|
| __ movq(rdx, Operand(rsp, 2 * kPointerSize)); // 2 ~ return address, key
|
| // Check that the object isn't a smi.
|
| - __ testl(rdx, Immediate(kSmiTagMask));
|
| - __ j(zero, &slow);
|
| + __ JumpIfSmi(rdx, &slow);
|
| // Get the map from the receiver.
|
| __ movq(rcx, FieldOperand(rdx, HeapObject::kMapOffset));
|
| // Check that the receiver does not require access checks. We need
|
| @@ -422,8 +418,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) {
|
| // Get the key from the stack.
|
| __ movq(rbx, Operand(rsp, 1 * kPointerSize)); // 1 ~ return address
|
| // Check that the key is a smi.
|
| - __ testl(rbx, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &slow);
|
| + __ JumpIfNotSmi(rbx, &slow);
|
| // If it is a smi, make sure it is zero-extended, so it can be
|
| // used as an index in a memory operand.
|
| __ movl(rbx, rbx); // Clear the high bits of rbx.
|
| @@ -443,8 +438,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) {
|
| __ Cmp(FieldOperand(rcx, HeapObject::kMapOffset), Factory::fixed_array_map());
|
| __ j(not_equal, &slow);
|
| // Untag the key (for checking against untagged length in the fixed array).
|
| - __ movl(rdx, rbx);
|
| - __ sarl(rdx, Immediate(kSmiTagSize));
|
| + __ SmiToInteger32(rdx, rbx);
|
| __ cmpl(rdx, FieldOperand(rcx, Array::kLengthOffset));
|
| // rax: value
|
| // rcx: FixedArray
|
| @@ -473,13 +467,13 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) {
|
| // rbx: index (as a smi)
|
| // flags: compare (rbx, rdx.length())
|
| __ j(not_equal, &slow); // do not leave holes in the array
|
| - __ sarl(rbx, Immediate(kSmiTagSize)); // untag
|
| + __ SmiToInteger64(rbx, rbx);
|
| __ cmpl(rbx, FieldOperand(rcx, FixedArray::kLengthOffset));
|
| __ j(above_equal, &slow);
|
| - // Restore tag and increment.
|
| - __ lea(rbx, Operand(rbx, rbx, times_1, 1 << kSmiTagSize));
|
| + // Increment and restore smi-tag.
|
| + __ Integer64AddToSmi(rbx, rbx, 1);
|
| __ movq(FieldOperand(rdx, JSArray::kLengthOffset), rbx);
|
| - __ subl(rbx, Immediate(1 << kSmiTagSize)); // decrement rbx again
|
| + __ SmiSubConstant(rbx, rbx, 1, NULL);
|
| __ jmp(&fast);
|
|
|
|
|
| @@ -544,8 +538,7 @@ void CallIC::Generate(MacroAssembler* masm,
|
| // Check if the receiver is a global object of some sort.
|
| Label invoke, global;
|
| __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); // receiver
|
| - __ testl(rdx, Immediate(kSmiTagMask));
|
| - __ j(zero, &invoke);
|
| + __ JumpIfSmi(rdx, &invoke);
|
| __ CmpObjectType(rdx, JS_GLOBAL_OBJECT_TYPE, rcx);
|
| __ j(equal, &global);
|
| __ CmpInstanceType(rcx, JS_BUILTINS_OBJECT_TYPE);
|
| @@ -594,8 +587,7 @@ void CallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
|
| // to probe.
|
| //
|
| // Check for number.
|
| - __ testl(rdx, Immediate(kSmiTagMask));
|
| - __ j(zero, &number);
|
| + __ JumpIfSmi(rdx, &number);
|
| __ CmpObjectType(rdx, HEAP_NUMBER_TYPE, rbx);
|
| __ j(not_equal, &non_number);
|
| __ bind(&number);
|
| @@ -640,8 +632,7 @@ static void GenerateNormalHelper(MacroAssembler* masm,
|
|
|
| // Move the result to register rdi and check that it isn't a smi.
|
| __ movq(rdi, rdx);
|
| - __ testl(rdx, Immediate(kSmiTagMask));
|
| - __ j(zero, miss);
|
| + __ JumpIfSmi(rdx, miss);
|
|
|
| // Check that the value is a JavaScript function.
|
| __ CmpObjectType(rdx, JS_FUNCTION_TYPE, rdx);
|
| @@ -683,8 +674,7 @@ void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
|
| __ movq(rcx, Operand(rsp, (argc + 2) * kPointerSize));
|
|
|
| // Check that the receiver isn't a smi.
|
| - __ testl(rdx, Immediate(kSmiTagMask));
|
| - __ j(zero, &miss);
|
| + __ JumpIfSmi(rdx, &miss);
|
|
|
| // Check that the receiver is a valid JS object.
|
| // Because there are so many map checks and type checks, do not
|
| @@ -844,8 +834,7 @@ void LoadIC::GenerateNormal(MacroAssembler* masm) {
|
| __ movq(rax, Operand(rsp, kPointerSize));
|
|
|
| // Check that the receiver isn't a smi.
|
| - __ testl(rax, Immediate(kSmiTagMask));
|
| - __ j(zero, &miss);
|
| + __ JumpIfSmi(rax, &miss);
|
|
|
| // Check that the receiver is a valid JS object.
|
| __ CmpObjectType(rax, FIRST_JS_OBJECT_TYPE, rbx);
|
|
|