Revision: 3046 Author: [email protected] Date: Mon Oct 12 04:19:20 2009 Log: Removed 31-bit smis.
Review URL: http://codereview.chromium.org/267049 http://code.google.com/p/v8/source/detail?r=3046 Modified: /branches/bleeding_edge/SConstruct /branches/bleeding_edge/include/v8.h /branches/bleeding_edge/src/objects-inl.h /branches/bleeding_edge/src/x64/macro-assembler-x64.cc /branches/bleeding_edge/test/cctest/test-heap.cc /branches/bleeding_edge/test/cctest/test-macro-assembler-x64.cc ======================================= --- /branches/bleeding_edge/SConstruct Thu Oct 8 05:36:12 2009 +++ /branches/bleeding_edge/SConstruct Mon Oct 12 04:19:20 2009 @@ -174,7 +174,7 @@ 'LINKFLAGS': ['-m32'] }, 'arch:x64': { - 'CPPDEFINES': ['V8_TARGET_ARCH_X64', 'V8_LONG_SMI'], + 'CPPDEFINES': ['V8_TARGET_ARCH_X64'], 'CCFLAGS': ['-m64'], 'LINKFLAGS': ['-m64'], }, @@ -200,7 +200,7 @@ 'ARFLAGS': ['/MACHINE:X86'] }, 'arch:x64': { - 'CPPDEFINES': ['V8_TARGET_ARCH_X64', 'V8_LONG_SMI'], + 'CPPDEFINES': ['V8_TARGET_ARCH_X64'], 'LINKFLAGS': ['/MACHINE:X64'], 'ARFLAGS': ['/MACHINE:X64'] }, ======================================= --- /branches/bleeding_edge/include/v8.h Thu Oct 8 05:54:29 2009 +++ /branches/bleeding_edge/include/v8.h Mon Oct 12 04:19:20 2009 @@ -756,7 +756,7 @@ /** JS == */ bool Equals(Handle<Value> that) const; bool StrictEquals(Handle<Value> that) const; - + private: inline bool QuickIsString() const; bool FullIsString() const; @@ -1036,7 +1036,7 @@ Value(const Value&); void operator=(const Value&); }; - + private: void VerifyExternalStringResource(ExternalStringResource* val) const; static void CheckCast(v8::Value* obj); @@ -1194,7 +1194,7 @@ /** Gets a native pointer from an internal field. */ inline void* GetPointerFromInternalField(int index); - + /** Sets a native pointer in an internal field. */ void SetPointerInInternalField(int index, void* value); @@ -1247,7 +1247,7 @@ bool SetHiddenValue(Handle<String> key, Handle<Value> value); Local<Value> GetHiddenValue(Handle<String> key); bool DeleteHiddenValue(Handle<String> key); - + /** * Returns true if this is an instance of an api function (one * created from a function created from a function template) and has @@ -1281,7 +1281,7 @@ /** * If quick access to the internal field is possible this method - * returns the value. Otherwise an empty handle is returned. + * returns the value. Otherwise an empty handle is returned. */ inline Local<Value> UncheckedGetInternalField(int index); }; @@ -2720,10 +2720,7 @@ const int kHeapObjectTagSize = 2; const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1; -#ifdef V8_LONG_SMI -#ifndef V8_TARGET_ARCH_X64 -#error "Large smis on non-64-bit platform." -#endif +#ifdef V8_TARGET_ARCH_X64 // Tag information for Smi. const int kSmiTag = 0; const int kSmiTagSize = 1; @@ -2774,7 +2771,7 @@ } static inline int SmiValue(internal::Object* value) { -#ifdef V8_LONG_SMI +#ifdef V8_TARGET_ARCH_X64 int shift_bits = kSmiTagSize + kSmiShiftSize; // Shift down and throw away top 32 bits. return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits); ======================================= --- /branches/bleeding_edge/src/objects-inl.h Thu Oct 8 05:36:12 2009 +++ /branches/bleeding_edge/src/objects-inl.h Mon Oct 12 04:19:20 2009 @@ -835,7 +835,7 @@ bool in_range = (value >= kMinValue) && (value <= kMaxValue); #endif -#ifdef V8_LONG_SMI +#ifdef V8_TARGET_ARCH_X64 // To be representable as a long smi, the value must be a 32-bit integer. bool result = (value == static_cast<int32_t>(value)); #else ======================================= --- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Thu Oct 8 06:09:28 2009 +++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Mon Oct 12 04:19:20 2009 @@ -428,8 +428,6 @@ // ---------------------------------------------------------------------------- // Smi tagging, untagging and tag detection. -#ifdef V8_LONG_SMI - static int kSmiShift = kSmiTagSize + kSmiShiftSize; void MacroAssembler::Integer32ToSmi(Register dst, Register src) { @@ -1209,736 +1207,6 @@ } return SmiIndex(dst, times_1); } - -#else // ! V8_LONG_SMI -// 31 bit smi operations - -// Extracts the low 32 bits of a Smi pointer, where the taqgged smi value -// is stored. -static int32_t SmiValue(Smi* smi) { - return static_cast<int32_t>(reinterpret_cast<intptr_t>(smi)); -} - - -void MacroAssembler::Integer32ToSmi(Register dst, Register src) { - ASSERT_EQ(1, kSmiTagSize); - ASSERT_EQ(0, kSmiTag); -#ifdef DEBUG - if (allow_stub_calls()) { - cmpl(src, Immediate(0xC0000000u)); - Check(positive, "Smi conversion overflow"); - } -#endif - if (dst.is(src)) { - addl(dst, src); - } else { - lea(dst, Operand(src, src, times_1, 0)); - } -} - - -void MacroAssembler::Integer32ToSmi(Register dst, - Register src, - Label* on_overflow) { - ASSERT_EQ(1, kSmiTagSize); - ASSERT_EQ(0, kSmiTag); - if (!dst.is(src)) { - movl(dst, src); - } - addl(dst, src); - j(overflow, on_overflow); -} - - -void MacroAssembler::Integer64PlusConstantToSmi(Register dst, - Register src, - int constant) { -#ifdef DEBUG - if (allow_stub_calls()) { - movl(kScratchRegister, src); - addl(kScratchRegister, Immediate(constant)); - Check(no_overflow, "Add-and-smi-convert overflow"); - Condition valid = CheckInteger32ValidSmiValue(kScratchRegister); - Check(valid, "Add-and-smi-convert overflow"); - } -#endif - lea(dst, Operand(src, src, times_1, constant << kSmiTagSize)); -} - - -void MacroAssembler::SmiToInteger32(Register dst, Register src) { - ASSERT_EQ(1, kSmiTagSize); - ASSERT_EQ(0, kSmiTag); - if (!dst.is(src)) { - movl(dst, src); - } - sarl(dst, Immediate(kSmiTagSize)); -} - - -void MacroAssembler::SmiToInteger64(Register dst, Register src) { - ASSERT_EQ(1, kSmiTagSize); - ASSERT_EQ(0, kSmiTag); - movsxlq(dst, src); - sar(dst, Immediate(kSmiTagSize)); -} - - -void MacroAssembler::SmiTest(Register src) { - testl(src, src); -} - - -void MacroAssembler::SmiCompare(Register dst, Register src) { - cmpl(dst, src); -} - - -void MacroAssembler::SmiCompare(Register dst, Smi* src) { - ASSERT(!dst.is(kScratchRegister)); - if (src->value() == 0) { - testl(dst, dst); - } else { - cmpl(dst, Immediate(SmiValue(src))); - } -} - - -void MacroAssembler::SmiCompare(const Operand& dst, Register src) { - cmpl(dst, src); -} - - -void MacroAssembler::SmiCompare(const Operand& dst, Smi* src) { - if (src->value() == 0) { - movl(kScratchRegister, dst); - testl(kScratchRegister, kScratchRegister); - } else { - cmpl(dst, Immediate(SmiValue(src))); - } -} - - -void MacroAssembler::PositiveSmiTimesPowerOfTwoToInteger64(Register dst, - Register src, - int power) { - ASSERT(power >= 0); - ASSERT(power < 64); - if (power == 0) { - SmiToInteger64(dst, src); - return; - } - movsxlq(dst, src); - shl(dst, Immediate(power - 1)); -} - -Condition MacroAssembler::CheckSmi(Register src) { - testb(src, Immediate(kSmiTagMask)); - return zero; -} - -Condition MacroAssembler::CheckPositiveSmi(Register src) { - ASSERT_EQ(0, kSmiTag); - testl(src, Immediate(static_cast<uint32_t>(0x80000000u | kSmiTagMask))); - return zero; -} - -Condition MacroAssembler::CheckBothSmi(Register first, Register second) { - if (first.is(second)) { - return CheckSmi(first); - } - movl(kScratchRegister, first); - orl(kScratchRegister, second); - return CheckSmi(kScratchRegister); -} - -Condition MacroAssembler::CheckIsMinSmi(Register src) { - ASSERT(kSmiTag == 0 && kSmiTagSize == 1); - cmpl(src, Immediate(0x80000000u)); - return equal; -} - -Condition MacroAssembler::CheckInteger32ValidSmiValue(Register src) { - // A 32-bit integer value can be converted to a smi if it is in the - // range [-2^30 .. 2^30-1]. That is equivalent to having its 32-bit - // representation have bits 30 and 31 be equal. - cmpl(src, Immediate(0xC0000000u)); - return positive; -} - - -void MacroAssembler::SmiNeg(Register dst, - Register src, - Label* on_smi_result) { - if (!dst.is(src)) { - movl(dst, src); - } - negl(dst); - testl(dst, Immediate(0x7fffffff)); - // If the result is zero or 0x80000000, negation failed to create a smi. - j(not_equal, on_smi_result); -} - - -void MacroAssembler::SmiAdd(Register dst, - Register src1, - Register src2, - Label* on_not_smi_result) { - ASSERT(!dst.is(src2)); - if (!dst.is(src1)) { - movl(dst, src1); - } - addl(dst, src2); - if (!dst.is(src1)) { - j(overflow, on_not_smi_result); - } else { - Label smi_result; - j(no_overflow, &smi_result); - // Restore src1. - subl(src1, src2); - jmp(on_not_smi_result); - bind(&smi_result); - } -} - - -void MacroAssembler::SmiSub(Register dst, - Register src1, - Register src2, - Label* on_not_smi_result) { - ASSERT(!dst.is(src2)); - if (!dst.is(src1)) { - movl(dst, src1); - } - subl(dst, src2); - if (!dst.is(src1)) { - j(overflow, on_not_smi_result); - } else { - Label smi_result; - j(no_overflow, &smi_result); - // Restore src1. - addl(src1, src2); - jmp(on_not_smi_result); - bind(&smi_result); - } -} - - -void MacroAssembler::SmiMul(Register dst, - Register src1, - Register src2, - Label* on_not_smi_result) { - ASSERT(!dst.is(src2)); - - if (dst.is(src1)) { - // Copy src1 before overwriting. - movq(kScratchRegister, src1); - } - SmiToInteger32(dst, src1); - - imull(dst, src2); - j(overflow, on_not_smi_result); - - // Check for negative zero result. If product is zero, and one - // argument is negative, go to slow case. The frame is unchanged - // in this block, so local control flow can use a Label rather - // than a JumpTarget. - Label non_zero_result; - testl(dst, dst); - j(not_zero, &non_zero_result); - - // Test whether either operand is negative (the other must be zero). - if (!dst.is(src1)) { - movl(kScratchRegister, src1); - } - orl(kScratchRegister, src2); - j(negative, on_not_smi_result); - - bind(&non_zero_result); -} - - -void MacroAssembler::SmiTryAddConstant(Register dst, - Register src, - Smi* constant, - Label* on_not_smi_result) { - // Does not assume that src is a smi. - ASSERT_EQ(static_cast<intptr_t>(1), kSmiTagMask); - ASSERT_EQ(0, kSmiTag); - - Register tmp = (src.is(dst) ? kScratchRegister : dst); - movl(tmp, src); - addl(tmp, Immediate(SmiValue(constant))); - if (tmp.is(kScratchRegister)) { - j(overflow, on_not_smi_result); - testl(tmp, Immediate(kSmiTagMask)); - j(not_zero, on_not_smi_result); - movl(dst, tmp); - } else { - movl(kScratchRegister, Immediate(kSmiTagMask)); - cmovl(overflow, dst, kScratchRegister); - testl(dst, kScratchRegister); - j(not_zero, on_not_smi_result); - } -} - - -void MacroAssembler::SmiAddConstant(Register dst, - Register src, - Smi* constant) { - ASSERT_EQ(1, kSmiTagMask); - ASSERT_EQ(0, kSmiTag); - int32_t smi_value = SmiValue(constant); - if (dst.is(src)) { - addl(dst, Immediate(smi_value)); - } else { - lea(dst, Operand(src, smi_value)); - } -} - - -void MacroAssembler::SmiAddConstant(Register dst, - Register src, - Smi* constant, - Label* on_not_smi_result) { - ASSERT_EQ(1, kSmiTagMask); - ASSERT_EQ(0, kSmiTag); - int32_t smi_value = SmiValue(constant); - if (!dst.is(src)) { - movl(dst, src); - addl(dst, Immediate(smi_value)); - j(overflow, on_not_smi_result); - } else { - addl(dst, Immediate(smi_value)); - Label result_ok; - j(no_overflow, &result_ok); - subl(dst, Immediate(smi_value)); - jmp(on_not_smi_result); - bind(&result_ok); - } -} - - -void MacroAssembler::SmiSubConstant(Register dst, - Register src, - Smi* constant) { - ASSERT_EQ(1, kSmiTagMask); - ASSERT_EQ(0, kSmiTag); - if (!dst.is(src)) { - movl(dst, src); - } - subl(dst, Immediate(SmiValue(constant))); -} - - -void MacroAssembler::SmiSubConstant(Register dst, - Register src, - Smi* constant, - Label* on_not_smi_result) { - ASSERT_EQ(1, kSmiTagMask); - ASSERT_EQ(0, kSmiTag); - int32_t smi_value = SmiValue(constant); - if (dst.is(src)) { - // Optimistic subtract - may change value of dst register, - // if it has garbage bits in the higher half, but will not change - // the value as a tagged smi. - subl(dst, Immediate(smi_value)); - Label add_success; - j(no_overflow, &add_success); - addl(dst, Immediate(smi_value)); - jmp(on_not_smi_result); - bind(&add_success); - } else { - movl(dst, src); - subl(dst, Immediate(smi_value)); - j(overflow, on_not_smi_result); - } -} - - -void MacroAssembler::SmiDiv(Register dst, - Register src1, - Register src2, - Label* on_not_smi_result) { - ASSERT(!src2.is(rax)); - ASSERT(!src2.is(rdx)); - ASSERT(!src1.is(rdx)); - - // Check for 0 divisor (result is +/-Infinity). - Label positive_divisor; - testl(src2, src2); - j(zero, on_not_smi_result); - j(positive, &positive_divisor); - // Check for negative zero result. If the dividend is zero, and the - // divisor is negative, return a floating point negative zero. - testl(src1, src1); - j(zero, on_not_smi_result); - bind(&positive_divisor); - - // Sign extend src1 into edx:eax. - if (!src1.is(rax)) { - movl(rax, src1); - } - cdq(); - - idivl(src2); - // 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); - cmpl(rax, Immediate(0x40000000)); - j(equal, on_not_smi_result); - // Check that the remainder is zero. - testl(rdx, rdx); - j(not_zero, on_not_smi_result); - // Tag the result and store it in the destination register. - Integer32ToSmi(dst, rax); -} - - -void MacroAssembler::SmiMod(Register dst, - Register src1, - Register src2, - Label* on_not_smi_result) { - ASSERT(!dst.is(kScratchRegister)); - ASSERT(!src1.is(kScratchRegister)); - ASSERT(!src2.is(kScratchRegister)); - ASSERT(!src2.is(rax)); - ASSERT(!src2.is(rdx)); - ASSERT(!src1.is(rdx)); - - testl(src2, src2); - j(zero, on_not_smi_result); - - if (src1.is(rax)) { - // Mist remember the value to see if a zero result should - // be a negative zero. - movl(kScratchRegister, rax); - } else { - movl(rax, src1); - } - // Sign extend eax into edx:eax. - cdq(); - idivl(src2); - // Check for a negative zero result. If the result is zero, and the - // dividend is negative, return a floating point negative zero. - Label non_zero_result; - testl(rdx, rdx); - j(not_zero, &non_zero_result); - if (src1.is(rax)) { - testl(kScratchRegister, kScratchRegister); - } else { - testl(src1, src1); - } - j(negative, on_not_smi_result); - bind(&non_zero_result); - if (!dst.is(rdx)) { - movl(dst, rdx); - } -} - - -void MacroAssembler::SmiNot(Register dst, Register src) { - if (dst.is(src)) { - not_(dst); - // Remove inverted smi-tag. The mask is sign-extended to 64 bits. - xor_(src, Immediate(kSmiTagMask)); - } else { - ASSERT_EQ(0, kSmiTag); - lea(dst, Operand(src, kSmiTagMask)); - not_(dst); - } -} - - -void MacroAssembler::SmiAnd(Register dst, Register src1, Register src2) { - if (!dst.is(src1)) { - movl(dst, src1); - } - and_(dst, src2); -} - - -void MacroAssembler::SmiAndConstant(Register dst, Register src, Smi* constant) { - if (!dst.is(src)) { - movl(dst, src); - } - int32_t smi_value = SmiValue(constant); - and_(dst, Immediate(smi_value)); -} - - -void MacroAssembler::SmiOr(Register dst, Register src1, Register src2) { - if (!dst.is(src1)) { - movl(dst, src1); - } - or_(dst, src2); -} - - -void MacroAssembler::SmiOrConstant(Register dst, Register src, Smi* constant) { - if (!dst.is(src)) { - movl(dst, src); - } - int32_t smi_value = SmiValue(constant); - or_(dst, Immediate(smi_value)); -} - - -void MacroAssembler::SmiXor(Register dst, Register src1, Register src2) { - if (!dst.is(src1)) { - movl(dst, src1); - } - xor_(dst, src2); -} - - -void MacroAssembler::SmiXorConstant(Register dst, Register src, Smi* constant) { - if (!dst.is(src)) { - movl(dst, src); - } - int32_t smi_value = SmiValue(constant); - xor_(dst, Immediate(smi_value)); -} - - -void MacroAssembler::SmiShiftArithmeticRightConstant(Register dst, - Register src, - int shift_value) { - if (shift_value > 0) { - if (dst.is(src)) { - sarl(dst, Immediate(shift_value)); - and_(dst, Immediate(~kSmiTagMask)); - } else { - UNIMPLEMENTED(); // Not used. - } - } -} - - -void MacroAssembler::SmiShiftLogicalRightConstant(Register dst, - Register src, - int shift_value, - Label* on_not_smi_result) { - // Logic right shift interprets its result as an *unsigned* number. - if (dst.is(src)) { - UNIMPLEMENTED(); // Not used. - } else { - movl(dst, src); - // Untag the smi. - sarl(dst, Immediate(kSmiTagSize)); - if (shift_value < 2) { - // A negative Smi shifted right two is in the positive Smi range, - // but if shifted only by zero or one, it never is. - j(negative, on_not_smi_result); - } - if (shift_value > 0) { - // Do the right shift on the integer value. - shrl(dst, Immediate(shift_value)); - } - // Re-tag the result. - addl(dst, dst); - } -} - - -void MacroAssembler::SmiShiftLeftConstant(Register dst, - Register src, - int shift_value, - Label* on_not_smi_result) { - if (dst.is(src)) { - if (shift_value > 0) { - movq(kScratchRegister, src); - // Treat scratch as an untagged integer value equal to two times the - // smi value of src, i.e., already shifted left by one. - if (shift_value > 1) { - shll(kScratchRegister, Immediate(shift_value - 1)); - } - JumpIfNotValidSmiValue(kScratchRegister, on_not_smi_result); - // Convert int result to Smi, checking that it is in smi range. - ASSERT(kSmiTagSize == 1); // adjust code if not the case - Integer32ToSmi(dst, kScratchRegister); - } - } else { - movl(dst, src); - if (shift_value > 0) { - // Treat dst as an untagged integer value equal to two times the - // smi value of src, i.e., already shifted left by one. - if (shift_value > 1) { - shll(dst, Immediate(shift_value - 1)); - } - // Convert int result to Smi, checking that it is in smi range. - ASSERT(kSmiTagSize == 1); // adjust code if not the case - Integer32ToSmi(dst, dst, on_not_smi_result); - } - } -} - - -void MacroAssembler::SmiShiftLeft(Register dst, - Register src1, - Register src2, - Label* on_not_smi_result) { - ASSERT(!dst.is(rcx)); - Label result_ok; - // Untag both operands. - if (dst.is(src1) || src1.is(rcx)) { - movq(kScratchRegister, src1); - } - SmiToInteger32(dst, src1); - SmiToInteger32(rcx, src2); - shll(dst); - // Check that the *signed* result fits in a smi. - Condition is_valid = CheckInteger32ValidSmiValue(dst); - j(is_valid, &result_ok); - // Restore the relevant bits of the source registers - // and call the slow version. - if (dst.is(src1) || src1.is(rcx)) { - movq(src1, kScratchRegister); - } - if (src2.is(rcx)) { - Integer32ToSmi(rcx, rcx); - } - jmp(on_not_smi_result); - bind(&result_ok); - Integer32ToSmi(dst, dst); -} - - -void MacroAssembler::SmiShiftLogicalRight(Register dst, - Register src1, - Register src2, - Label* on_not_smi_result) { - ASSERT(!dst.is(kScratchRegister)); - ASSERT(!src1.is(kScratchRegister)); - ASSERT(!src2.is(kScratchRegister)); - ASSERT(!dst.is(rcx)); - Label result_ok; - // Untag both operands. - if (src1.is(rcx)) { - movq(kScratchRegister, src1); - } - SmiToInteger32(dst, src1); - SmiToInteger32(rcx, src2); - - shrl(dst); - // Check that the *unsigned* result fits in a smi. - // I.e., that it is a valid positive smi value. The positive smi - // values are 0..0x3fffffff, i.e., neither of the top-most two - // bits can be set. - // - // These two cases can only happen with shifts by 0 or 1 when - // handed a valid smi. If the answer cannot be represented by a - // smi, restore the left and right arguments, and jump to slow - // case. The low bit of the left argument may be lost, but only - // in a case where it is dropped anyway. - testl(dst, Immediate(0xc0000000)); - j(zero, &result_ok); - if (dst.is(src1)) { - shll(dst); - Integer32ToSmi(dst, dst); - } else if (src1.is(rcx)) { - movq(rcx, kScratchRegister); - } else if (src2.is(rcx)) { - Integer32ToSmi(src2, src2); - } - jmp(on_not_smi_result); - bind(&result_ok); - // Smi-tag the result in answer. - Integer32ToSmi(dst, dst); -} - - -void MacroAssembler::SmiShiftArithmeticRight(Register dst, - Register src1, - Register src2) { - ASSERT(!dst.is(rcx)); - // Untag both operands. - SmiToInteger32(dst, src1); - SmiToInteger32(rcx, src2); - // Shift as integer. - sarl(dst); - // Retag result. - Integer32ToSmi(dst, dst); -} - - -void MacroAssembler::SelectNonSmi(Register dst, - Register src1, - Register src2, - Label* on_not_smis) { - ASSERT(!dst.is(src1)); - ASSERT(!dst.is(src2)); - // Both operands must not be smis. -#ifdef DEBUG - if (allow_stub_calls()) { - Condition not_both_smis = NegateCondition(CheckBothSmi(src1, src2)); - Check(not_both_smis, "Both registers were smis."); - } -#endif - ASSERT_EQ(0, kSmiTag); - ASSERT_EQ(0, Smi::FromInt(0)); - movq(kScratchRegister, Immediate(kSmiTagMask)); - and_(kScratchRegister, src1); - testl(kScratchRegister, src2); - j(not_zero, on_not_smis); - // One operand is a smi. - - ASSERT_EQ(1, static_cast<int>(kSmiTagMask)); - // kScratchRegister still holds src1 & kSmiTag, which is either zero or one. - subq(kScratchRegister, Immediate(1)); - // If src1 is a smi, then scratch register all 1s, else it is all 0s. - movq(dst, src1); - xor_(dst, src2); - and_(dst, kScratchRegister); - // If src1 is a smi, dst holds src1 ^ src2, else it is zero. - xor_(dst, src1); - // If src1 is a smi, dst is src2, else it is src1, i.e., a non-smi. -} - - -SmiIndex MacroAssembler::SmiToIndex(Register dst, Register src, int shift) { - ASSERT(is_uint6(shift)); - if (shift == 0) { // times_1. - SmiToInteger32(dst, src); - return SmiIndex(dst, times_1); - } - if (shift <= 4) { // 2 - 16 times multiplier is handled using ScaleFactor. - // We expect that all smis are actually zero-padded. If this holds after - // checking, this line can be omitted. - movl(dst, src); // Ensure that the smi is zero-padded. - return SmiIndex(dst, static_cast<ScaleFactor>(shift - kSmiTagSize)); - } - // Shift by shift-kSmiTagSize. - movl(dst, src); // Ensure that the smi is zero-padded. - shl(dst, Immediate(shift - kSmiTagSize)); - return SmiIndex(dst, times_1); -} - - -SmiIndex MacroAssembler::SmiToNegativeIndex(Register dst, - Register src, - int shift) { - // Register src holds a positive smi. - ASSERT(is_uint6(shift)); - if (shift == 0) { // times_1. - SmiToInteger32(dst, src); - neg(dst); - return SmiIndex(dst, times_1); - } - if (shift <= 4) { // 2 - 16 times multiplier is handled using ScaleFactor. - movl(dst, src); - neg(dst); - return SmiIndex(dst, static_cast<ScaleFactor>(shift - kSmiTagSize)); - } - // Shift by shift-kSmiTagSize. - movl(dst, src); - neg(dst); - shl(dst, Immediate(shift - kSmiTagSize)); - return SmiIndex(dst, times_1); -} - -#endif // V8_LONG_SMI void MacroAssembler::JumpIfSmi(Register src, Label* on_smi) { ======================================= --- /branches/bleeding_edge/test/cctest/test-heap.cc Thu Oct 8 05:36:12 2009 +++ /branches/bleeding_edge/test/cctest/test-heap.cc Mon Oct 12 04:19:20 2009 @@ -132,7 +132,7 @@ CHECK(value->IsNumber()); CHECK_EQ(Smi::kMaxValue, Smi::cast(value)->value()); -#ifndef V8_LONG_SMI +#ifndef V8_TARGET_ARCH_X64 // TODO(lrn): We need a NumberFromIntptr function in order to test this. value = Heap::NumberFromInt32(Smi::kMinValue - 1); CHECK(value->IsHeapNumber()); ======================================= --- /branches/bleeding_edge/test/cctest/test-macro-assembler-x64.cc Thu Oct 8 06:09:28 2009 +++ /branches/bleeding_edge/test/cctest/test-macro-assembler-x64.cc Mon Oct 12 04:19:20 2009 @@ -1071,7 +1071,7 @@ void TestSmiDiv(MacroAssembler* masm, Label* exit, int id, int x, int y) { bool division_by_zero = (y == 0); bool negative_zero = (x == 0 && y < 0); -#ifdef V8_LONG_SMI +#ifdef V8_TARGET_ARCH_X64 bool overflow = (x == Smi::kMinValue && y < 0); // Safe approx. used. #else bool overflow = (x == Smi::kMinValue && y == -1); --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
