Index: src/ia32/code-stubs-ia32.cc |
=================================================================== |
--- src/ia32/code-stubs-ia32.cc (revision 5449) |
+++ src/ia32/code-stubs-ia32.cc (working copy) |
@@ -208,7 +208,7 @@ |
// NOTE: The stub does not handle the inlined cases (Smis, Booleans, undefined). |
void ToBooleanStub::Generate(MacroAssembler* masm) { |
- Label false_result, true_result, not_string; |
+ NearLabel false_result, true_result, not_string; |
__ mov(eax, Operand(esp, 1 * kPointerSize)); |
// 'null' => false. |
@@ -966,7 +966,7 @@ |
__ bind(&non_smi_result); |
// Allocate a heap number if needed. |
__ mov(ebx, Operand(eax)); // ebx: result |
- Label skip_allocation; |
+ NearLabel skip_allocation; |
switch (mode_) { |
case OVERWRITE_LEFT: |
case OVERWRITE_RIGHT: |
@@ -1036,7 +1036,7 @@ |
} |
// Test if left operand is a string. |
- Label lhs_not_string; |
+ NearLabel lhs_not_string; |
__ test(lhs, Immediate(kSmiTagMask)); |
__ j(zero, &lhs_not_string); |
__ CmpObjectType(lhs, FIRST_NONSTRING_TYPE, ecx); |
@@ -1045,7 +1045,7 @@ |
StringAddStub string_add_left_stub(NO_STRING_CHECK_LEFT_IN_STUB); |
__ TailCallStub(&string_add_left_stub); |
- Label call_runtime_with_args; |
+ NearLabel call_runtime_with_args; |
// Left operand is not a string, test right. |
__ bind(&lhs_not_string); |
__ test(rhs, Immediate(kSmiTagMask)); |
@@ -1221,8 +1221,8 @@ |
// Test that eax is a number. |
Label runtime_call; |
Label runtime_call_clear_stack; |
- Label input_not_smi; |
- Label loaded; |
+ NearLabel input_not_smi; |
+ NearLabel loaded; |
__ mov(eax, Operand(esp, kPointerSize)); |
__ test(eax, Immediate(kSmiTagMask)); |
__ j(not_zero, &input_not_smi); |
@@ -1295,7 +1295,7 @@ |
__ 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. |
- Label cache_miss; |
+ NearLabel cache_miss; |
__ cmp(ebx, Operand(ecx, 0)); |
__ j(not_equal, &cache_miss); |
__ cmp(edx, Operand(ecx, kIntSize)); |
@@ -1338,7 +1338,7 @@ |
void TranscendentalCacheStub::GenerateOperation(MacroAssembler* masm) { |
// Only free register is edi. |
- Label done; |
+ NearLabel done; |
ASSERT(type_ == TranscendentalCache::SIN || |
type_ == TranscendentalCache::COS); |
// More transcendental types can be added later. |
@@ -1346,7 +1346,7 @@ |
// 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. |
- Label in_range; |
+ NearLabel in_range; |
// 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); |
@@ -1357,7 +1357,7 @@ |
__ j(below, &in_range, taken); |
// Check for infinity and NaN. Both return NaN for sin. |
__ cmp(Operand(edi), Immediate(0x7ff00000)); |
- Label non_nan_result; |
+ NearLabel non_nan_result; |
__ j(not_equal, &non_nan_result, taken); |
// Input is +/-Infinity or NaN. Result is NaN. |
__ fstp(0); |
@@ -1377,7 +1377,7 @@ |
__ fld(1); |
// FPU Stack: input, 2*pi, input. |
{ |
- Label no_exceptions; |
+ NearLabel no_exceptions; |
__ fwait(); |
__ fnstsw_ax(); |
// Clear if Illegal Operand or Zero Division exceptions are set. |
@@ -1389,7 +1389,7 @@ |
// Compute st(0) % st(1) |
{ |
- Label partial_remainder_loop; |
+ NearLabel partial_remainder_loop; |
__ bind(&partial_remainder_loop); |
__ fprem1(); |
__ fwait(); |
@@ -1552,7 +1552,7 @@ |
__ 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. |
- Label negative; |
+ NearLabel negative; |
__ xor_(ecx, Operand(ecx)); |
__ cmp(ecx, FieldOperand(source, HeapNumber::kExponentOffset)); |
__ j(greater, &negative); |
@@ -1702,7 +1702,7 @@ |
void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm, |
Register number) { |
- Label load_smi, done; |
+ NearLabel load_smi, done; |
__ test(number, Immediate(kSmiTagMask)); |
__ j(zero, &load_smi, not_taken); |
@@ -1720,7 +1720,7 @@ |
void FloatingPointHelper::LoadSSE2Operands(MacroAssembler* masm) { |
- Label load_smi_edx, load_eax, load_smi_eax, done; |
+ NearLabel 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. |
@@ -1750,7 +1750,7 @@ |
void FloatingPointHelper::LoadSSE2Operands(MacroAssembler* masm, |
Label* not_numbers) { |
- Label load_smi_edx, load_eax, load_smi_eax, load_float_eax, done; |
+ NearLabel 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. |
@@ -1798,7 +1798,7 @@ |
void FloatingPointHelper::LoadFloatOperands(MacroAssembler* masm, |
Register scratch, |
ArgLocation arg_location) { |
- Label load_smi_1, load_smi_2, done_load_1, done; |
+ NearLabel load_smi_1, load_smi_2, done_load_1, done; |
if (arg_location == ARGS_IN_REGISTERS) { |
__ mov(scratch, edx); |
} else { |
@@ -1857,7 +1857,7 @@ |
void FloatingPointHelper::CheckFloatOperands(MacroAssembler* masm, |
Label* non_float, |
Register scratch) { |
- Label test_other, done; |
+ NearLabel test_other, done; |
// Test if both operands are floats or smi -> scratch=k_is_float; |
// Otherwise scratch = k_not_float. |
__ test(edx, Immediate(kSmiTagMask)); |
@@ -1883,7 +1883,7 @@ |
if (op_ == Token::SUB) { |
// Check whether the value is a smi. |
- Label try_float; |
+ NearLabel try_float; |
__ test(eax, Immediate(kSmiTagMask)); |
__ j(not_zero, &try_float, not_taken); |
@@ -1941,7 +1941,7 @@ |
&slow); |
// Do the bitwise operation and check if the result fits in a smi. |
- Label try_float; |
+ NearLabel try_float; |
__ not_(ecx); |
__ cmp(ecx, 0xc0000000); |
__ j(sign, &try_float, not_taken); |
@@ -2010,7 +2010,7 @@ |
__ j(not_zero, &slow, not_taken); |
// Check if the calling frame is an arguments adaptor frame. |
- Label adaptor; |
+ NearLabel adaptor; |
__ mov(ebx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); |
__ mov(ecx, Operand(ebx, StandardFrameConstants::kContextOffset)); |
__ cmp(Operand(ecx), Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
@@ -2087,7 +2087,7 @@ |
// Try the new space allocation. Start out with computing the size of |
// the arguments object and the elements array. |
- Label add_arguments_object; |
+ NearLabel add_arguments_object; |
__ bind(&try_allocate); |
__ test(ecx, Operand(ecx)); |
__ j(zero, &add_arguments_object); |
@@ -2139,7 +2139,7 @@ |
__ SmiUntag(ecx); |
// Copy the fixed array slots. |
- Label loop; |
+ NearLabel loop; |
__ bind(&loop); |
__ mov(ebx, Operand(edx, -1 * kPointerSize)); // Skip receiver. |
__ mov(FieldOperand(edi, FixedArray::kHeaderSize), ebx); |
@@ -2367,7 +2367,7 @@ |
// Argument 4: End of string data |
// Argument 3: Start of string data |
- Label setup_two_byte, setup_rest; |
+ NearLabel setup_two_byte, setup_rest; |
__ test(edi, Operand(edi)); |
__ mov(edi, FieldOperand(eax, String::kLengthOffset)); |
__ j(zero, &setup_two_byte); |
@@ -2461,7 +2461,7 @@ |
// ebx: last_match_info backing store (FixedArray) |
// ecx: offsets vector |
// edx: number of capture registers |
- Label next_capture, done; |
+ NearLabel next_capture, done; |
// Capture register counter starts from number of capture registers and |
// counts down until wraping after zero. |
__ bind(&next_capture); |
@@ -2517,13 +2517,13 @@ |
// 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. |
- Label smi_hash_calculated; |
- Label load_result_from_cache; |
+ NearLabel smi_hash_calculated; |
+ NearLabel load_result_from_cache; |
if (object_is_smi) { |
__ mov(scratch, object); |
__ SmiUntag(scratch); |
} else { |
- Label not_smi, hash_calculated; |
+ NearLabel not_smi, hash_calculated; |
STATIC_ASSERT(kSmiTag == 0); |
__ test(object, Immediate(kSmiTagMask)); |
__ j(not_zero, ¬_smi); |
@@ -2626,7 +2626,7 @@ |
if (cc_ != equal) { |
// Check for undefined. undefined OP undefined is false even though |
// undefined == undefined. |
- Label check_for_nan; |
+ NearLabel check_for_nan; |
__ cmp(edx, Factory::undefined_value()); |
__ j(not_equal, &check_for_nan); |
__ Set(eax, Immediate(Smi::FromInt(NegativeComparisonResult(cc_)))); |
@@ -2641,7 +2641,7 @@ |
__ Set(eax, Immediate(Smi::FromInt(EQUAL))); |
__ ret(0); |
} else { |
- Label heap_number; |
+ NearLabel heap_number; |
__ cmp(FieldOperand(edx, HeapObject::kMapOffset), |
Immediate(Factory::heap_number_map())); |
__ j(equal, &heap_number); |
@@ -2676,7 +2676,7 @@ |
__ setcc(above_equal, eax); |
__ ret(0); |
} else { |
- Label nan; |
+ NearLabel nan; |
__ j(above_equal, &nan); |
__ Set(eax, Immediate(Smi::FromInt(EQUAL))); |
__ ret(0); |
@@ -2693,7 +2693,7 @@ |
// Non-strict object equality is slower, so it is handled later in the stub. |
if (cc_ == equal && strict_) { |
Label slow; // Fallthrough label. |
- Label not_smis; |
+ NearLabel 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 |
@@ -2734,13 +2734,13 @@ |
// Get the type of the first operand. |
// If the first object is a JS object, we have done pointer comparison. |
- Label first_non_object; |
+ NearLabel first_non_object; |
STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE); |
__ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, ecx); |
__ j(below, &first_non_object); |
// Return non-zero (eax is not zero) |
- Label return_not_equal; |
+ NearLabel return_not_equal; |
STATIC_ASSERT(kHeapObjectTag != 0); |
__ bind(&return_not_equal); |
__ ret(0); |
@@ -2791,7 +2791,7 @@ |
// Don't base result on EFLAGS when a NaN is involved. |
__ j(parity_even, &unordered, not_taken); |
- Label below_label, above_label; |
+ NearLabel 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); |
@@ -2856,8 +2856,8 @@ |
// Non-strict equality. Objects are unequal if |
// they are both JSObjects and not undetectable, |
// and their pointers are different. |
- Label not_both_objects; |
- Label return_unequal; |
+ NearLabel not_both_objects; |
+ NearLabel 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. |
@@ -3019,7 +3019,7 @@ |
// not NULL. The frame pointer is NULL in the exception handler of |
// a JS entry frame. |
__ xor_(esi, Operand(esi)); // Tentatively set context pointer to NULL. |
- Label skip; |
+ NearLabel skip; |
__ cmp(ebp, 0); |
__ j(equal, &skip, not_taken); |
__ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
@@ -3151,7 +3151,7 @@ |
// 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) { |
- Label okay; |
+ NearLabel okay; |
__ cmp(eax, Factory::the_hole_value()); |
__ j(not_equal, &okay); |
__ int3(); |
@@ -3213,7 +3213,7 @@ |
__ mov(esp, Operand::StaticVariable(handler_address)); |
// Unwind the handlers until the ENTRY handler is found. |
- Label loop, done; |
+ NearLabel loop, done; |
__ bind(&loop); |
// Load the type of the current stack handler. |
const int kStateOffset = StackHandlerConstants::kStateOffset; |
@@ -3431,7 +3431,7 @@ |
// edx is function, eax is map. |
// Look up the function and the map in the instanceof cache. |
- Label miss; |
+ NearLabel miss; |
ExternalReference roots_address = ExternalReference::roots_address(); |
__ mov(ecx, Immediate(Heap::kInstanceofCacheFunctionRootIndex)); |
__ cmp(edx, Operand::StaticArray(ecx, times_pointer_size, roots_address)); |
@@ -3463,7 +3463,7 @@ |
__ mov(ecx, FieldOperand(eax, Map::kPrototypeOffset)); |
// Loop through the prototype chain looking for the function prototype. |
- Label loop, is_instance, is_not_instance; |
+ NearLabel loop, is_instance, is_not_instance; |
__ bind(&loop); |
__ cmp(ecx, Operand(ebx)); |
__ j(equal, &is_instance); |
@@ -3793,7 +3793,7 @@ |
// eax: first string |
// edx: second string |
// Check if either of the strings are empty. In that case return the other. |
- Label second_not_zero_length, both_not_zero_length; |
+ NearLabel second_not_zero_length, both_not_zero_length; |
__ mov(ecx, FieldOperand(edx, String::kLengthOffset)); |
STATIC_ASSERT(kSmiTag == 0); |
__ test(ecx, Operand(ecx)); |
@@ -4079,7 +4079,7 @@ |
Register count, |
Register scratch, |
bool ascii) { |
- Label loop; |
+ NearLabel loop; |
__ bind(&loop); |
// This loop just copies one character at a time, as it is only used for very |
// short strings. |
@@ -4126,7 +4126,7 @@ |
} |
// Don't enter the rep movs if there are less than 4 bytes to copy. |
- Label last_bytes; |
+ NearLabel last_bytes; |
__ test(count, Immediate(~3)); |
__ j(zero, &last_bytes); |
@@ -4146,7 +4146,7 @@ |
__ j(zero, &done); |
// Copy remaining characters. |
- Label loop; |
+ NearLabel loop; |
__ bind(&loop); |
__ mov_b(scratch, Operand(src, 0)); |
__ mov_b(Operand(dest, 0), scratch); |
@@ -4172,7 +4172,7 @@ |
// 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. |
- Label not_array_index; |
+ NearLabel not_array_index; |
__ mov(scratch, c1); |
__ sub(Operand(scratch), Immediate(static_cast<int>('0'))); |
__ cmp(Operand(scratch), Immediate(static_cast<int>('9' - '0'))); |
@@ -4330,7 +4330,7 @@ |
__ add(hash, Operand(scratch)); |
// if (hash == 0) hash = 27; |
- Label hash_not_zero; |
+ NearLabel hash_not_zero; |
__ test(hash, Operand(hash)); |
__ j(not_zero, &hash_not_zero); |
__ mov(hash, Immediate(27)); |
@@ -4499,7 +4499,7 @@ |
__ IncrementCounter(&Counters::string_compare_native, 1); |
// Find minimum length. |
- Label left_shorter; |
+ NearLabel left_shorter; |
__ mov(scratch1, FieldOperand(left, String::kLengthOffset)); |
__ mov(scratch3, scratch1); |
__ sub(scratch3, FieldOperand(right, String::kLengthOffset)); |
@@ -4535,7 +4535,7 @@ |
{ |
// Compare loop. |
- Label loop; |
+ NearLabel loop; |
__ bind(&loop); |
// Compare characters. |
__ mov_b(scratch2, Operand(left, index, times_1, 0)); |
@@ -4581,7 +4581,7 @@ |
__ mov(edx, Operand(esp, 2 * kPointerSize)); // left |
__ mov(eax, Operand(esp, 1 * kPointerSize)); // right |
- Label not_same; |
+ NearLabel not_same; |
__ cmp(edx, Operand(eax)); |
__ j(not_equal, ¬_same); |
STATIC_ASSERT(EQUAL == 0); |