| Index: src/ia32/code-stubs-ia32.cc
|
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
|
| index 087b3a7d0884bae18b9737d3275bf1a765a8c410..fa7d08cf848bf0c5b4fca17981a7fe2d272038b1 100644
|
| --- a/src/ia32/code-stubs-ia32.cc
|
| +++ b/src/ia32/code-stubs-ia32.cc
|
| @@ -605,9 +605,9 @@ void TypeRecordingUnaryOpStub::GenerateSmiStub(MacroAssembler* masm) {
|
|
|
|
|
| void TypeRecordingUnaryOpStub::GenerateSmiStubSub(MacroAssembler* masm) {
|
| - NearLabel non_smi;
|
| - Label undo, slow;
|
| - GenerateSmiCodeSub(masm, &non_smi, &undo, &slow);
|
| + Label non_smi, undo, slow;
|
| + GenerateSmiCodeSub(masm, &non_smi, &undo, &slow,
|
| + Label::kNear, Label::kNear, Label::kNear);
|
| __ bind(&undo);
|
| GenerateSmiCodeUndo(masm);
|
| __ bind(&non_smi);
|
| @@ -617,39 +617,41 @@ void TypeRecordingUnaryOpStub::GenerateSmiStubSub(MacroAssembler* masm) {
|
|
|
|
|
| void TypeRecordingUnaryOpStub::GenerateSmiStubBitNot(MacroAssembler* masm) {
|
| - NearLabel non_smi;
|
| + Label non_smi;
|
| GenerateSmiCodeBitNot(masm, &non_smi);
|
| __ bind(&non_smi);
|
| GenerateTypeTransition(masm);
|
| }
|
|
|
|
|
| -void TypeRecordingUnaryOpStub::GenerateSmiCodeSub(MacroAssembler* masm,
|
| - NearLabel* non_smi,
|
| - Label* undo,
|
| - Label* slow) {
|
| +void TypeRecordingUnaryOpStub::GenerateSmiCodeSub(
|
| + MacroAssembler* masm, Label* non_smi, Label* undo, Label* slow,
|
| + Label::Distance non_smi_near, Label::Distance undo_near,
|
| + Label::Distance slow_near) {
|
| // Check whether the value is a smi.
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(not_zero, non_smi);
|
| + __ j(not_zero, non_smi, non_smi_near);
|
|
|
| // We can't handle -0 with smis, so use a type transition for that case.
|
| __ test(eax, Operand(eax));
|
| - __ j(zero, slow);
|
| + __ j(zero, slow, slow_near);
|
|
|
| // Try optimistic subtraction '0 - value', saving operand in eax for undo.
|
| __ mov(edx, Operand(eax));
|
| __ Set(eax, Immediate(0));
|
| __ sub(eax, Operand(edx));
|
| - __ j(overflow, undo);
|
| + __ j(overflow, undo, undo_near);
|
| __ ret(0);
|
| }
|
|
|
|
|
| -void TypeRecordingUnaryOpStub::GenerateSmiCodeBitNot(MacroAssembler* masm,
|
| - NearLabel* non_smi) {
|
| +void TypeRecordingUnaryOpStub::GenerateSmiCodeBitNot(
|
| + MacroAssembler* masm,
|
| + Label* non_smi,
|
| + Label::Distance non_smi_near) {
|
| // Check whether the value is a smi.
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(not_zero, non_smi);
|
| + __ j(not_zero, non_smi, non_smi_near);
|
|
|
| // Flip bits and revert inverted smi-tag.
|
| __ not_(eax);
|
| @@ -679,9 +681,8 @@ void TypeRecordingUnaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) {
|
|
|
|
|
| void TypeRecordingUnaryOpStub::GenerateHeapNumberStubSub(MacroAssembler* masm) {
|
| - NearLabel non_smi;
|
| - Label undo, slow;
|
| - GenerateSmiCodeSub(masm, &non_smi, &undo, &slow);
|
| + Label non_smi, undo, slow;
|
| + GenerateSmiCodeSub(masm, &non_smi, &undo, &slow, Label::kNear);
|
| __ bind(&non_smi);
|
| GenerateHeapNumberCodeSub(masm, &slow);
|
| __ bind(&undo);
|
| @@ -693,9 +694,8 @@ void TypeRecordingUnaryOpStub::GenerateHeapNumberStubSub(MacroAssembler* masm) {
|
|
|
| void TypeRecordingUnaryOpStub::GenerateHeapNumberStubBitNot(
|
| MacroAssembler* masm) {
|
| - NearLabel non_smi;
|
| - Label slow;
|
| - GenerateSmiCodeBitNot(masm, &non_smi);
|
| + Label non_smi, slow;
|
| + GenerateSmiCodeBitNot(masm, &non_smi, Label::kNear);
|
| __ bind(&non_smi);
|
| GenerateHeapNumberCodeBitNot(masm, &slow);
|
| __ bind(&slow);
|
| @@ -807,9 +807,8 @@ void TypeRecordingUnaryOpStub::GenerateGenericStub(MacroAssembler* masm) {
|
|
|
|
|
| void TypeRecordingUnaryOpStub::GenerateGenericStubSub(MacroAssembler* masm) {
|
| - NearLabel non_smi;
|
| - Label undo, slow;
|
| - GenerateSmiCodeSub(masm, &non_smi, &undo, &slow);
|
| + Label non_smi, undo, slow;
|
| + GenerateSmiCodeSub(masm, &non_smi, &undo, &slow, Label::kNear);
|
| __ bind(&non_smi);
|
| GenerateHeapNumberCodeSub(masm, &slow);
|
| __ bind(&undo);
|
| @@ -820,9 +819,8 @@ void TypeRecordingUnaryOpStub::GenerateGenericStubSub(MacroAssembler* masm) {
|
|
|
|
|
| void TypeRecordingUnaryOpStub::GenerateGenericStubBitNot(MacroAssembler* masm) {
|
| - NearLabel non_smi;
|
| - Label slow;
|
| - GenerateSmiCodeBitNot(masm, &non_smi);
|
| + Label non_smi, slow;
|
| + GenerateSmiCodeBitNot(masm, &non_smi, Label::kNear);
|
| __ bind(&non_smi);
|
| GenerateHeapNumberCodeBitNot(masm, &slow);
|
| __ bind(&slow);
|
| @@ -5620,8 +5618,7 @@ void StringCompareStub::GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
| Register length = scratch1;
|
|
|
| // Compare lengths.
|
| - NearLabel strings_not_equal;
|
| - Label check_zero_length;
|
| + Label strings_not_equal, check_zero_length;
|
| __ mov(length, FieldOperand(left, String::kLengthOffset));
|
| __ cmp(length, FieldOperand(right, String::kLengthOffset));
|
| __ j(equal, &check_zero_length, Label::kNear);
|
| @@ -5641,7 +5638,7 @@ void StringCompareStub::GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
| // Compare characters.
|
| __ bind(&compare_chars);
|
| GenerateAsciiCharsCompareLoop(masm, left, right, length, scratch2,
|
| - &strings_not_equal);
|
| + &strings_not_equal, Label::kNear);
|
|
|
| // Characters are equal.
|
| __ Set(eax, Immediate(Smi::FromInt(EQUAL)));
|
| @@ -5679,14 +5676,14 @@ void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
| __ j(zero, &compare_lengths, Label::kNear);
|
|
|
| // Compare characters.
|
| - NearLabel result_not_equal;
|
| + Label result_not_equal;
|
| GenerateAsciiCharsCompareLoop(masm, left, right, min_length, scratch2,
|
| - &result_not_equal);
|
| + &result_not_equal, Label::kNear);
|
|
|
| // Compare lengths - strings up to min-length are equal.
|
| __ bind(&compare_lengths);
|
| __ test(length_delta, Operand(length_delta));
|
| - __ j(not_zero, &result_not_equal);
|
| + __ j(not_zero, &result_not_equal, Label::kNear);
|
|
|
| // Result is EQUAL.
|
| STATIC_ASSERT(EQUAL == 0);
|
| @@ -5715,7 +5712,8 @@ void StringCompareStub::GenerateAsciiCharsCompareLoop(
|
| Register right,
|
| Register length,
|
| Register scratch,
|
| - NearLabel* chars_not_equal) {
|
| + Label* chars_not_equal,
|
| + Label::Distance chars_not_equal_near) {
|
| // Change index to run from -length to -1 by adding length to string
|
| // start. This means that loop ends when index reaches zero, which
|
| // doesn't need an additional compare.
|
| @@ -5732,7 +5730,7 @@ void StringCompareStub::GenerateAsciiCharsCompareLoop(
|
| __ bind(&loop);
|
| __ mov_b(scratch, Operand(left, index, times_1, 0));
|
| __ cmpb(scratch, Operand(right, index, times_1, 0));
|
| - __ j(not_equal, chars_not_equal);
|
| + __ j(not_equal, chars_not_equal, chars_not_equal_near);
|
| __ add(Operand(index), Immediate(1));
|
| __ j(not_zero, &loop);
|
| }
|
|
|