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(); |