| Index: src/arm/code-stubs-arm.cc
|
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc
|
| index 3184c0f7edbec1ee881cbfe7ee777e5555da5fe1..d80066087dc1a757dd6d7abc23b7aa4cf8dacca8 100644
|
| --- a/src/arm/code-stubs-arm.cc
|
| +++ b/src/arm/code-stubs-arm.cc
|
| @@ -146,101 +146,6 @@ void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| -// Takes a Smi and converts to an IEEE 64 bit floating point value in two
|
| -// registers. The format is 1 sign bit, 11 exponent bits (biased 1023) and
|
| -// 52 fraction bits (20 in the first word, 32 in the second). Zeros is a
|
| -// scratch register. Destroys the source register. No GC occurs during this
|
| -// stub so you don't have to set up the frame.
|
| -class ConvertToDoubleStub : public PlatformCodeStub {
|
| - public:
|
| - ConvertToDoubleStub(Isolate* isolate,
|
| - Register result_reg_1,
|
| - Register result_reg_2,
|
| - Register source_reg,
|
| - Register scratch_reg)
|
| - : PlatformCodeStub(isolate),
|
| - result1_(result_reg_1),
|
| - result2_(result_reg_2),
|
| - source_(source_reg),
|
| - zeros_(scratch_reg) { }
|
| -
|
| - private:
|
| - Register result1_;
|
| - Register result2_;
|
| - Register source_;
|
| - Register zeros_;
|
| -
|
| - // Minor key encoding in 16 bits.
|
| - class ModeBits: public BitField<OverwriteMode, 0, 2> {};
|
| - class OpBits: public BitField<Token::Value, 2, 14> {};
|
| -
|
| - Major MajorKey() const { return ConvertToDouble; }
|
| - uint32_t MinorKey() const {
|
| - // Encode the parameters in a unique 16 bit value.
|
| - return result1_.code() +
|
| - (result2_.code() << 4) +
|
| - (source_.code() << 8) +
|
| - (zeros_.code() << 12);
|
| - }
|
| -
|
| - void Generate(MacroAssembler* masm);
|
| -};
|
| -
|
| -
|
| -void ConvertToDoubleStub::Generate(MacroAssembler* masm) {
|
| - Register exponent = result1_;
|
| - Register mantissa = result2_;
|
| -
|
| - Label not_special;
|
| - __ SmiUntag(source_);
|
| - // Move sign bit from source to destination. This works because the sign bit
|
| - // in the exponent word of the double has the same position and polarity as
|
| - // the 2's complement sign bit in a Smi.
|
| - STATIC_ASSERT(HeapNumber::kSignMask == 0x80000000u);
|
| - __ and_(exponent, source_, Operand(HeapNumber::kSignMask), SetCC);
|
| - // Subtract from 0 if source was negative.
|
| - __ rsb(source_, source_, Operand::Zero(), LeaveCC, ne);
|
| -
|
| - // We have -1, 0 or 1, which we treat specially. Register source_ contains
|
| - // absolute value: it is either equal to 1 (special case of -1 and 1),
|
| - // greater than 1 (not a special case) or less than 1 (special case of 0).
|
| - __ cmp(source_, Operand(1));
|
| - __ b(gt, ¬_special);
|
| -
|
| - // For 1 or -1 we need to or in the 0 exponent (biased to 1023).
|
| - const uint32_t exponent_word_for_1 =
|
| - HeapNumber::kExponentBias << HeapNumber::kExponentShift;
|
| - __ orr(exponent, exponent, Operand(exponent_word_for_1), LeaveCC, eq);
|
| - // 1, 0 and -1 all have 0 for the second word.
|
| - __ mov(mantissa, Operand::Zero());
|
| - __ Ret();
|
| -
|
| - __ bind(¬_special);
|
| - __ clz(zeros_, source_);
|
| - // Compute exponent and or it into the exponent register.
|
| - // We use mantissa as a scratch register here. Use a fudge factor to
|
| - // divide the constant 31 + HeapNumber::kExponentBias, 0x41d, into two parts
|
| - // that fit in the ARM's constant field.
|
| - int fudge = 0x400;
|
| - __ rsb(mantissa, zeros_, Operand(31 + HeapNumber::kExponentBias - fudge));
|
| - __ add(mantissa, mantissa, Operand(fudge));
|
| - __ orr(exponent,
|
| - exponent,
|
| - Operand(mantissa, LSL, HeapNumber::kExponentShift));
|
| - // Shift up the source chopping the top bit off.
|
| - __ add(zeros_, zeros_, Operand(1));
|
| - // This wouldn't work for 1.0 or -1.0 as the shift would be 32 which means 0.
|
| - __ mov(source_, Operand(source_, LSL, zeros_));
|
| - // Compute lower part of fraction (last 12 bits).
|
| - __ mov(mantissa, Operand(source_, LSL, HeapNumber::kMantissaBitsInTopWord));
|
| - // And the top (top 20 bits).
|
| - __ orr(exponent,
|
| - exponent,
|
| - Operand(source_, LSR, 32 - HeapNumber::kMantissaBitsInTopWord));
|
| - __ Ret();
|
| -}
|
| -
|
| -
|
| void DoubleToIStub::Generate(MacroAssembler* masm) {
|
| Label out_of_range, only_low, negate, done;
|
| Register input_reg = source();
|
| @@ -362,29 +267,29 @@ void WriteInt32ToHeapNumberStub::Generate(MacroAssembler* masm) {
|
| // We test for the special value that has a different exponent. This test
|
| // has the neat side effect of setting the flags according to the sign.
|
| STATIC_ASSERT(HeapNumber::kSignMask == 0x80000000u);
|
| - __ cmp(the_int_, Operand(0x80000000u));
|
| + __ cmp(the_int(), Operand(0x80000000u));
|
| __ b(eq, &max_negative_int);
|
| // Set up the correct exponent in scratch_. All non-Smi int32s have the same.
|
| // A non-Smi integer is 1.xxx * 2^30 so the exponent is 30 (biased).
|
| uint32_t non_smi_exponent =
|
| (HeapNumber::kExponentBias + 30) << HeapNumber::kExponentShift;
|
| - __ mov(scratch_, Operand(non_smi_exponent));
|
| + __ mov(scratch(), Operand(non_smi_exponent));
|
| // Set the sign bit in scratch_ if the value was negative.
|
| - __ orr(scratch_, scratch_, Operand(HeapNumber::kSignMask), LeaveCC, cs);
|
| + __ orr(scratch(), scratch(), Operand(HeapNumber::kSignMask), LeaveCC, cs);
|
| // Subtract from 0 if the value was negative.
|
| - __ rsb(the_int_, the_int_, Operand::Zero(), LeaveCC, cs);
|
| + __ rsb(the_int(), the_int(), Operand::Zero(), LeaveCC, cs);
|
| // We should be masking the implict first digit of the mantissa away here,
|
| // but it just ends up combining harmlessly with the last digit of the
|
| // exponent that happens to be 1. The sign bit is 0 so we shift 10 to get
|
| // the most significant 1 to hit the last bit of the 12 bit sign and exponent.
|
| DCHECK(((1 << HeapNumber::kExponentShift) & non_smi_exponent) != 0);
|
| const int shift_distance = HeapNumber::kNonMantissaBitsInTopWord - 2;
|
| - __ orr(scratch_, scratch_, Operand(the_int_, LSR, shift_distance));
|
| - __ str(scratch_, FieldMemOperand(the_heap_number_,
|
| - HeapNumber::kExponentOffset));
|
| - __ mov(scratch_, Operand(the_int_, LSL, 32 - shift_distance));
|
| - __ str(scratch_, FieldMemOperand(the_heap_number_,
|
| - HeapNumber::kMantissaOffset));
|
| + __ orr(scratch(), scratch(), Operand(the_int(), LSR, shift_distance));
|
| + __ str(scratch(),
|
| + FieldMemOperand(the_heap_number(), HeapNumber::kExponentOffset));
|
| + __ mov(scratch(), Operand(the_int(), LSL, 32 - shift_distance));
|
| + __ str(scratch(),
|
| + FieldMemOperand(the_heap_number(), HeapNumber::kMantissaOffset));
|
| __ Ret();
|
|
|
| __ bind(&max_negative_int);
|
| @@ -394,9 +299,9 @@ void WriteInt32ToHeapNumberStub::Generate(MacroAssembler* masm) {
|
| // significant 1 bit is not stored.
|
| non_smi_exponent += 1 << HeapNumber::kExponentShift;
|
| __ mov(ip, Operand(HeapNumber::kSignMask | non_smi_exponent));
|
| - __ str(ip, FieldMemOperand(the_heap_number_, HeapNumber::kExponentOffset));
|
| + __ str(ip, FieldMemOperand(the_heap_number(), HeapNumber::kExponentOffset));
|
| __ mov(ip, Operand::Zero());
|
| - __ str(ip, FieldMemOperand(the_heap_number_, HeapNumber::kMantissaOffset));
|
| + __ str(ip, FieldMemOperand(the_heap_number(), HeapNumber::kMantissaOffset));
|
| __ Ret();
|
| }
|
|
|
| @@ -4008,7 +3913,7 @@ void NameDictionaryLookupStub::Generate(MacroAssembler* masm) {
|
| __ cmp(entry_key, Operand(key));
|
| __ b(eq, &in_dictionary);
|
|
|
| - if (i != kTotalProbes - 1 && mode_ == NEGATIVE_LOOKUP) {
|
| + if (i != kTotalProbes - 1 && mode() == NEGATIVE_LOOKUP) {
|
| // Check if the entry name is not a unique name.
|
| __ ldr(entry_key, FieldMemOperand(entry_key, HeapObject::kMapOffset));
|
| __ ldrb(entry_key,
|
| @@ -4021,7 +3926,7 @@ void NameDictionaryLookupStub::Generate(MacroAssembler* masm) {
|
| // If we are doing negative lookup then probing failure should be
|
| // treated as a lookup success. For positive lookup probing failure
|
| // should be treated as lookup failure.
|
| - if (mode_ == POSITIVE_LOOKUP) {
|
| + if (mode() == POSITIVE_LOOKUP) {
|
| __ mov(result, Operand::Zero());
|
| __ Ret();
|
| }
|
| @@ -4067,11 +3972,8 @@ void RecordWriteStub::Generate(MacroAssembler* masm) {
|
| __ b(&skip_to_incremental_compacting);
|
| }
|
|
|
| - if (remembered_set_action_ == EMIT_REMEMBERED_SET) {
|
| - __ RememberedSetHelper(object_,
|
| - address_,
|
| - value_,
|
| - save_fp_regs_mode_,
|
| + if (remembered_set_action() == EMIT_REMEMBERED_SET) {
|
| + __ RememberedSetHelper(object(), address(), value(), save_fp_regs_mode(),
|
| MacroAssembler::kReturnAtEnd);
|
| }
|
| __ Ret();
|
| @@ -4094,7 +3996,7 @@ void RecordWriteStub::Generate(MacroAssembler* masm) {
|
| void RecordWriteStub::GenerateIncremental(MacroAssembler* masm, Mode mode) {
|
| regs_.Save(masm);
|
|
|
| - if (remembered_set_action_ == EMIT_REMEMBERED_SET) {
|
| + if (remembered_set_action() == EMIT_REMEMBERED_SET) {
|
| Label dont_need_remembered_set;
|
|
|
| __ ldr(regs_.scratch0(), MemOperand(regs_.address(), 0));
|
| @@ -4114,10 +4016,7 @@ void RecordWriteStub::GenerateIncremental(MacroAssembler* masm, Mode mode) {
|
| masm, kUpdateRememberedSetOnNoNeedToInformIncrementalMarker, mode);
|
| InformIncrementalMarker(masm);
|
| regs_.Restore(masm);
|
| - __ RememberedSetHelper(object_,
|
| - address_,
|
| - value_,
|
| - save_fp_regs_mode_,
|
| + __ RememberedSetHelper(object(), address(), value(), save_fp_regs_mode(),
|
| MacroAssembler::kReturnAtEnd);
|
|
|
| __ bind(&dont_need_remembered_set);
|
| @@ -4132,7 +4031,7 @@ void RecordWriteStub::GenerateIncremental(MacroAssembler* masm, Mode mode) {
|
|
|
|
|
| void RecordWriteStub::InformIncrementalMarker(MacroAssembler* masm) {
|
| - regs_.SaveCallerSaveRegisters(masm, save_fp_regs_mode_);
|
| + regs_.SaveCallerSaveRegisters(masm, save_fp_regs_mode());
|
| int argument_count = 3;
|
| __ PrepareCallCFunction(argument_count, regs_.scratch0());
|
| Register address =
|
| @@ -4148,7 +4047,7 @@ void RecordWriteStub::InformIncrementalMarker(MacroAssembler* masm) {
|
| __ CallCFunction(
|
| ExternalReference::incremental_marking_record_write_function(isolate()),
|
| argument_count);
|
| - regs_.RestoreCallerSaveRegisters(masm, save_fp_regs_mode_);
|
| + regs_.RestoreCallerSaveRegisters(masm, save_fp_regs_mode());
|
| }
|
|
|
|
|
| @@ -4176,10 +4075,7 @@ void RecordWriteStub::CheckNeedsToInformIncrementalMarker(
|
|
|
| regs_.Restore(masm);
|
| if (on_no_need == kUpdateRememberedSetOnNoNeedToInformIncrementalMarker) {
|
| - __ RememberedSetHelper(object_,
|
| - address_,
|
| - value_,
|
| - save_fp_regs_mode_,
|
| + __ RememberedSetHelper(object(), address(), value(), save_fp_regs_mode(),
|
| MacroAssembler::kReturnAtEnd);
|
| } else {
|
| __ Ret();
|
| @@ -4220,10 +4116,7 @@ void RecordWriteStub::CheckNeedsToInformIncrementalMarker(
|
|
|
| regs_.Restore(masm);
|
| if (on_no_need == kUpdateRememberedSetOnNoNeedToInformIncrementalMarker) {
|
| - __ RememberedSetHelper(object_,
|
| - address_,
|
| - value_,
|
| - save_fp_regs_mode_,
|
| + __ RememberedSetHelper(object(), address(), value(), save_fp_regs_mode(),
|
| MacroAssembler::kReturnAtEnd);
|
| } else {
|
| __ Ret();
|
|
|