| Index: src/ia32/codegen-ia32.cc
|
| ===================================================================
|
| --- src/ia32/codegen-ia32.cc (revision 5120)
|
| +++ src/ia32/codegen-ia32.cc (working copy)
|
| @@ -905,7 +905,7 @@
|
| __ AbortIfNotNumber(value.reg());
|
| }
|
| // Smi => false iff zero.
|
| - ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(value.reg(), Operand(value.reg()));
|
| dest->false_target()->Branch(zero);
|
| __ test(value.reg(), Immediate(kSmiTagMask));
|
| @@ -930,7 +930,7 @@
|
| dest->false_target()->Branch(equal);
|
|
|
| // Smi => false iff zero.
|
| - ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(value.reg(), Operand(value.reg()));
|
| dest->false_target()->Branch(zero);
|
| __ test(value.reg(), Immediate(kSmiTagMask));
|
| @@ -1169,7 +1169,7 @@
|
| const Result& left) {
|
| // Set TypeInfo of result according to the operation performed.
|
| // Rely on the fact that smis have a 31 bit payload on ia32.
|
| - ASSERT(kSmiValueSize == 31);
|
| + STATIC_ASSERT(kSmiValueSize == 31);
|
| switch (op) {
|
| case Token::COMMA:
|
| return right.type_info();
|
| @@ -1599,7 +1599,7 @@
|
| // Check for the corner case of dividing the most negative smi by
|
| // -1. We cannot use the overflow flag, since it is not set by
|
| // idiv instruction.
|
| - ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
|
| __ cmp(eax, 0x40000000);
|
| deferred->Branch(equal);
|
| // Check that the remainder is zero.
|
| @@ -1789,7 +1789,7 @@
|
|
|
| case Token::MUL: {
|
| // If the smi tag is 0 we can just leave the tag on one operand.
|
| - ASSERT(kSmiTag == 0); // Adjust code below if not the case.
|
| + STATIC_ASSERT(kSmiTag == 0); // Adjust code below if not the case.
|
| // Remove smi tag from the left operand (but keep sign).
|
| // Left-hand operand has been copied into answer.
|
| __ SmiUntag(answer.reg());
|
| @@ -2296,13 +2296,13 @@
|
| __ AbortIfNotSmi(operand->reg());
|
| }
|
| __ mov(answer.reg(), operand->reg());
|
| - ASSERT(kSmiTag == 0); // adjust code if not the case
|
| + STATIC_ASSERT(kSmiTag == 0); // adjust code if not the case
|
| // We do no shifts, only the Smi conversion, if shift_value is 1.
|
| if (shift_value > 1) {
|
| __ shl(answer.reg(), shift_value - 1);
|
| }
|
| // Convert int result to Smi, checking that it is in int range.
|
| - ASSERT(kSmiTagSize == 1); // adjust code if not the case
|
| + STATIC_ASSERT(kSmiTagSize == 1); // adjust code if not the case
|
| __ add(answer.reg(), Operand(answer.reg()));
|
| deferred->Branch(overflow);
|
| deferred->BindExit();
|
| @@ -2370,8 +2370,8 @@
|
| overwrite_mode);
|
| // Check that lowest log2(value) bits of operand are zero, and test
|
| // smi tag at the same time.
|
| - ASSERT_EQ(0, kSmiTag);
|
| - ASSERT_EQ(1, kSmiTagSize);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| __ test(operand->reg(), Immediate(3));
|
| deferred->Branch(not_zero); // Branch if non-smi or odd smi.
|
| __ sar(operand->reg(), 1);
|
| @@ -2605,9 +2605,9 @@
|
| // side (which is always a symbol).
|
| if (cc == equal) {
|
| Label not_a_symbol;
|
| - ASSERT(kSymbolTag != 0);
|
| + STATIC_ASSERT(kSymbolTag != 0);
|
| // Ensure that no non-strings have the symbol bit set.
|
| - ASSERT(kNotStringTag + kIsSymbolMask > LAST_TYPE);
|
| + STATIC_ASSERT(LAST_TYPE < kNotStringTag + kIsSymbolMask);
|
| __ test(temp.reg(), Immediate(kIsSymbolMask)); // Test the symbol bit.
|
| __ j(zero, ¬_a_symbol);
|
| // They are symbols, so do identity compare.
|
| @@ -3151,8 +3151,8 @@
|
| // JS_FUNCTION_TYPE is the last instance type and it is right
|
| // after LAST_JS_OBJECT_TYPE, we do not have to check the upper
|
| // bound.
|
| - ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| - ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1);
|
| + STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| + STATIC_ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1);
|
| __ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, ecx);
|
| __ j(below, &build_args);
|
|
|
| @@ -4476,7 +4476,7 @@
|
| // The next handler address is on top of the frame. Unlink from
|
| // the handler list and drop the rest of this handler from the
|
| // frame.
|
| - ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| + STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| frame_->EmitPop(Operand::StaticVariable(handler_address));
|
| frame_->Drop(StackHandlerConstants::kSize / kPointerSize - 1);
|
| if (has_unlinks) {
|
| @@ -4507,7 +4507,7 @@
|
| __ mov(esp, Operand::StaticVariable(handler_address));
|
| frame_->Forget(frame_->height() - handler_height);
|
|
|
| - ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| + STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| frame_->EmitPop(Operand::StaticVariable(handler_address));
|
| frame_->Drop(StackHandlerConstants::kSize / kPointerSize - 1);
|
|
|
| @@ -4593,7 +4593,7 @@
|
| // chain and set the state on the frame to FALLING.
|
| if (has_valid_frame()) {
|
| // The next handler address is on top of the frame.
|
| - ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| + STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| frame_->EmitPop(Operand::StaticVariable(handler_address));
|
| frame_->Drop(StackHandlerConstants::kSize / kPointerSize - 1);
|
|
|
| @@ -4632,7 +4632,7 @@
|
| frame_->Forget(frame_->height() - handler_height);
|
|
|
| // Unlink this handler and drop it from the frame.
|
| - ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| + STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| frame_->EmitPop(Operand::StaticVariable(handler_address));
|
| frame_->Drop(StackHandlerConstants::kSize / kPointerSize - 1);
|
|
|
| @@ -6573,8 +6573,8 @@
|
| // As long as JS_FUNCTION_TYPE is the last instance type and it is
|
| // right after LAST_JS_OBJECT_TYPE, we can avoid checking for
|
| // LAST_JS_OBJECT_TYPE.
|
| - ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| - ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1);
|
| + STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| + STATIC_ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1);
|
| __ CmpInstanceType(obj.reg(), JS_FUNCTION_TYPE);
|
| function.Branch(equal);
|
|
|
| @@ -6715,7 +6715,7 @@
|
|
|
| void CodeGenerator::GenerateGetFramePointer(ZoneList<Expression*>* args) {
|
| ASSERT(args->length() == 0);
|
| - ASSERT(kSmiTag == 0); // EBP value is aligned, so it should look like Smi.
|
| + STATIC_ASSERT(kSmiTag == 0); // EBP value is aligned, so it looks like a Smi.
|
| Result ebp_as_smi = allocator_->Allocate();
|
| ASSERT(ebp_as_smi.is_valid());
|
| __ mov(ebp_as_smi.reg(), Operand(ebp));
|
| @@ -7069,7 +7069,7 @@
|
| key.reg());
|
|
|
| // tmp.reg() now holds finger offset as a smi.
|
| - ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
|
| __ mov(tmp.reg(), FieldOperand(cache.reg(),
|
| JSFunctionResultCache::kFingerOffset));
|
| __ cmp(key.reg(), FixedArrayElementOperand(cache.reg(), tmp.reg()));
|
| @@ -9031,7 +9031,7 @@
|
|
|
| // Load and check that the result is not the hole.
|
| // Key holds a smi.
|
| - ASSERT((kSmiTag == 0) && (kSmiTagSize == 1));
|
| + STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
|
| __ mov(elements.reg(),
|
| FieldOperand(elements.reg(),
|
| key.reg(),
|
| @@ -9407,7 +9407,9 @@
|
| Label slow_case;
|
| __ mov(ecx, Operand(esp, 3 * kPointerSize));
|
| __ mov(eax, Operand(esp, 2 * kPointerSize));
|
| - ASSERT((kPointerSize == 4) && (kSmiTagSize == 1) && (kSmiTag == 0));
|
| + STATIC_ASSERT(kPointerSize == 4);
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ mov(ecx, CodeGenerator::FixedArrayElementOperand(ecx, eax));
|
| __ cmp(ecx, Factory::undefined_value());
|
| __ j(equal, &slow_case);
|
| @@ -9471,7 +9473,7 @@
|
| // String value => false iff empty.
|
| __ CmpInstanceType(edx, FIRST_NONSTRING_TYPE);
|
| __ j(above_equal, ¬_string);
|
| - ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ cmp(FieldOperand(eax, String::kLengthOffset), Immediate(0));
|
| __ j(zero, &false_result);
|
| __ jmp(&true_result);
|
| @@ -9721,7 +9723,7 @@
|
| }
|
|
|
| // 3. Perform the smi check of the operands.
|
| - ASSERT(kSmiTag == 0); // Adjust zero check if not the case.
|
| + STATIC_ASSERT(kSmiTag == 0); // Adjust zero check if not the case.
|
| __ test(combined, Immediate(kSmiTagMask));
|
| __ j(not_zero, ¬_smis, not_taken);
|
|
|
| @@ -9802,7 +9804,7 @@
|
|
|
| case Token::MUL:
|
| // If the smi tag is 0 we can just leave the tag on one operand.
|
| - ASSERT(kSmiTag == 0); // Adjust code below if not the case.
|
| + STATIC_ASSERT(kSmiTag == 0); // Adjust code below if not the case.
|
| // We can't revert the multiplication if the result is not a smi
|
| // so save the right operand.
|
| __ mov(ebx, right);
|
| @@ -9830,7 +9832,7 @@
|
| // Check for the corner case of dividing the most negative smi by
|
| // -1. We cannot use the overflow flag, since it is not set by idiv
|
| // instruction.
|
| - ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
|
| __ cmp(eax, 0x40000000);
|
| __ j(equal, &use_fp_on_smis);
|
| // Check for negative zero result. Use combined = left | right.
|
| @@ -10403,7 +10405,7 @@
|
| __ j(not_zero, &input_not_smi);
|
| // 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.
|
| - ASSERT_EQ(1, kSmiTagSize);
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| __ sar(eax, 1);
|
| __ sub(Operand(esp), Immediate(2 * kPointerSize));
|
| __ mov(Operand(esp, 0), eax);
|
| @@ -11122,7 +11124,7 @@
|
| __ j(sign, &try_float, not_taken);
|
|
|
| // Tag the result as a smi and we're done.
|
| - ASSERT(kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| __ lea(eax, Operand(ecx, times_2, kSmiTag));
|
| __ jmp(&done);
|
|
|
| @@ -11198,7 +11200,8 @@
|
| __ j(above_equal, &slow, not_taken);
|
|
|
| // Read the argument from the stack and return it.
|
| - ASSERT(kSmiTagSize == 1 && kSmiTag == 0); // shifting code depends on this
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTag == 0); // Shifting code depends on these.
|
| __ lea(ebx, Operand(ebp, eax, times_2, 0));
|
| __ neg(edx);
|
| __ mov(eax, Operand(ebx, edx, times_2, kDisplacement));
|
| @@ -11213,7 +11216,8 @@
|
| __ j(above_equal, &slow, not_taken);
|
|
|
| // Read the argument from the stack and return it.
|
| - ASSERT(kSmiTagSize == 1 && kSmiTag == 0); // shifting code depends on this
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTag == 0); // Shifting code depends on these.
|
| __ lea(ebx, Operand(ebx, ecx, times_2, 0));
|
| __ neg(edx);
|
| __ mov(eax, Operand(ebx, edx, times_2, kDisplacement));
|
| @@ -11284,12 +11288,12 @@
|
| }
|
|
|
| // Setup the callee in-object property.
|
| - ASSERT(Heap::arguments_callee_index == 0);
|
| + STATIC_ASSERT(Heap::arguments_callee_index == 0);
|
| __ mov(ebx, Operand(esp, 3 * kPointerSize));
|
| __ mov(FieldOperand(eax, JSObject::kHeaderSize), ebx);
|
|
|
| // Get the length (smi tagged) and set that as an in-object property too.
|
| - ASSERT(Heap::arguments_length_index == 1);
|
| + STATIC_ASSERT(Heap::arguments_length_index == 1);
|
| __ mov(ecx, Operand(esp, 1 * kPointerSize));
|
| __ mov(FieldOperand(eax, JSObject::kHeaderSize + kPointerSize), ecx);
|
|
|
| @@ -11368,7 +11372,7 @@
|
|
|
| // Check that the first argument is a JSRegExp object.
|
| __ mov(eax, Operand(esp, kJSRegExpOffset));
|
| - ASSERT_EQ(0, kSmiTag);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(eax, Immediate(kSmiTagMask));
|
| __ j(zero, &runtime);
|
| __ CmpObjectType(eax, JS_REGEXP_TYPE, ecx);
|
| @@ -11393,8 +11397,8 @@
|
| __ mov(edx, FieldOperand(ecx, JSRegExp::kIrregexpCaptureCountOffset));
|
| // Calculate number of capture registers (number_of_captures + 1) * 2. This
|
| // uses the asumption that smis are 2 * their untagged value.
|
| - ASSERT_EQ(0, kSmiTag);
|
| - ASSERT_EQ(1, kSmiTagSize + kSmiShiftSize);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 1);
|
| __ add(Operand(edx), Immediate(2)); // edx was a smi.
|
| // Check that the static offsets vector buffer is large enough.
|
| __ cmp(edx, OffsetsVector::kStaticOffsetsVectorSize);
|
| @@ -11452,7 +11456,7 @@
|
| // First check for flat two byte string.
|
| __ and_(ebx,
|
| kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask);
|
| - ASSERT_EQ(0, kStringTag | kSeqStringTag | kTwoByteStringTag);
|
| + STATIC_ASSERT((kStringTag | kSeqStringTag | kTwoByteStringTag) == 0);
|
| __ j(zero, &seq_two_byte_string);
|
| // Any other flat string must be a flat ascii string.
|
| __ test(Operand(ebx),
|
| @@ -11464,8 +11468,8 @@
|
| // string. In that case the subject string is just the first part of the cons
|
| // string. Also in this case the first part of the cons string is known to be
|
| // a sequential string or an external string.
|
| - ASSERT(kExternalStringTag !=0);
|
| - ASSERT_EQ(0, kConsStringTag & kExternalStringTag);
|
| + STATIC_ASSERT(kExternalStringTag != 0);
|
| + STATIC_ASSERT((kConsStringTag & kExternalStringTag) == 0);
|
| __ test(Operand(ebx),
|
| Immediate(kIsNotStringMask | kExternalStringTag));
|
| __ j(not_zero, &runtime);
|
| @@ -11481,7 +11485,7 @@
|
| // Is first part a flat two byte string?
|
| __ test_b(FieldOperand(ebx, Map::kInstanceTypeOffset),
|
| kStringRepresentationMask | kStringEncodingMask);
|
| - ASSERT_EQ(0, kSeqStringTag | kTwoByteStringTag);
|
| + STATIC_ASSERT((kSeqStringTag | kTwoByteStringTag) == 0);
|
| __ j(zero, &seq_two_byte_string);
|
| // Any other flat string must be ascii.
|
| __ test_b(FieldOperand(ebx, Map::kInstanceTypeOffset),
|
| @@ -11552,7 +11556,8 @@
|
| __ jmp(&setup_rest);
|
|
|
| __ bind(&setup_two_byte);
|
| - ASSERT(kSmiTag == 0 && kSmiTagSize == 1); // edi is smi (powered by 2).
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTagSize == 1); // edi is smi (powered by 2).
|
| __ lea(ecx, FieldOperand(eax, edi, times_1, SeqTwoByteString::kHeaderSize));
|
| __ mov(Operand(esp, 3 * kPointerSize), ecx); // Argument 4.
|
| __ lea(ecx, FieldOperand(eax, ebx, times_2, SeqTwoByteString::kHeaderSize));
|
| @@ -11600,8 +11605,8 @@
|
| __ mov(ecx, FieldOperand(eax, JSRegExp::kDataOffset));
|
| __ mov(edx, FieldOperand(ecx, JSRegExp::kIrregexpCaptureCountOffset));
|
| // Calculate number of capture registers (number_of_captures + 1) * 2.
|
| - ASSERT_EQ(0, kSmiTag);
|
| - ASSERT_EQ(1, kSmiTagSize + kSmiShiftSize);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 1);
|
| __ add(Operand(edx), Immediate(2)); // edx was a smi.
|
|
|
| // edx: Number of capture registers
|
| @@ -11696,7 +11701,7 @@
|
| __ SmiUntag(scratch);
|
| } else {
|
| Label not_smi, hash_calculated;
|
| - ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(object, Immediate(kSmiTagMask));
|
| __ j(not_zero, ¬_smi);
|
| __ mov(scratch, object);
|
| @@ -11706,7 +11711,7 @@
|
| __ cmp(FieldOperand(object, HeapObject::kMapOffset),
|
| Factory::heap_number_map());
|
| __ j(not_equal, not_found);
|
| - ASSERT_EQ(8, kDoubleSize);
|
| + STATIC_ASSERT(8 == kDoubleSize);
|
| __ mov(scratch, FieldOperand(object, HeapNumber::kValueOffset));
|
| __ xor_(scratch, FieldOperand(object, HeapNumber::kValueOffset + 4));
|
| // Object is heap number and hash is now in scratch. Calculate cache index.
|
| @@ -11837,7 +11842,7 @@
|
| // Value is a QNaN if value & kQuietNaNMask == kQuietNaNMask, i.e.,
|
| // all bits in the mask are set. We only need to check the word
|
| // that contains the exponent and high bit of the mantissa.
|
| - ASSERT_NE(0, (kQuietNaNHighBitsMask << 1) & 0x80000000u);
|
| + STATIC_ASSERT(((kQuietNaNHighBitsMask << 1) & 0x80000000u) != 0);
|
| __ mov(edx, FieldOperand(edx, HeapNumber::kExponentOffset));
|
| __ xor_(eax, Operand(eax));
|
| // Shift value and mask so kQuietNaNHighBitsMask applies to topmost
|
| @@ -11845,7 +11850,7 @@
|
| __ add(edx, Operand(edx));
|
| __ cmp(edx, kQuietNaNHighBitsMask << 1);
|
| if (cc_ == equal) {
|
| - ASSERT_NE(1, EQUAL);
|
| + STATIC_ASSERT(EQUAL != 1);
|
| __ setcc(above_equal, eax);
|
| __ ret(0);
|
| } else {
|
| @@ -11873,7 +11878,7 @@
|
| // slow-case code.
|
| // If either is a Smi (we know that not both are), then they can only
|
| // be equal if the other is a HeapNumber. If so, use the slow case.
|
| - ASSERT_EQ(0, kSmiTag);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| ASSERT_EQ(0, Smi::FromInt(0));
|
| __ mov(ecx, Immediate(kSmiTagMask));
|
| __ and_(ecx, Operand(eax));
|
| @@ -11882,7 +11887,7 @@
|
| // One operand is a smi.
|
|
|
| // Check whether the non-smi is a heap number.
|
| - ASSERT_EQ(1, kSmiTagMask);
|
| + STATIC_ASSERT(kSmiTagMask == 1);
|
| // ecx still holds eax & kSmiTag, which is either zero or one.
|
| __ sub(Operand(ecx), Immediate(0x01));
|
| __ mov(ebx, edx);
|
| @@ -11908,13 +11913,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;
|
| - ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| + 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;
|
| - ASSERT(kHeapObjectTag != 0);
|
| + STATIC_ASSERT(kHeapObjectTag != 0);
|
| __ bind(&return_not_equal);
|
| __ ret(0);
|
|
|
| @@ -12034,8 +12039,8 @@
|
| // 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.
|
| - ASSERT_EQ(0, kSmiTag);
|
| - ASSERT_EQ(1, kSmiTagMask);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTagMask == 1);
|
| __ lea(ecx, Operand(eax, edx, times_1, 0));
|
| __ test(ecx, Immediate(kSmiTagMask));
|
| __ j(not_zero, ¬_both_objects);
|
| @@ -12175,16 +12180,16 @@
|
| // eax holds the exception.
|
|
|
| // Adjust this code if not the case.
|
| - ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize);
|
| + STATIC_ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize);
|
|
|
| // Drop the sp to the top of the handler.
|
| ExternalReference handler_address(Top::k_handler_address);
|
| __ mov(esp, Operand::StaticVariable(handler_address));
|
|
|
| // Restore next handler and frame pointer, discard handler state.
|
| - ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| + STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| __ pop(Operand::StaticVariable(handler_address));
|
| - ASSERT(StackHandlerConstants::kFPOffset == 1 * kPointerSize);
|
| + STATIC_ASSERT(StackHandlerConstants::kFPOffset == 1 * kPointerSize);
|
| __ pop(ebp);
|
| __ pop(edx); // Remove state.
|
|
|
| @@ -12198,7 +12203,7 @@
|
| __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| __ bind(&skip);
|
|
|
| - ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize);
|
| + STATIC_ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize);
|
| __ ret(0);
|
| }
|
|
|
| @@ -12218,7 +12223,7 @@
|
| Label prologue;
|
| Label promote_scheduled_exception;
|
| __ EnterApiExitFrame(ExitFrame::MODE_NORMAL, kStackSpace, kArgc);
|
| - ASSERT_EQ(kArgc, 4);
|
| + STATIC_ASSERT(kArgc == 4);
|
| if (kPassHandlesDirectly) {
|
| // When handles as passed directly we don't have to allocate extra
|
| // space for and pass an out parameter.
|
| @@ -12333,7 +12338,7 @@
|
|
|
| // Check for failure result.
|
| Label failure_returned;
|
| - ASSERT(((kFailureTag + 1) & kFailureTagMask) == 0);
|
| + STATIC_ASSERT(((kFailureTag + 1) & kFailureTagMask) == 0);
|
| __ lea(ecx, Operand(eax, 1));
|
| // Lower 2 bits of ecx are 0 iff eax has failure tag.
|
| __ test(ecx, Immediate(kFailureTagMask));
|
| @@ -12348,7 +12353,7 @@
|
|
|
| Label retry;
|
| // If the returned exception is RETRY_AFTER_GC continue at retry label
|
| - ASSERT(Failure::RETRY_AFTER_GC == 0);
|
| + STATIC_ASSERT(Failure::RETRY_AFTER_GC == 0);
|
| __ test(eax, Immediate(((1 << kFailureTypeTagSize) - 1) << kFailureTagSize));
|
| __ j(zero, &retry, taken);
|
|
|
| @@ -12379,7 +12384,7 @@
|
| void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm,
|
| UncatchableExceptionType type) {
|
| // Adjust this code if not the case.
|
| - ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize);
|
| + STATIC_ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize);
|
|
|
| // Drop sp to the top stack handler.
|
| ExternalReference handler_address(Top::k_handler_address);
|
| @@ -12399,7 +12404,7 @@
|
| __ bind(&done);
|
|
|
| // Set the top handler address to next handler past the current ENTRY handler.
|
| - ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| + STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0);
|
| __ pop(Operand::StaticVariable(handler_address));
|
|
|
| if (type == OUT_OF_MEMORY) {
|
| @@ -12418,11 +12423,11 @@
|
| __ xor_(esi, Operand(esi));
|
|
|
| // Restore fp from handler and discard handler state.
|
| - ASSERT(StackHandlerConstants::kFPOffset == 1 * kPointerSize);
|
| + STATIC_ASSERT(StackHandlerConstants::kFPOffset == 1 * kPointerSize);
|
| __ pop(ebp);
|
| __ pop(edx); // State.
|
|
|
| - ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize);
|
| + STATIC_ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize);
|
| __ ret(0);
|
| }
|
|
|
| @@ -12733,7 +12738,7 @@
|
| Label got_char_code;
|
|
|
| // If the receiver is a smi trigger the non-string case.
|
| - ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(object_, Immediate(kSmiTagMask));
|
| __ j(zero, receiver_not_string_);
|
|
|
| @@ -12745,7 +12750,7 @@
|
| __ j(not_zero, receiver_not_string_);
|
|
|
| // If the index is non-smi trigger the non-smi case.
|
| - ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(index_, Immediate(kSmiTagMask));
|
| __ j(not_zero, &index_not_smi_);
|
|
|
| @@ -12758,7 +12763,7 @@
|
| __ j(above_equal, index_out_of_range_);
|
|
|
| // We need special handling for non-flat strings.
|
| - ASSERT(kSeqStringTag == 0);
|
| + STATIC_ASSERT(kSeqStringTag == 0);
|
| __ test(result_, Immediate(kStringRepresentationMask));
|
| __ j(zero, &flat_string);
|
|
|
| @@ -12779,19 +12784,19 @@
|
| __ mov(result_, FieldOperand(object_, HeapObject::kMapOffset));
|
| __ movzx_b(result_, FieldOperand(result_, Map::kInstanceTypeOffset));
|
| // If the first cons component is also non-flat, then go to runtime.
|
| - ASSERT(kSeqStringTag == 0);
|
| + STATIC_ASSERT(kSeqStringTag == 0);
|
| __ test(result_, Immediate(kStringRepresentationMask));
|
| __ j(not_zero, &call_runtime_);
|
|
|
| // Check for 1-byte or 2-byte string.
|
| __ bind(&flat_string);
|
| - ASSERT(kAsciiStringTag != 0);
|
| + STATIC_ASSERT(kAsciiStringTag != 0);
|
| __ test(result_, Immediate(kStringEncodingMask));
|
| __ j(not_zero, &ascii_string);
|
|
|
| // 2-byte string.
|
| // Load the 2-byte character code into the result register.
|
| - ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
|
| __ movzx_w(result_, FieldOperand(object_,
|
| scratch_, times_1, // Scratch is smi-tagged.
|
| SeqTwoByteString::kHeaderSize));
|
| @@ -12841,7 +12846,7 @@
|
| __ movzx_b(result_, FieldOperand(result_, Map::kInstanceTypeOffset));
|
| call_helper.AfterCall(masm);
|
| // If index is still not a smi, it must be out of range.
|
| - ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(scratch_, Immediate(kSmiTagMask));
|
| __ j(not_zero, index_out_of_range_);
|
| // Otherwise, return to the fast path.
|
| @@ -12870,8 +12875,8 @@
|
|
|
| void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
|
| // Fast case of Heap::LookupSingleCharacterStringFromCode.
|
| - ASSERT(kSmiTag == 0);
|
| - ASSERT(kSmiShiftSize == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiShiftSize == 0);
|
| ASSERT(IsPowerOf2(String::kMaxAsciiCharCode + 1));
|
| __ test(code_,
|
| Immediate(kSmiTagMask |
|
| @@ -12879,9 +12884,9 @@
|
| __ j(not_zero, &slow_case_, not_taken);
|
|
|
| __ Set(result_, Immediate(Factory::single_character_string_cache()));
|
| - ASSERT(kSmiTag == 0);
|
| - ASSERT(kSmiTagSize == 1);
|
| - ASSERT(kSmiShiftSize == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiShiftSize == 0);
|
| // At this point code register contains smi tagged ascii char code.
|
| __ mov(result_, FieldOperand(result_,
|
| code_, times_half_pointer_size,
|
| @@ -12953,7 +12958,7 @@
|
| // Check if either of the strings are empty. In that case return the other.
|
| Label second_not_zero_length, both_not_zero_length;
|
| __ mov(ecx, FieldOperand(edx, String::kLengthOffset));
|
| - ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(ecx, Operand(ecx));
|
| __ j(not_zero, &second_not_zero_length);
|
| // Second string is empty, result is first string which is already in eax.
|
| @@ -12961,7 +12966,7 @@
|
| __ ret(2 * kPointerSize);
|
| __ bind(&second_not_zero_length);
|
| __ mov(ebx, FieldOperand(eax, String::kLengthOffset));
|
| - ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(ebx, Operand(ebx));
|
| __ j(not_zero, &both_not_zero_length);
|
| // First string is empty, result is second string which is in edx.
|
| @@ -12978,7 +12983,7 @@
|
| Label string_add_flat_result, longer_than_two;
|
| __ bind(&both_not_zero_length);
|
| __ add(ebx, Operand(ecx));
|
| - ASSERT(Smi::kMaxValue == String::kMaxLength);
|
| + STATIC_ASSERT(Smi::kMaxValue == String::kMaxLength);
|
| // Handle exceptionally long strings in the runtime system.
|
| __ j(overflow, &string_add_runtime);
|
| // Use the runtime system when adding two one character strings, as it
|
| @@ -13019,7 +13024,7 @@
|
| __ mov(edi, FieldOperand(edx, HeapObject::kMapOffset));
|
| __ movzx_b(edi, FieldOperand(edi, Map::kInstanceTypeOffset));
|
| __ and_(ecx, Operand(edi));
|
| - ASSERT(kStringEncodingMask == kAsciiStringTag);
|
| + STATIC_ASSERT(kStringEncodingMask == kAsciiStringTag);
|
| __ test(ecx, Immediate(kAsciiStringTag));
|
| __ j(zero, &non_ascii);
|
| __ bind(&ascii_data);
|
| @@ -13046,7 +13051,7 @@
|
| __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset));
|
| __ movzx_b(ecx, FieldOperand(ecx, Map::kInstanceTypeOffset));
|
| __ xor_(edi, Operand(ecx));
|
| - ASSERT(kAsciiStringTag != 0 && kAsciiDataHintTag != 0);
|
| + STATIC_ASSERT(kAsciiStringTag != 0 && kAsciiDataHintTag != 0);
|
| __ and_(edi, kAsciiStringTag | kAsciiDataHintTag);
|
| __ cmp(edi, kAsciiStringTag | kAsciiDataHintTag);
|
| __ j(equal, &ascii_data);
|
| @@ -13075,7 +13080,7 @@
|
| // ebx: length of resulting flat string as a smi
|
| // edx: second string
|
| Label non_ascii_string_add_flat_result;
|
| - ASSERT(kStringEncodingMask == kAsciiStringTag);
|
| + STATIC_ASSERT(kStringEncodingMask == kAsciiStringTag);
|
| __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset));
|
| __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kAsciiStringTag);
|
| __ j(zero, &non_ascii_string_add_flat_result);
|
| @@ -13194,9 +13199,9 @@
|
| Register count,
|
| Register scratch,
|
| bool ascii) {
|
| - // Copy characters using rep movs of doublewords. Align destination on 4 byte
|
| - // boundary before starting rep movs. Copy remaining characters after running
|
| - // rep movs.
|
| + // Copy characters using rep movs of doublewords.
|
| + // The destination is aligned on a 4 byte boundary because we are
|
| + // copying to the beginning of a newly allocated string.
|
| ASSERT(dest.is(edi)); // rep movs destination
|
| ASSERT(src.is(esi)); // rep movs source
|
| ASSERT(count.is(ecx)); // rep movs count
|
| @@ -13317,9 +13322,9 @@
|
| }
|
| __ and_(scratch, Operand(mask));
|
|
|
| - // Load the entry from the symble table.
|
| + // Load the entry from the symbol table.
|
| Register candidate = scratch; // Scratch register contains candidate.
|
| - ASSERT_EQ(1, SymbolTable::kEntrySize);
|
| + STATIC_ASSERT(SymbolTable::kEntrySize == 1);
|
| __ mov(candidate,
|
| FieldOperand(symbol_table,
|
| scratch,
|
| @@ -13362,7 +13367,7 @@
|
| // Scratch register contains result when we fall through to here.
|
| Register result = scratch;
|
| __ bind(&found_in_symbol_table);
|
| - __ pop(mask); // Pop temporally saved mask from the stack.
|
| + __ pop(mask); // Pop saved mask from the stack.
|
| if (!result.is(eax)) {
|
| __ mov(eax, result);
|
| }
|
| @@ -13437,7 +13442,7 @@
|
|
|
| // Make sure first argument is a string.
|
| __ mov(eax, Operand(esp, 3 * kPointerSize));
|
| - ASSERT_EQ(0, kSmiTag);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ test(eax, Immediate(kSmiTagMask));
|
| __ j(zero, &runtime);
|
| Condition is_string = masm->IsObjectStringType(eax, ebx, ebx);
|
| @@ -13445,6 +13450,7 @@
|
|
|
| // eax: string
|
| // ebx: instance type
|
| +
|
| // Calculate length of sub string using the smi values.
|
| Label result_longer_than_two;
|
| __ mov(ecx, Operand(esp, 1 * kPointerSize)); // To index.
|
| @@ -13550,8 +13556,8 @@
|
| __ mov(ebx, Operand(esp, 2 * kPointerSize)); // from
|
| // As from is a smi it is 2 times the value which matches the size of a two
|
| // byte character.
|
| - ASSERT_EQ(0, kSmiTag);
|
| - ASSERT_EQ(1, kSmiTagSize + kSmiShiftSize);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 1);
|
| __ add(esi, Operand(ebx));
|
|
|
| // eax: result string
|
| @@ -13637,8 +13643,8 @@
|
| __ j(not_zero, &result_not_equal);
|
|
|
| // Result is EQUAL.
|
| - ASSERT_EQ(0, EQUAL);
|
| - ASSERT_EQ(0, kSmiTag);
|
| + STATIC_ASSERT(EQUAL == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ Set(eax, Immediate(Smi::FromInt(EQUAL)));
|
| __ ret(0);
|
|
|
| @@ -13670,8 +13676,8 @@
|
| Label not_same;
|
| __ cmp(edx, Operand(eax));
|
| __ j(not_equal, ¬_same);
|
| - ASSERT_EQ(0, EQUAL);
|
| - ASSERT_EQ(0, kSmiTag);
|
| + STATIC_ASSERT(EQUAL == 0);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| __ Set(eax, Immediate(Smi::FromInt(EQUAL)));
|
| __ IncrementCounter(&Counters::string_compare_native, 1);
|
| __ ret(2 * kPointerSize);
|
|
|