| Index: src/ia32/code-stubs-ia32.cc
|
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
|
| index 0392e1da7c2ea54817fd62c2f7647295b1d53687..71eb07a1703d78c874a14bbd0b7159db36841c04 100644
|
| --- a/src/ia32/code-stubs-ia32.cc
|
| +++ b/src/ia32/code-stubs-ia32.cc
|
| @@ -42,16 +42,16 @@ namespace internal {
|
|
|
| void ToNumberStub::Generate(MacroAssembler* masm) {
|
| // The ToNumber stub takes one argument in eax.
|
| - NearLabel check_heap_number, call_builtin;
|
| + Label check_heap_number, call_builtin;
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &check_heap_number);
|
| + __ j(not_zero, &check_heap_number, Label::kNear);
|
| __ ret(0);
|
|
|
| __ bind(&check_heap_number);
|
| __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset));
|
| Factory* factory = masm->isolate()->factory();
|
| __ cmp(Operand(ebx), Immediate(factory->heap_number_map()));
|
| - __ j(not_equal, &call_builtin);
|
| + __ j(not_equal, &call_builtin, Label::kNear);
|
| __ ret(0);
|
|
|
| __ bind(&call_builtin);
|
| @@ -242,13 +242,13 @@ void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) {
|
|
|
| // NOTE: The stub does not handle the inlined cases (Smis, Booleans, undefined).
|
| void ToBooleanStub::Generate(MacroAssembler* masm) {
|
| - NearLabel false_result, true_result, not_string;
|
| + Label false_result, true_result, not_string;
|
| __ mov(eax, Operand(esp, 1 * kPointerSize));
|
|
|
| // 'null' => false.
|
| Factory* factory = masm->isolate()->factory();
|
| __ cmp(eax, factory->null_value());
|
| - __ j(equal, &false_result);
|
| + __ j(equal, &false_result, Label::kNear);
|
|
|
| // Get the map and type of the heap object.
|
| __ mov(edx, FieldOperand(eax, HeapObject::kMapOffset));
|
| @@ -257,28 +257,28 @@ void ToBooleanStub::Generate(MacroAssembler* masm) {
|
| // Undetectable => false.
|
| __ test_b(FieldOperand(edx, Map::kBitFieldOffset),
|
| 1 << Map::kIsUndetectable);
|
| - __ j(not_zero, &false_result);
|
| + __ j(not_zero, &false_result, Label::kNear);
|
|
|
| // JavaScript object => true.
|
| __ CmpInstanceType(edx, FIRST_JS_OBJECT_TYPE);
|
| - __ j(above_equal, &true_result);
|
| + __ j(above_equal, &true_result, Label::kNear);
|
|
|
| // String value => false iff empty.
|
| __ CmpInstanceType(edx, FIRST_NONSTRING_TYPE);
|
| - __ j(above_equal, ¬_string);
|
| + __ j(above_equal, ¬_string, Label::kNear);
|
| STATIC_ASSERT(kSmiTag == 0);
|
| __ cmp(FieldOperand(eax, String::kLengthOffset), Immediate(0));
|
| - __ j(zero, &false_result);
|
| - __ jmp(&true_result);
|
| + __ j(zero, &false_result, Label::kNear);
|
| + __ jmp(&true_result, Label::kNear);
|
|
|
| __ bind(¬_string);
|
| // HeapNumber => false iff +0, -0, or NaN.
|
| __ cmp(edx, factory->heap_number_map());
|
| - __ j(not_equal, &true_result);
|
| + __ j(not_equal, &true_result, Label::kNear);
|
| __ fldz();
|
| __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset));
|
| __ FCmp();
|
| - __ j(zero, &false_result);
|
| + __ j(zero, &false_result, Label::kNear);
|
| // Fall through to |true_result|.
|
|
|
| // Return 1/0 for true/false in eax.
|
| @@ -506,12 +506,12 @@ static void IntegerConvert(MacroAssembler* masm,
|
| __ shr_cl(scratch2);
|
| // Now the unsigned answer is in scratch2. We need to move it to ecx and
|
| // we may need to fix the sign.
|
| - NearLabel negative;
|
| + Label negative;
|
| __ xor_(ecx, Operand(ecx));
|
| __ cmp(ecx, FieldOperand(source, HeapNumber::kExponentOffset));
|
| - __ j(greater, &negative);
|
| + __ j(greater, &negative, Label::kNear);
|
| __ mov(ecx, scratch2);
|
| - __ jmp(&done);
|
| + __ jmp(&done, Label::kNear);
|
| __ bind(&negative);
|
| __ sub(ecx, Operand(scratch2));
|
| __ bind(&done);
|
| @@ -751,10 +751,10 @@ void TypeRecordingUnaryOpStub::GenerateHeapNumberCodeBitNot(
|
| slow);
|
|
|
| // Do the bitwise operation and check if the result fits in a smi.
|
| - NearLabel try_float;
|
| + Label try_float;
|
| __ not_(ecx);
|
| __ cmp(ecx, 0xc0000000);
|
| - __ j(sign, &try_float);
|
| + __ j(sign, &try_float, Label::kNear);
|
|
|
| // Tag the result as a smi and we're done.
|
| STATIC_ASSERT(kSmiTagSize == 1);
|
| @@ -1020,7 +1020,7 @@ void TypeRecordingBinaryOpStub::GenerateSmiCode(MacroAssembler* masm,
|
| // 3. Perform the smi check of the operands.
|
| STATIC_ASSERT(kSmiTag == 0); // Adjust zero check if not the case.
|
| __ test(combined, Immediate(kSmiTagMask));
|
| - __ j(not_zero, ¬_smis, not_taken);
|
| + __ j(not_zero, ¬_smis, Label::kFar, not_taken);
|
|
|
| // 4. Operands are both smis, perform the operation leaving the result in
|
| // eax and check the result if necessary.
|
| @@ -1049,7 +1049,7 @@ void TypeRecordingBinaryOpStub::GenerateSmiCode(MacroAssembler* masm,
|
| __ shl_cl(left);
|
| // Check that the *signed* result fits in a smi.
|
| __ cmp(left, 0xc0000000);
|
| - __ j(sign, &use_fp_on_smis, not_taken);
|
| + __ j(sign, &use_fp_on_smis, Label::kFar, not_taken);
|
| // Tag the result and store it in register eax.
|
| __ SmiTag(left);
|
| __ mov(eax, left);
|
| @@ -1079,7 +1079,7 @@ void TypeRecordingBinaryOpStub::GenerateSmiCode(MacroAssembler* masm,
|
| // Smi tagging these two cases can only happen with shifts
|
| // by 0 or 1 when handed a valid smi.
|
| __ test(left, Immediate(0xc0000000));
|
| - __ j(not_zero, slow, not_taken);
|
| + __ j(not_zero, slow, Label::kFar, not_taken);
|
| // Tag the result and store it in register eax.
|
| __ SmiTag(left);
|
| __ mov(eax, left);
|
| @@ -1088,12 +1088,12 @@ void TypeRecordingBinaryOpStub::GenerateSmiCode(MacroAssembler* masm,
|
| case Token::ADD:
|
| ASSERT(right.is(eax));
|
| __ add(right, Operand(left)); // Addition is commutative.
|
| - __ j(overflow, &use_fp_on_smis, not_taken);
|
| + __ j(overflow, &use_fp_on_smis, Label::kFar, not_taken);
|
| break;
|
|
|
| case Token::SUB:
|
| __ sub(left, Operand(right));
|
| - __ j(overflow, &use_fp_on_smis, not_taken);
|
| + __ j(overflow, &use_fp_on_smis, Label::kFar, not_taken);
|
| __ mov(eax, left);
|
| break;
|
|
|
| @@ -1107,7 +1107,7 @@ void TypeRecordingBinaryOpStub::GenerateSmiCode(MacroAssembler* masm,
|
| __ SmiUntag(right);
|
| // Do multiplication.
|
| __ imul(right, Operand(left)); // Multiplication is commutative.
|
| - __ j(overflow, &use_fp_on_smis, not_taken);
|
| + __ j(overflow, &use_fp_on_smis, Label::kFar, not_taken);
|
| // Check for negative zero result. Use combined = left | right.
|
| __ NegativeZeroTest(right, combined, &use_fp_on_smis);
|
| break;
|
| @@ -1118,7 +1118,7 @@ void TypeRecordingBinaryOpStub::GenerateSmiCode(MacroAssembler* masm,
|
| __ mov(edi, left);
|
| // Check for 0 divisor.
|
| __ test(right, Operand(right));
|
| - __ j(zero, &use_fp_on_smis, not_taken);
|
| + __ j(zero, &use_fp_on_smis, Label::kFar, not_taken);
|
| // Sign extend left into edx:eax.
|
| ASSERT(left.is(eax));
|
| __ cdq();
|
| @@ -1142,7 +1142,7 @@ void TypeRecordingBinaryOpStub::GenerateSmiCode(MacroAssembler* masm,
|
| case Token::MOD:
|
| // Check for 0 divisor.
|
| __ test(right, Operand(right));
|
| - __ j(zero, ¬_smis, not_taken);
|
| + __ j(zero, ¬_smis, Label::kFar, not_taken);
|
|
|
| // Sign extend left into edx:eax.
|
| ASSERT(left.is(eax));
|
| @@ -1534,7 +1534,7 @@ void TypeRecordingBinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) {
|
| __ bind(&non_smi_result);
|
| // Allocate a heap number if needed.
|
| __ mov(ebx, Operand(eax)); // ebx: result
|
| - NearLabel skip_allocation;
|
| + Label skip_allocation;
|
| switch (mode_) {
|
| case OVERWRITE_LEFT:
|
| case OVERWRITE_RIGHT:
|
| @@ -1543,7 +1543,7 @@ void TypeRecordingBinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) {
|
| __ mov(eax, Operand(esp, mode_ == OVERWRITE_RIGHT ?
|
| 1 * kPointerSize : 2 * kPointerSize));
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &skip_allocation, not_taken);
|
| + __ j(not_zero, &skip_allocation, Label::kNear, not_taken);
|
| // Fall through!
|
| case NO_OVERWRITE:
|
| __ AllocateHeapNumber(eax, ecx, edx, &call_runtime);
|
| @@ -1622,8 +1622,6 @@ void TypeRecordingBinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) {
|
|
|
|
|
| void TypeRecordingBinaryOpStub::GenerateOddballStub(MacroAssembler* masm) {
|
| - Label call_runtime;
|
| -
|
| if (op_ == Token::ADD) {
|
| // Handle string addition here, because it is the only operation
|
| // that does not do a ToNumber conversion on the operands.
|
| @@ -1633,18 +1631,18 @@ void TypeRecordingBinaryOpStub::GenerateOddballStub(MacroAssembler* masm) {
|
| Factory* factory = masm->isolate()->factory();
|
|
|
| // Convert odd ball arguments to numbers.
|
| - NearLabel check, done;
|
| + Label check, done;
|
| __ cmp(edx, factory->undefined_value());
|
| - __ j(not_equal, &check);
|
| + __ j(not_equal, &check, Label::kNear);
|
| if (Token::IsBitOp(op_)) {
|
| __ xor_(edx, Operand(edx));
|
| } else {
|
| __ mov(edx, Immediate(factory->nan_value()));
|
| }
|
| - __ jmp(&done);
|
| + __ jmp(&done, Label::kNear);
|
| __ bind(&check);
|
| __ cmp(eax, factory->undefined_value());
|
| - __ j(not_equal, &done);
|
| + __ j(not_equal, &done, Label::kNear);
|
| if (Token::IsBitOp(op_)) {
|
| __ xor_(eax, Operand(eax));
|
| } else {
|
| @@ -1751,7 +1749,7 @@ void TypeRecordingBinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) {
|
| __ bind(&non_smi_result);
|
| // Allocate a heap number if needed.
|
| __ mov(ebx, Operand(eax)); // ebx: result
|
| - NearLabel skip_allocation;
|
| + Label skip_allocation;
|
| switch (mode_) {
|
| case OVERWRITE_LEFT:
|
| case OVERWRITE_RIGHT:
|
| @@ -1760,7 +1758,7 @@ void TypeRecordingBinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) {
|
| __ mov(eax, Operand(esp, mode_ == OVERWRITE_RIGHT ?
|
| 1 * kPointerSize : 2 * kPointerSize));
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &skip_allocation, not_taken);
|
| + __ j(not_zero, &skip_allocation, Label::kNear, not_taken);
|
| // Fall through!
|
| case NO_OVERWRITE:
|
| __ AllocateHeapNumber(eax, ecx, edx, &call_runtime);
|
| @@ -1951,7 +1949,7 @@ void TypeRecordingBinaryOpStub::GenerateGeneric(MacroAssembler* masm) {
|
| __ bind(&non_smi_result);
|
| // Allocate a heap number if needed.
|
| __ mov(ebx, Operand(eax)); // ebx: result
|
| - NearLabel skip_allocation;
|
| + Label skip_allocation;
|
| switch (mode_) {
|
| case OVERWRITE_LEFT:
|
| case OVERWRITE_RIGHT:
|
| @@ -1960,7 +1958,7 @@ void TypeRecordingBinaryOpStub::GenerateGeneric(MacroAssembler* masm) {
|
| __ mov(eax, Operand(esp, mode_ == OVERWRITE_RIGHT ?
|
| 1 * kPointerSize : 2 * kPointerSize));
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &skip_allocation, not_taken);
|
| + __ j(not_zero, &skip_allocation, Label::kNear, not_taken);
|
| // Fall through!
|
| case NO_OVERWRITE:
|
| __ AllocateHeapNumber(eax, ecx, edx, &call_runtime);
|
| @@ -2036,7 +2034,7 @@ void TypeRecordingBinaryOpStub::GenerateGeneric(MacroAssembler* masm) {
|
|
|
| void TypeRecordingBinaryOpStub::GenerateAddStrings(MacroAssembler* masm) {
|
| ASSERT(op_ == Token::ADD);
|
| - NearLabel left_not_string, call_runtime;
|
| + Label left_not_string, call_runtime;
|
|
|
| // Registers containing left and right operands respectively.
|
| Register left = edx;
|
| @@ -2044,9 +2042,9 @@ void TypeRecordingBinaryOpStub::GenerateAddStrings(MacroAssembler* masm) {
|
|
|
| // Test if left operand is a string.
|
| __ test(left, Immediate(kSmiTagMask));
|
| - __ j(zero, &left_not_string);
|
| + __ j(zero, &left_not_string, Label::kNear);
|
| __ CmpObjectType(left, FIRST_NONSTRING_TYPE, ecx);
|
| - __ j(above_equal, &left_not_string);
|
| + __ j(above_equal, &left_not_string, Label::kNear);
|
|
|
| StringAddStub string_add_left_stub(NO_STRING_CHECK_LEFT_IN_STUB);
|
| GenerateRegisterArgsPush(masm);
|
| @@ -2055,9 +2053,9 @@ void TypeRecordingBinaryOpStub::GenerateAddStrings(MacroAssembler* masm) {
|
| // Left operand is not a string, test right.
|
| __ bind(&left_not_string);
|
| __ test(right, Immediate(kSmiTagMask));
|
| - __ j(zero, &call_runtime);
|
| + __ j(zero, &call_runtime, Label::kNear);
|
| __ CmpObjectType(right, FIRST_NONSTRING_TYPE, ecx);
|
| - __ j(above_equal, &call_runtime);
|
| + __ j(above_equal, &call_runtime, Label::kNear);
|
|
|
| StringAddStub string_add_right_stub(NO_STRING_CHECK_RIGHT_IN_STUB);
|
| GenerateRegisterArgsPush(masm);
|
| @@ -2078,7 +2076,7 @@ void TypeRecordingBinaryOpStub::GenerateHeapResultAllocation(
|
| // If the argument in edx is already an object, we skip the
|
| // allocation of a heap number.
|
| __ test(edx, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &skip_allocation, not_taken);
|
| + __ j(not_zero, &skip_allocation, Label::kFar, not_taken);
|
| // Allocate a heap number for the result. Keep eax and edx intact
|
| // for the possible runtime call.
|
| __ AllocateHeapNumber(ebx, ecx, no_reg, alloc_failure);
|
| @@ -2094,7 +2092,7 @@ void TypeRecordingBinaryOpStub::GenerateHeapResultAllocation(
|
| // If the argument in eax is already an object, we skip the
|
| // allocation of a heap number.
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &skip_allocation, not_taken);
|
| + __ j(not_zero, &skip_allocation, Label::kFar, not_taken);
|
| // Fall through!
|
| case NO_OVERWRITE:
|
| // Allocate a heap number for the result. Keep eax and edx intact
|
| @@ -2138,11 +2136,11 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) {
|
| const bool tagged = (argument_type_ == TAGGED);
|
| if (tagged) {
|
| // Test that eax is a number.
|
| - NearLabel input_not_smi;
|
| - NearLabel loaded;
|
| + Label input_not_smi;
|
| + Label loaded;
|
| __ mov(eax, Operand(esp, kPointerSize));
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &input_not_smi);
|
| + __ j(not_zero, &input_not_smi, Label::kNear);
|
| // Input is a smi. Untag and load it onto the FPU stack.
|
| // Then load the low and high words of the double into ebx, edx.
|
| STATIC_ASSERT(kSmiTagSize == 1);
|
| @@ -2153,7 +2151,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) {
|
| __ fst_d(Operand(esp, 0));
|
| __ pop(edx);
|
| __ pop(ebx);
|
| - __ jmp(&loaded);
|
| + __ jmp(&loaded, Label::kNear);
|
| __ bind(&input_not_smi);
|
| // Check if input is a HeapNumber.
|
| __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset));
|
| @@ -2227,11 +2225,11 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) {
|
| __ lea(ecx, Operand(ecx, ecx, times_2, 0));
|
| __ lea(ecx, Operand(eax, ecx, times_4, 0));
|
| // Check if cache matches: Double value is stored in uint32_t[2] array.
|
| - NearLabel cache_miss;
|
| + Label cache_miss;
|
| __ cmp(ebx, Operand(ecx, 0));
|
| - __ j(not_equal, &cache_miss);
|
| + __ j(not_equal, &cache_miss, Label::kNear);
|
| __ cmp(edx, Operand(ecx, kIntSize));
|
| - __ j(not_equal, &cache_miss);
|
| + __ j(not_equal, &cache_miss, Label::kNear);
|
| // Cache hit!
|
| __ mov(eax, Operand(ecx, 2 * kIntSize));
|
| if (tagged) {
|
| @@ -2329,7 +2327,7 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) {
|
| // Both fsin and fcos require arguments in the range +/-2^63 and
|
| // return NaN for infinities and NaN. They can share all code except
|
| // the actual fsin/fcos operation.
|
| - NearLabel in_range, done;
|
| + Label in_range, done;
|
| // If argument is outside the range -2^63..2^63, fsin/cos doesn't
|
| // work. We must reduce it to the appropriate range.
|
| __ mov(edi, edx);
|
| @@ -2337,11 +2335,11 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) {
|
| int supported_exponent_limit =
|
| (63 + HeapNumber::kExponentBias) << HeapNumber::kExponentShift;
|
| __ cmp(Operand(edi), Immediate(supported_exponent_limit));
|
| - __ j(below, &in_range, taken);
|
| + __ j(below, &in_range, Label::kNear, taken);
|
| // Check for infinity and NaN. Both return NaN for sin.
|
| __ cmp(Operand(edi), Immediate(0x7ff00000));
|
| - NearLabel non_nan_result;
|
| - __ j(not_equal, &non_nan_result, taken);
|
| + Label non_nan_result;
|
| + __ j(not_equal, &non_nan_result, Label::kNear, taken);
|
| // Input is +/-Infinity or NaN. Result is NaN.
|
| __ fstp(0);
|
| // NaN is represented by 0x7ff8000000000000.
|
| @@ -2349,7 +2347,7 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) {
|
| __ push(Immediate(0));
|
| __ fld_d(Operand(esp, 0));
|
| __ add(Operand(esp), Immediate(2 * kPointerSize));
|
| - __ jmp(&done);
|
| + __ jmp(&done, Label::kNear);
|
|
|
| __ bind(&non_nan_result);
|
|
|
| @@ -2360,19 +2358,19 @@ void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) {
|
| __ fld(1);
|
| // FPU Stack: input, 2*pi, input.
|
| {
|
| - NearLabel no_exceptions;
|
| + Label no_exceptions;
|
| __ fwait();
|
| __ fnstsw_ax();
|
| // Clear if Illegal Operand or Zero Division exceptions are set.
|
| __ test(Operand(eax), Immediate(5));
|
| - __ j(zero, &no_exceptions);
|
| + __ j(zero, &no_exceptions, Label::kNear);
|
| __ fnclex();
|
| __ bind(&no_exceptions);
|
| }
|
|
|
| // Compute st(0) % st(1)
|
| {
|
| - NearLabel partial_remainder_loop;
|
| + Label partial_remainder_loop;
|
| __ bind(&partial_remainder_loop);
|
| __ fprem1();
|
| __ fwait();
|
| @@ -2554,12 +2552,12 @@ void FloatingPointHelper::CheckLoadedIntegersWereInt32(MacroAssembler* masm,
|
|
|
| void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm,
|
| Register number) {
|
| - NearLabel load_smi, done;
|
| + Label load_smi, done;
|
|
|
| __ test(number, Immediate(kSmiTagMask));
|
| - __ j(zero, &load_smi, not_taken);
|
| + __ j(zero, &load_smi, Label::kNear, not_taken);
|
| __ fld_d(FieldOperand(number, HeapNumber::kValueOffset));
|
| - __ jmp(&done);
|
| + __ jmp(&done, Label::kNear);
|
|
|
| __ bind(&load_smi);
|
| __ SmiUntag(number);
|
| @@ -2572,18 +2570,20 @@ void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm,
|
|
|
|
|
| void FloatingPointHelper::LoadSSE2Operands(MacroAssembler* masm) {
|
| - NearLabel load_smi_edx, load_eax, load_smi_eax, done;
|
| + Label load_smi_edx, load_eax, load_smi_eax, done;
|
| // Load operand in edx into xmm0.
|
| __ test(edx, Immediate(kSmiTagMask));
|
| - __ j(zero, &load_smi_edx, not_taken); // Argument in edx is a smi.
|
| + // Argument in edx is a smi.
|
| + __ j(zero, &load_smi_edx, Label::kNear, not_taken);
|
| __ movdbl(xmm0, FieldOperand(edx, HeapNumber::kValueOffset));
|
|
|
| __ bind(&load_eax);
|
| // Load operand in eax into xmm1.
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(zero, &load_smi_eax, not_taken); // Argument in eax is a smi.
|
| + // Argument in eax is a smi.
|
| + __ j(zero, &load_smi_eax, Label::kNear, not_taken);
|
| __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset));
|
| - __ jmp(&done);
|
| + __ jmp(&done, Label::kNear);
|
|
|
| __ bind(&load_smi_edx);
|
| __ SmiUntag(edx); // Untag smi before converting to float.
|
| @@ -2602,10 +2602,11 @@ void FloatingPointHelper::LoadSSE2Operands(MacroAssembler* masm) {
|
|
|
| void FloatingPointHelper::LoadSSE2Operands(MacroAssembler* masm,
|
| Label* not_numbers) {
|
| - NearLabel load_smi_edx, load_eax, load_smi_eax, load_float_eax, done;
|
| + Label load_smi_edx, load_eax, load_smi_eax, load_float_eax, done;
|
| // Load operand in edx into xmm0, or branch to not_numbers.
|
| __ test(edx, Immediate(kSmiTagMask));
|
| - __ j(zero, &load_smi_edx, not_taken); // Argument in edx is a smi.
|
| + // Argument in edx is a smi.
|
| + __ j(zero, &load_smi_edx, Label::kNear, not_taken);
|
| Factory* factory = masm->isolate()->factory();
|
| __ cmp(FieldOperand(edx, HeapObject::kMapOffset), factory->heap_number_map());
|
| __ j(not_equal, not_numbers); // Argument in edx is not a number.
|
| @@ -2613,9 +2614,10 @@ void FloatingPointHelper::LoadSSE2Operands(MacroAssembler* masm,
|
| __ bind(&load_eax);
|
| // Load operand in eax into xmm1, or branch to not_numbers.
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(zero, &load_smi_eax, not_taken); // Argument in eax is a smi.
|
| + // Argument in eax is a smi.
|
| + __ j(zero, &load_smi_eax, Label::kNear, not_taken);
|
| __ cmp(FieldOperand(eax, HeapObject::kMapOffset), factory->heap_number_map());
|
| - __ j(equal, &load_float_eax);
|
| + __ j(equal, &load_float_eax, Label::kNear);
|
| __ jmp(not_numbers); // Argument in eax is not a number.
|
| __ bind(&load_smi_edx);
|
| __ SmiUntag(edx); // Untag smi before converting to float.
|
| @@ -2626,7 +2628,7 @@ void FloatingPointHelper::LoadSSE2Operands(MacroAssembler* masm,
|
| __ SmiUntag(eax); // Untag smi before converting to float.
|
| __ cvtsi2sd(xmm1, Operand(eax));
|
| __ SmiTag(eax); // Retag smi for heap number overwriting test.
|
| - __ jmp(&done);
|
| + __ jmp(&done, Label::kNear);
|
| __ bind(&load_float_eax);
|
| __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset));
|
| __ bind(&done);
|
| @@ -2667,14 +2669,14 @@ void FloatingPointHelper::CheckSSE2OperandsAreInt32(MacroAssembler* masm,
|
| void FloatingPointHelper::LoadFloatOperands(MacroAssembler* masm,
|
| Register scratch,
|
| ArgLocation arg_location) {
|
| - NearLabel load_smi_1, load_smi_2, done_load_1, done;
|
| + Label load_smi_1, load_smi_2, done_load_1, done;
|
| if (arg_location == ARGS_IN_REGISTERS) {
|
| __ mov(scratch, edx);
|
| } else {
|
| __ mov(scratch, Operand(esp, 2 * kPointerSize));
|
| }
|
| __ test(scratch, Immediate(kSmiTagMask));
|
| - __ j(zero, &load_smi_1, not_taken);
|
| + __ j(zero, &load_smi_1, Label::kNear, not_taken);
|
| __ fld_d(FieldOperand(scratch, HeapNumber::kValueOffset));
|
| __ bind(&done_load_1);
|
|
|
| @@ -2684,9 +2686,9 @@ void FloatingPointHelper::LoadFloatOperands(MacroAssembler* masm,
|
| __ mov(scratch, Operand(esp, 1 * kPointerSize));
|
| }
|
| __ test(scratch, Immediate(kSmiTagMask));
|
| - __ j(zero, &load_smi_2, not_taken);
|
| + __ j(zero, &load_smi_2, Label::kNear, not_taken);
|
| __ fld_d(FieldOperand(scratch, HeapNumber::kValueOffset));
|
| - __ jmp(&done);
|
| + __ jmp(&done, Label::kNear);
|
|
|
| __ bind(&load_smi_1);
|
| __ SmiUntag(scratch);
|
| @@ -2726,11 +2728,11 @@ void FloatingPointHelper::LoadFloatSmis(MacroAssembler* masm,
|
| void FloatingPointHelper::CheckFloatOperands(MacroAssembler* masm,
|
| Label* non_float,
|
| Register scratch) {
|
| - NearLabel test_other, done;
|
| + Label test_other, done;
|
| // Test if both operands are floats or smi -> scratch=k_is_float;
|
| // Otherwise scratch = k_not_float.
|
| __ test(edx, Immediate(kSmiTagMask));
|
| - __ j(zero, &test_other, not_taken); // argument in edx is OK
|
| + __ j(zero, &test_other, Label::kNear, not_taken); // argument in edx is OK
|
| __ mov(scratch, FieldOperand(edx, HeapObject::kMapOffset));
|
| Factory* factory = masm->isolate()->factory();
|
| __ cmp(scratch, factory->heap_number_map());
|
| @@ -2738,7 +2740,7 @@ void FloatingPointHelper::CheckFloatOperands(MacroAssembler* masm,
|
|
|
| __ bind(&test_other);
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(zero, &done); // argument in eax is OK
|
| + __ j(zero, &done, Label::kNear); // argument in eax is OK
|
| __ mov(scratch, FieldOperand(eax, HeapObject::kMapOffset));
|
| __ cmp(scratch, factory->heap_number_map());
|
| __ j(not_equal, non_float); // argument in eax is not a number -> NaN
|
| @@ -2803,20 +2805,20 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
| __ mov(edx, eax);
|
|
|
| // Get absolute value of exponent.
|
| - NearLabel no_neg;
|
| + Label no_neg;
|
| __ cmp(eax, 0);
|
| - __ j(greater_equal, &no_neg);
|
| + __ j(greater_equal, &no_neg, Label::kNear);
|
| __ neg(eax);
|
| __ bind(&no_neg);
|
|
|
| // Load xmm1 with 1.
|
| __ movsd(xmm1, xmm3);
|
| - NearLabel while_true;
|
| - NearLabel no_multiply;
|
| + Label while_true;
|
| + Label no_multiply;
|
|
|
| __ bind(&while_true);
|
| __ shr(eax, 1);
|
| - __ j(not_carry, &no_multiply);
|
| + __ j(not_carry, &no_multiply, Label::kNear);
|
| __ mulsd(xmm1, xmm0);
|
| __ bind(&no_multiply);
|
| __ mulsd(xmm0, xmm0);
|
| @@ -2847,13 +2849,13 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
| __ ucomisd(xmm1, xmm1);
|
| __ j(parity_even, &call_runtime);
|
|
|
| - NearLabel base_not_smi;
|
| - NearLabel handle_special_cases;
|
| + Label base_not_smi;
|
| + Label handle_special_cases;
|
| __ test(edx, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &base_not_smi);
|
| + __ j(not_zero, &base_not_smi, Label::kNear);
|
| __ SmiUntag(edx);
|
| __ cvtsi2sd(xmm0, Operand(edx));
|
| - __ jmp(&handle_special_cases);
|
| + __ jmp(&handle_special_cases, Label::kNear);
|
|
|
| __ bind(&base_not_smi);
|
| __ cmp(FieldOperand(edx, HeapObject::kMapOffset),
|
| @@ -2868,7 +2870,7 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
|
|
| // base is in xmm0 and exponent is in xmm1.
|
| __ bind(&handle_special_cases);
|
| - NearLabel not_minus_half;
|
| + Label not_minus_half;
|
| // Test for -0.5.
|
| // Load xmm2 with -0.5.
|
| __ mov(ecx, Immediate(0xBF000000));
|
| @@ -2876,7 +2878,7 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
| __ cvtss2sd(xmm2, xmm2);
|
| // xmm2 now has -0.5.
|
| __ ucomisd(xmm2, xmm1);
|
| - __ j(not_equal, ¬_minus_half);
|
| + __ j(not_equal, ¬_minus_half, Label::kNear);
|
|
|
| // Calculates reciprocal of square root.
|
| // sqrtsd returns -0 when input is -0. ECMA spec requires +0.
|
| @@ -2923,20 +2925,20 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
|
| // Check that the key is a smi.
|
| Label slow;
|
| __ test(edx, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &slow, not_taken);
|
| + __ j(not_zero, &slow, Label::kFar, not_taken);
|
|
|
| // Check if the calling frame is an arguments adaptor frame.
|
| - NearLabel adaptor;
|
| + Label adaptor;
|
| __ mov(ebx, Operand(ebp, StandardFrameConstants::kCallerFPOffset));
|
| __ mov(ecx, Operand(ebx, StandardFrameConstants::kContextOffset));
|
| __ cmp(Operand(ecx), Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
|
| - __ j(equal, &adaptor);
|
| + __ j(equal, &adaptor, Label::kNear);
|
|
|
| // Check index against formal parameters count limit passed in
|
| // through register eax. Use unsigned comparison to get negative
|
| // check for free.
|
| __ cmp(edx, Operand(eax));
|
| - __ j(above_equal, &slow, not_taken);
|
| + __ j(above_equal, &slow, Label::kFar, not_taken);
|
|
|
| // Read the argument from the stack and return it.
|
| STATIC_ASSERT(kSmiTagSize == 1);
|
| @@ -2952,7 +2954,7 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
|
| __ bind(&adaptor);
|
| __ mov(ecx, Operand(ebx, ArgumentsAdaptorFrameConstants::kLengthOffset));
|
| __ cmp(edx, Operand(ecx));
|
| - __ j(above_equal, &slow, not_taken);
|
| + __ j(above_equal, &slow, Label::kFar, not_taken);
|
|
|
| // Read the argument from the stack and return it.
|
| STATIC_ASSERT(kSmiTagSize == 1);
|
| @@ -3003,10 +3005,10 @@ void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) {
|
|
|
| // Try the new space allocation. Start out with computing the size of
|
| // the arguments object and the elements array.
|
| - NearLabel add_arguments_object;
|
| + Label add_arguments_object;
|
| __ bind(&try_allocate);
|
| __ test(ecx, Operand(ecx));
|
| - __ j(zero, &add_arguments_object);
|
| + __ j(zero, &add_arguments_object, Label::kNear);
|
| __ lea(ecx, Operand(ecx, times_2, FixedArray::kHeaderSize));
|
| __ bind(&add_arguments_object);
|
| __ add(Operand(ecx), Immediate(GetArgumentsObjectSize()));
|
| @@ -3062,7 +3064,7 @@ void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) {
|
| __ SmiUntag(ecx);
|
|
|
| // Copy the fixed array slots.
|
| - NearLabel loop;
|
| + Label loop;
|
| __ bind(&loop);
|
| __ mov(ebx, Operand(edx, -1 * kPointerSize)); // Skip receiver.
|
| __ mov(FieldOperand(edi, FixedArray::kHeaderSize), ebx);
|
| @@ -3115,7 +3117,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
| ExternalReference::address_of_regexp_stack_memory_size(masm->isolate());
|
| __ mov(ebx, Operand::StaticVariable(address_of_regexp_stack_memory_size));
|
| __ test(ebx, Operand(ebx));
|
| - __ j(zero, &runtime, not_taken);
|
| + __ j(zero, &runtime, Label::kFar, not_taken);
|
|
|
| // Check that the first argument is a JSRegExp object.
|
| __ mov(eax, Operand(esp, kJSRegExpOffset));
|
| @@ -3299,16 +3301,16 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
| // Argument 4: End of string data
|
| // Argument 3: Start of string data
|
| - NearLabel setup_two_byte, setup_rest;
|
| + Label setup_two_byte, setup_rest;
|
| __ test(edi, Operand(edi));
|
| __ mov(edi, FieldOperand(eax, String::kLengthOffset));
|
| - __ j(zero, &setup_two_byte);
|
| + __ j(zero, &setup_two_byte, Label::kNear);
|
| __ SmiUntag(edi);
|
| __ lea(ecx, FieldOperand(eax, edi, times_1, SeqAsciiString::kHeaderSize));
|
| __ mov(Operand(esp, 3 * kPointerSize), ecx); // Argument 4.
|
| __ lea(ecx, FieldOperand(eax, ebx, times_1, SeqAsciiString::kHeaderSize));
|
| __ mov(Operand(esp, 2 * kPointerSize), ecx); // Argument 3.
|
| - __ jmp(&setup_rest);
|
| + __ jmp(&setup_rest, Label::kNear);
|
|
|
| __ bind(&setup_two_byte);
|
| STATIC_ASSERT(kSmiTag == 0);
|
| @@ -3336,10 +3338,10 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
| // Check the result.
|
| Label success;
|
| __ cmp(eax, NativeRegExpMacroAssembler::SUCCESS);
|
| - __ j(equal, &success, taken);
|
| + __ j(equal, &success, Label::kFar, taken);
|
| Label failure;
|
| __ cmp(eax, NativeRegExpMacroAssembler::FAILURE);
|
| - __ j(equal, &failure, taken);
|
| + __ j(equal, &failure, Label::kFar, taken);
|
| __ cmp(eax, NativeRegExpMacroAssembler::EXCEPTION);
|
| // If not exception it can only be retry. Handle that in the runtime system.
|
| __ j(not_equal, &runtime);
|
| @@ -3416,12 +3418,12 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
| // ebx: last_match_info backing store (FixedArray)
|
| // ecx: offsets vector
|
| // edx: number of capture registers
|
| - NearLabel next_capture, done;
|
| + Label next_capture, done;
|
| // Capture register counter starts from number of capture registers and
|
| // counts down until wraping after zero.
|
| __ bind(&next_capture);
|
| __ sub(Operand(edx), Immediate(1));
|
| - __ j(negative, &done);
|
| + __ j(negative, &done, Label::kNear);
|
| // Read the value from the static offsets vector buffer.
|
| __ mov(edi, Operand(ecx, edx, times_int_size, 0));
|
| __ SmiTag(edi);
|
| @@ -3448,7 +3450,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
| void RegExpConstructResultStub::Generate(MacroAssembler* masm) {
|
| const int kMaxInlineLength = 100;
|
| Label slowcase;
|
| - NearLabel done;
|
| + Label done;
|
| __ mov(ebx, Operand(esp, kPointerSize * 3));
|
| __ test(ebx, Immediate(kSmiTagMask));
|
| __ j(not_zero, &slowcase);
|
| @@ -3514,7 +3516,7 @@ void RegExpConstructResultStub::Generate(MacroAssembler* masm) {
|
| Label loop;
|
| __ test(ecx, Operand(ecx));
|
| __ bind(&loop);
|
| - __ j(less_equal, &done); // Jump if ecx is negative or zero.
|
| + __ j(less_equal, &done, Label::kNear); // Jump if ecx is negative or zero.
|
| __ sub(Operand(ecx), Immediate(1));
|
| __ mov(Operand(ebx, ecx, times_pointer_size, 0), edx);
|
| __ jmp(&loop);
|
| @@ -3555,19 +3557,19 @@ void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm,
|
| // number string cache for smis is just the smi value, and the hash for
|
| // doubles is the xor of the upper and lower words. See
|
| // Heap::GetNumberStringCache.
|
| - NearLabel smi_hash_calculated;
|
| - NearLabel load_result_from_cache;
|
| + Label smi_hash_calculated;
|
| + Label load_result_from_cache;
|
| if (object_is_smi) {
|
| __ mov(scratch, object);
|
| __ SmiUntag(scratch);
|
| } else {
|
| - NearLabel not_smi, hash_calculated;
|
| + Label not_smi;
|
| STATIC_ASSERT(kSmiTag == 0);
|
| __ test(object, Immediate(kSmiTagMask));
|
| - __ j(not_zero, ¬_smi);
|
| + __ j(not_zero, ¬_smi, Label::kNear);
|
| __ mov(scratch, object);
|
| __ SmiUntag(scratch);
|
| - __ jmp(&smi_hash_calculated);
|
| + __ jmp(&smi_hash_calculated, Label::kNear);
|
| __ bind(¬_smi);
|
| __ cmp(FieldOperand(object, HeapObject::kMapOffset),
|
| masm->isolate()->factory()->heap_number_map());
|
| @@ -3598,7 +3600,7 @@ void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm,
|
| }
|
| __ j(parity_even, not_found); // Bail out if NaN is involved.
|
| __ j(not_equal, not_found); // The cache did not contain this value.
|
| - __ jmp(&load_result_from_cache);
|
| + __ jmp(&load_result_from_cache, Label::kNear);
|
| }
|
|
|
| __ bind(&smi_hash_calculated);
|
| @@ -3658,7 +3660,7 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| __ mov(ecx, Operand(edx));
|
| __ or_(ecx, Operand(eax));
|
| __ test(ecx, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &non_smi, not_taken);
|
| + __ j(not_zero, &non_smi, Label::kFar, not_taken);
|
| __ sub(edx, Operand(eax)); // Return on the result of the subtraction.
|
| __ j(no_overflow, &smi_done);
|
| __ not_(edx); // Correct sign in case of overflow. edx is never 0 here.
|
| @@ -3686,9 +3688,9 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| if (cc_ != equal) {
|
| // Check for undefined. undefined OP undefined is false even though
|
| // undefined == undefined.
|
| - NearLabel check_for_nan;
|
| + Label check_for_nan;
|
| __ cmp(edx, masm->isolate()->factory()->undefined_value());
|
| - __ j(not_equal, &check_for_nan);
|
| + __ j(not_equal, &check_for_nan, Label::kNear);
|
| __ Set(eax, Immediate(Smi::FromInt(NegativeComparisonResult(cc_))));
|
| __ ret(0);
|
| __ bind(&check_for_nan);
|
| @@ -3701,10 +3703,10 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| __ Set(eax, Immediate(Smi::FromInt(EQUAL)));
|
| __ ret(0);
|
| } else {
|
| - NearLabel heap_number;
|
| + Label heap_number;
|
| __ cmp(FieldOperand(edx, HeapObject::kMapOffset),
|
| Immediate(masm->isolate()->factory()->heap_number_map()));
|
| - __ j(equal, &heap_number);
|
| + __ j(equal, &heap_number, Label::kNear);
|
| if (cc_ != equal) {
|
| // Call runtime on identical JSObjects. Otherwise return equal.
|
| __ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, ecx);
|
| @@ -3736,8 +3738,8 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| __ setcc(above_equal, eax);
|
| __ ret(0);
|
| } else {
|
| - NearLabel nan;
|
| - __ j(above_equal, &nan);
|
| + Label nan;
|
| + __ j(above_equal, &nan, Label::kNear);
|
| __ Set(eax, Immediate(Smi::FromInt(EQUAL)));
|
| __ ret(0);
|
| __ bind(&nan);
|
| @@ -3753,7 +3755,7 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| // Non-strict object equality is slower, so it is handled later in the stub.
|
| if (cc_ == equal && strict_) {
|
| Label slow; // Fallthrough label.
|
| - NearLabel not_smis;
|
| + Label not_smis;
|
| // If we're doing a strict equality comparison, we don't have to do
|
| // type conversion, so we generate code to do fast comparison for objects
|
| // and oddballs. Non-smi numbers and strings still go through the usual
|
| @@ -3765,7 +3767,7 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| __ mov(ecx, Immediate(kSmiTagMask));
|
| __ and_(ecx, Operand(eax));
|
| __ test(ecx, Operand(edx));
|
| - __ j(not_zero, ¬_smis);
|
| + __ j(not_zero, ¬_smis, Label::kNear);
|
| // One operand is a smi.
|
|
|
| // Check whether the non-smi is a heap number.
|
| @@ -3794,13 +3796,13 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
|
|
| // Get the type of the first operand.
|
| // If the first object is a JS object, we have done pointer comparison.
|
| - NearLabel first_non_object;
|
| + Label first_non_object;
|
| STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| __ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, ecx);
|
| - __ j(below, &first_non_object);
|
| + __ j(below, &first_non_object, Label::kNear);
|
|
|
| // Return non-zero (eax is not zero)
|
| - NearLabel return_not_equal;
|
| + Label return_not_equal;
|
| STATIC_ASSERT(kHeapObjectTag != 0);
|
| __ bind(&return_not_equal);
|
| __ ret(0);
|
| @@ -3833,7 +3835,7 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| __ ucomisd(xmm0, xmm1);
|
|
|
| // Don't base result on EFLAGS when a NaN is involved.
|
| - __ j(parity_even, &unordered, not_taken);
|
| + __ j(parity_even, &unordered, Label::kFar, not_taken);
|
| // Return a result of -1, 0, or 1, based on EFLAGS.
|
| __ mov(eax, 0); // equal
|
| __ mov(ecx, Immediate(Smi::FromInt(1)));
|
| @@ -3849,12 +3851,12 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| __ FCmp();
|
|
|
| // Don't base result on EFLAGS when a NaN is involved.
|
| - __ j(parity_even, &unordered, not_taken);
|
| + __ j(parity_even, &unordered, Label::kFar, not_taken);
|
|
|
| - NearLabel below_label, above_label;
|
| + Label below_label, above_label;
|
| // Return a result of -1, 0, or 1, based on EFLAGS.
|
| - __ j(below, &below_label, not_taken);
|
| - __ j(above, &above_label, not_taken);
|
| + __ j(below, &below_label, Label::kNear, not_taken);
|
| + __ j(above, &above_label, Label::kNear, not_taken);
|
|
|
| __ Set(eax, Immediate(0));
|
| __ ret(0);
|
| @@ -3924,8 +3926,8 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| // Non-strict equality. Objects are unequal if
|
| // they are both JSObjects and not undetectable,
|
| // and their pointers are different.
|
| - NearLabel not_both_objects;
|
| - NearLabel return_unequal;
|
| + Label not_both_objects;
|
| + Label return_unequal;
|
| // At most one is a smi, so we can test for smi by adding the two.
|
| // A smi plus a heap object has the low bit set, a heap object plus
|
| // a heap object has the low bit clear.
|
| @@ -3933,20 +3935,20 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
| STATIC_ASSERT(kSmiTagMask == 1);
|
| __ lea(ecx, Operand(eax, edx, times_1, 0));
|
| __ test(ecx, Immediate(kSmiTagMask));
|
| - __ j(not_zero, ¬_both_objects);
|
| + __ j(not_zero, ¬_both_objects, Label::kNear);
|
| __ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, ecx);
|
| - __ j(below, ¬_both_objects);
|
| + __ j(below, ¬_both_objects, Label::kNear);
|
| __ CmpObjectType(edx, FIRST_JS_OBJECT_TYPE, ebx);
|
| - __ j(below, ¬_both_objects);
|
| + __ j(below, ¬_both_objects, Label::kNear);
|
| // We do not bail out after this point. Both are JSObjects, and
|
| // they are equal if and only if both are undetectable.
|
| // The and of the undetectable flags is 1 if and only if they are equal.
|
| __ test_b(FieldOperand(ecx, Map::kBitFieldOffset),
|
| 1 << Map::kIsUndetectable);
|
| - __ j(zero, &return_unequal);
|
| + __ j(zero, &return_unequal, Label::kNear);
|
| __ test_b(FieldOperand(ebx, Map::kBitFieldOffset),
|
| 1 << Map::kIsUndetectable);
|
| - __ j(zero, &return_unequal);
|
| + __ j(zero, &return_unequal, Label::kNear);
|
| // The objects are both undetectable, so they both compare as the value
|
| // undefined, and are equal.
|
| __ Set(eax, Immediate(EQUAL));
|
| @@ -4012,7 +4014,7 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
|
|
| // Check if receiver is a smi (which is a number value).
|
| __ test(eax, Immediate(kSmiTagMask));
|
| - __ j(zero, &receiver_is_value, not_taken);
|
| + __ j(zero, &receiver_is_value, Label::kFar, not_taken);
|
|
|
| // Check if the receiver is a valid JS object.
|
| __ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, edi);
|
| @@ -4035,10 +4037,10 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
|
|
| // Check that the function really is a JavaScript function.
|
| __ test(edi, Immediate(kSmiTagMask));
|
| - __ j(zero, &slow, not_taken);
|
| + __ j(zero, &slow, Label::kFar, not_taken);
|
| // Goto slow case if we do not have a function.
|
| __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx);
|
| - __ j(not_equal, &slow, not_taken);
|
| + __ j(not_equal, &slow, Label::kFar, not_taken);
|
|
|
| // Fast-case: Just invoke the function.
|
| ParameterCount actual(argc_);
|
| @@ -4119,9 +4121,9 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
| // Make sure we're not trying to return 'the hole' from the runtime
|
| // call as this may lead to crashes in the IC code later.
|
| if (FLAG_debug_code) {
|
| - NearLabel okay;
|
| + Label okay;
|
| __ cmp(eax, masm->isolate()->factory()->the_hole_value());
|
| - __ j(not_equal, &okay);
|
| + __ j(not_equal, &okay, Label::kNear);
|
| __ int3();
|
| __ bind(&okay);
|
| }
|
| @@ -4132,7 +4134,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
| __ lea(ecx, Operand(eax, 1));
|
| // Lower 2 bits of ecx are 0 iff eax has failure tag.
|
| __ test(ecx, Immediate(kFailureTagMask));
|
| - __ j(zero, &failure_returned, not_taken);
|
| + __ j(zero, &failure_returned, Label::kFar, not_taken);
|
|
|
| ExternalReference pending_exception_address(
|
| Isolate::k_pending_exception_address, masm->isolate());
|
| @@ -4143,10 +4145,10 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
| __ push(edx);
|
| __ mov(edx, Operand::StaticVariable(
|
| ExternalReference::the_hole_value_location(masm->isolate())));
|
| - NearLabel okay;
|
| + Label okay;
|
| __ cmp(edx, Operand::StaticVariable(pending_exception_address));
|
| // Cannot use check here as it attempts to generate call into runtime.
|
| - __ j(equal, &okay);
|
| + __ j(equal, &okay, Label::kNear);
|
| __ int3();
|
| __ bind(&okay);
|
| __ pop(edx);
|
| @@ -4163,7 +4165,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
| // If the returned exception is RETRY_AFTER_GC continue at retry label
|
| STATIC_ASSERT(Failure::RETRY_AFTER_GC == 0);
|
| __ test(eax, Immediate(((1 << kFailureTypeTagSize) - 1) << kFailureTagSize));
|
| - __ j(zero, &retry, taken);
|
| + __ j(zero, &retry, Label::kFar, taken);
|
|
|
| // Special handling of out of memory exceptions.
|
| __ cmp(eax, reinterpret_cast<int32_t>(Failure::OutOfMemoryException()));
|
| @@ -4417,22 +4419,22 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
|
|
| // Check that the left hand is a JS object.
|
| __ test(object, Immediate(kSmiTagMask));
|
| - __ j(zero, ¬_js_object, not_taken);
|
| + __ j(zero, ¬_js_object, Label::kFar, not_taken);
|
| __ IsObjectJSObjectType(object, map, scratch, ¬_js_object);
|
|
|
| // If there is a call site cache don't look in the global cache, but do the
|
| // real lookup and update the call site cache.
|
| if (!HasCallSiteInlineCheck()) {
|
| // Look up the function and the map in the instanceof cache.
|
| - NearLabel miss;
|
| + Label miss;
|
| __ mov(scratch, Immediate(Heap::kInstanceofCacheFunctionRootIndex));
|
| __ cmp(function,
|
| Operand::StaticArray(scratch, times_pointer_size, roots_address));
|
| - __ j(not_equal, &miss);
|
| + __ j(not_equal, &miss, Label::kNear);
|
| __ mov(scratch, Immediate(Heap::kInstanceofCacheMapRootIndex));
|
| __ cmp(map, Operand::StaticArray(
|
| scratch, times_pointer_size, roots_address));
|
| - __ j(not_equal, &miss);
|
| + __ j(not_equal, &miss, Label::kNear);
|
| __ mov(scratch, Immediate(Heap::kInstanceofCacheAnswerRootIndex));
|
| __ mov(eax, Operand::StaticArray(
|
| scratch, times_pointer_size, roots_address));
|
| @@ -4445,7 +4447,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
|
|
| // Check that the function prototype is a JS object.
|
| __ test(prototype, Immediate(kSmiTagMask));
|
| - __ j(zero, &slow, not_taken);
|
| + __ j(zero, &slow, Label::kFar, not_taken);
|
| __ IsObjectJSObjectType(prototype, scratch, scratch, &slow);
|
|
|
| // Update the global instanceof or call site inlined cache with the current
|
| @@ -4475,13 +4477,13 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
| // Loop through the prototype chain of the object looking for the function
|
| // prototype.
|
| __ mov(scratch, FieldOperand(map, Map::kPrototypeOffset));
|
| - NearLabel loop, is_instance, is_not_instance;
|
| + Label loop, is_instance, is_not_instance;
|
| __ bind(&loop);
|
| __ cmp(scratch, Operand(prototype));
|
| - __ j(equal, &is_instance);
|
| + __ j(equal, &is_instance, Label::kNear);
|
| Factory* factory = masm->isolate()->factory();
|
| __ cmp(Operand(scratch), Immediate(factory->null_value()));
|
| - __ j(equal, &is_not_instance);
|
| + __ j(equal, &is_not_instance, Label::kNear);
|
| __ mov(scratch, FieldOperand(scratch, HeapObject::kMapOffset));
|
| __ mov(scratch, FieldOperand(scratch, Map::kPrototypeOffset));
|
| __ jmp(&loop);
|
| @@ -4535,9 +4537,9 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
| // Before null, smi and string value checks, check that the rhs is a function
|
| // as for a non-function rhs an exception needs to be thrown.
|
| __ test(function, Immediate(kSmiTagMask));
|
| - __ j(zero, &slow, not_taken);
|
| + __ j(zero, &slow, Label::kFar, not_taken);
|
| __ CmpObjectType(function, JS_FUNCTION_TYPE, scratch);
|
| - __ j(not_equal, &slow, not_taken);
|
| + __ j(not_equal, &slow, Label::kFar, not_taken);
|
|
|
| // Null is not instance of anything.
|
| __ cmp(object, factory->null_value());
|
| @@ -4548,7 +4550,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
| __ bind(&object_not_null);
|
| // Smi values is not instance of anything.
|
| __ test(object, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &object_not_null_or_smi, not_taken);
|
| + __ j(not_zero, &object_not_null_or_smi, Label::kFar, not_taken);
|
| __ Set(eax, Immediate(Smi::FromInt(1)));
|
| __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize);
|
|
|
| @@ -4578,11 +4580,11 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
| __ push(function);
|
| __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION);
|
| __ LeaveInternalFrame();
|
| - NearLabel true_value, done;
|
| + Label true_value, done;
|
| __ test(eax, Operand(eax));
|
| - __ j(zero, &true_value);
|
| + __ j(zero, &true_value, Label::kNear);
|
| __ mov(eax, factory->false_value());
|
| - __ jmp(&done);
|
| + __ jmp(&done, Label::kNear);
|
| __ bind(&true_value);
|
| __ mov(eax, factory->true_value());
|
| __ bind(&done);
|
| @@ -4820,7 +4822,7 @@ void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
|
| __ test(code_,
|
| Immediate(kSmiTagMask |
|
| ((~String::kMaxAsciiCharCode) << kSmiTagSize)));
|
| - __ j(not_zero, &slow_case_, not_taken);
|
| + __ j(not_zero, &slow_case_, Label::kFar, not_taken);
|
|
|
| Factory* factory = masm->isolate()->factory();
|
| __ Set(result_, Immediate(factory->single_character_string_cache()));
|
| @@ -4832,7 +4834,7 @@ void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
|
| code_, times_half_pointer_size,
|
| FixedArray::kHeaderSize));
|
| __ cmp(result_, factory->undefined_value());
|
| - __ j(equal, &slow_case_, not_taken);
|
| + __ j(equal, &slow_case_, Label::kFar, not_taken);
|
| __ bind(&exit_);
|
| }
|
|
|
| @@ -4911,11 +4913,11 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| // eax: first string
|
| // edx: second string
|
| // Check if either of the strings are empty. In that case return the other.
|
| - NearLabel second_not_zero_length, both_not_zero_length;
|
| + Label second_not_zero_length, both_not_zero_length;
|
| __ mov(ecx, FieldOperand(edx, String::kLengthOffset));
|
| STATIC_ASSERT(kSmiTag == 0);
|
| __ test(ecx, Operand(ecx));
|
| - __ j(not_zero, &second_not_zero_length);
|
| + __ j(not_zero, &second_not_zero_length, Label::kNear);
|
| // Second string is empty, result is first string which is already in eax.
|
| Counters* counters = masm->isolate()->counters();
|
| __ IncrementCounter(counters->string_add_native(), 1);
|
| @@ -4924,7 +4926,7 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| __ mov(ebx, FieldOperand(eax, String::kLengthOffset));
|
| STATIC_ASSERT(kSmiTag == 0);
|
| __ test(ebx, Operand(ebx));
|
| - __ j(not_zero, &both_not_zero_length);
|
| + __ j(not_zero, &both_not_zero_length, Label::kNear);
|
| // First string is empty, result is second string which is in edx.
|
| __ mov(eax, edx);
|
| __ IncrementCounter(counters->string_add_native(), 1);
|
| @@ -5198,7 +5200,7 @@ void StringHelper::GenerateCopyCharacters(MacroAssembler* masm,
|
| Register count,
|
| Register scratch,
|
| bool ascii) {
|
| - NearLabel loop;
|
| + Label loop;
|
| __ bind(&loop);
|
| // This loop just copies one character at a time, as it is only used for very
|
| // short strings.
|
| @@ -5245,9 +5247,9 @@ void StringHelper::GenerateCopyCharactersREP(MacroAssembler* masm,
|
| }
|
|
|
| // Don't enter the rep movs if there are less than 4 bytes to copy.
|
| - NearLabel last_bytes;
|
| + Label last_bytes;
|
| __ test(count, Immediate(~3));
|
| - __ j(zero, &last_bytes);
|
| + __ j(zero, &last_bytes, Label::kNear);
|
|
|
| // Copy from edi to esi using rep movs instruction.
|
| __ mov(scratch, count);
|
| @@ -5265,7 +5267,7 @@ void StringHelper::GenerateCopyCharactersREP(MacroAssembler* masm,
|
| __ j(zero, &done);
|
|
|
| // Copy remaining characters.
|
| - NearLabel loop;
|
| + Label loop;
|
| __ bind(&loop);
|
| __ mov_b(scratch, Operand(src, 0));
|
| __ mov_b(Operand(dest, 0), scratch);
|
| @@ -5291,11 +5293,11 @@ void StringHelper::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
|
|
| // Make sure that both characters are not digits as such strings has a
|
| // different hash algorithm. Don't try to look for these in the symbol table.
|
| - NearLabel not_array_index;
|
| + Label not_array_index;
|
| __ mov(scratch, c1);
|
| __ sub(Operand(scratch), Immediate(static_cast<int>('0')));
|
| __ cmp(Operand(scratch), Immediate(static_cast<int>('9' - '0')));
|
| - __ j(above, ¬_array_index);
|
| + __ j(above, ¬_array_index, Label::kNear);
|
| __ mov(scratch, c2);
|
| __ sub(Operand(scratch), Immediate(static_cast<int>('0')));
|
| __ cmp(Operand(scratch), Immediate(static_cast<int>('9' - '0')));
|
| @@ -5453,9 +5455,9 @@ void StringHelper::GenerateHashGetHash(MacroAssembler* masm,
|
| __ add(hash, Operand(scratch));
|
|
|
| // if (hash == 0) hash = 27;
|
| - NearLabel hash_not_zero;
|
| + Label hash_not_zero;
|
| __ test(hash, Operand(hash));
|
| - __ j(not_zero, &hash_not_zero);
|
| + __ j(not_zero, &hash_not_zero, Label::kNear);
|
| __ mov(hash, Immediate(27));
|
| __ bind(&hash_not_zero);
|
| }
|
| @@ -5678,14 +5680,14 @@ void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
| __ IncrementCounter(counters->string_compare_native(), 1);
|
|
|
| // Find minimum length.
|
| - NearLabel left_shorter;
|
| + Label left_shorter;
|
| __ mov(scratch1, FieldOperand(left, String::kLengthOffset));
|
| __ mov(scratch3, scratch1);
|
| __ sub(scratch3, FieldOperand(right, String::kLengthOffset));
|
|
|
| Register length_delta = scratch3;
|
|
|
| - __ j(less_equal, &left_shorter);
|
| + __ j(less_equal, &left_shorter, Label::kNear);
|
| // Right string is shorter. Change scratch1 to be length of right string.
|
| __ sub(scratch1, Operand(length_delta));
|
| __ bind(&left_shorter);
|
| @@ -5714,7 +5716,7 @@ void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
|
|
| {
|
| // Compare loop.
|
| - NearLabel loop;
|
| + Label loop;
|
| __ bind(&loop);
|
| // Compare characters.
|
| __ mov_b(scratch2, Operand(left, index, times_1, 0));
|
| @@ -5760,9 +5762,9 @@ void StringCompareStub::Generate(MacroAssembler* masm) {
|
| __ mov(edx, Operand(esp, 2 * kPointerSize)); // left
|
| __ mov(eax, Operand(esp, 1 * kPointerSize)); // right
|
|
|
| - NearLabel not_same;
|
| + Label not_same;
|
| __ cmp(edx, Operand(eax));
|
| - __ j(not_equal, ¬_same);
|
| + __ j(not_equal, ¬_same, Label::kNear);
|
| STATIC_ASSERT(EQUAL == 0);
|
| STATIC_ASSERT(kSmiTag == 0);
|
| __ Set(eax, Immediate(Smi::FromInt(EQUAL)));
|
| @@ -5790,19 +5792,19 @@ void StringCompareStub::Generate(MacroAssembler* masm) {
|
|
|
| void ICCompareStub::GenerateSmis(MacroAssembler* masm) {
|
| ASSERT(state_ == CompareIC::SMIS);
|
| - NearLabel miss;
|
| + Label miss;
|
| __ mov(ecx, Operand(edx));
|
| __ or_(ecx, Operand(eax));
|
| __ test(ecx, Immediate(kSmiTagMask));
|
| - __ j(not_zero, &miss, not_taken);
|
| + __ j(not_zero, &miss, Label::kNear, not_taken);
|
|
|
| if (GetCondition() == equal) {
|
| // For equality we do not care about the sign of the result.
|
| __ sub(eax, Operand(edx));
|
| } else {
|
| - NearLabel done;
|
| + Label done;
|
| __ sub(edx, Operand(eax));
|
| - __ j(no_overflow, &done);
|
| + __ j(no_overflow, &done, Label::kNear);
|
| // Correct sign of result in case of overflow.
|
| __ not_(edx);
|
| __ bind(&done);
|
| @@ -5818,18 +5820,18 @@ void ICCompareStub::GenerateSmis(MacroAssembler* masm) {
|
| void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) {
|
| ASSERT(state_ == CompareIC::HEAP_NUMBERS);
|
|
|
| - NearLabel generic_stub;
|
| - NearLabel unordered;
|
| - NearLabel miss;
|
| + Label generic_stub;
|
| + Label unordered;
|
| + Label miss;
|
| __ mov(ecx, Operand(edx));
|
| __ and_(ecx, Operand(eax));
|
| __ test(ecx, Immediate(kSmiTagMask));
|
| - __ j(zero, &generic_stub, not_taken);
|
| + __ j(zero, &generic_stub, Label::kNear, not_taken);
|
|
|
| __ CmpObjectType(eax, HEAP_NUMBER_TYPE, ecx);
|
| - __ j(not_equal, &miss, not_taken);
|
| + __ j(not_equal, &miss, Label::kNear, not_taken);
|
| __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx);
|
| - __ j(not_equal, &miss, not_taken);
|
| + __ j(not_equal, &miss, Label::kNear, not_taken);
|
|
|
| // Inlining the double comparison and falling back to the general compare
|
| // stub if NaN is involved or SS2 or CMOV is unsupported.
|
| @@ -5845,7 +5847,7 @@ void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) {
|
| __ ucomisd(xmm0, xmm1);
|
|
|
| // Don't base result on EFLAGS when a NaN is involved.
|
| - __ j(parity_even, &unordered, not_taken);
|
| + __ j(parity_even, &unordered, Label::kNear, not_taken);
|
|
|
| // Return a result of -1, 0, or 1, based on EFLAGS.
|
| // Performing mov, because xor would destroy the flag register.
|
| @@ -5947,16 +5949,16 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) {
|
|
|
| void ICCompareStub::GenerateObjects(MacroAssembler* masm) {
|
| ASSERT(state_ == CompareIC::OBJECTS);
|
| - NearLabel miss;
|
| + Label miss;
|
| __ mov(ecx, Operand(edx));
|
| __ and_(ecx, Operand(eax));
|
| __ test(ecx, Immediate(kSmiTagMask));
|
| - __ j(zero, &miss, not_taken);
|
| + __ j(zero, &miss, Label::kNear, not_taken);
|
|
|
| __ CmpObjectType(eax, JS_OBJECT_TYPE, ecx);
|
| - __ j(not_equal, &miss, not_taken);
|
| + __ j(not_equal, &miss, Label::kNear, not_taken);
|
| __ CmpObjectType(edx, JS_OBJECT_TYPE, ecx);
|
| - __ j(not_equal, &miss, not_taken);
|
| + __ j(not_equal, &miss, Label::kNear, not_taken);
|
|
|
| ASSERT(GetCondition() == equal);
|
| __ sub(eax, Operand(edx));
|
| @@ -6035,17 +6037,17 @@ void StringDictionaryLookupStub::GenerateNegativeLookup(MacroAssembler* masm,
|
| __ mov(entity_name, Operand(properties, index, times_half_pointer_size,
|
| kElementsStartOffset - kHeapObjectTag));
|
| __ cmp(entity_name, masm->isolate()->factory()->undefined_value());
|
| - __ j(equal, done, taken);
|
| + __ j(equal, done, Label::kFar, taken);
|
|
|
| // Stop if found the property.
|
| __ cmp(entity_name, Handle<String>(name));
|
| - __ j(equal, miss, not_taken);
|
| + __ j(equal, miss, Label::kFar, not_taken);
|
|
|
| // Check if the entry name is not a symbol.
|
| __ mov(entity_name, FieldOperand(entity_name, HeapObject::kMapOffset));
|
| __ test_b(FieldOperand(entity_name, Map::kInstanceTypeOffset),
|
| kIsSymbolMask);
|
| - __ j(zero, miss, not_taken);
|
| + __ j(zero, miss, Label::kFar, not_taken);
|
| }
|
|
|
| StringDictionaryLookupStub stub(properties,
|
|
|