| Index: src/x64/macro-assembler-x64.h
|
| diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h
|
| index adc136a7f8506e411ad260df2481a983d7d69df8..2aa4ce0556f257c35f607c69816d466619521ed9 100644
|
| --- a/src/x64/macro-assembler-x64.h
|
| +++ b/src/x64/macro-assembler-x64.h
|
| @@ -72,6 +72,18 @@ class MacroAssembler: public Assembler {
|
| Register value,
|
| Register scratch);
|
|
|
| + // Set the remembered set bit for [object+offset].
|
| + // The value is known to not be a smi.
|
| + // object is the object being stored into, value is the object being stored.
|
| + // If offset is zero, then the scratch register contains the array index into
|
| + // the elements array represented as a Smi.
|
| + // All registers are clobbered by the operation.
|
| + void RecordWriteNonSmi(Register object,
|
| + int offset,
|
| + Register value,
|
| + Register scratch);
|
| +
|
| +
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| // ---------------------------------------------------------------------------
|
| // Debugger Support
|
| @@ -146,11 +158,12 @@ class MacroAssembler: public Assembler {
|
|
|
| // Tag an integer value if possible, or jump the integer value cannot be
|
| // represented as a smi. Only uses the low 32 bit of the src registers.
|
| + // NOTICE: Destroys the dst register even if unsuccessful!
|
| void Integer32ToSmi(Register dst, Register src, Label* on_overflow);
|
|
|
| // Adds constant to src and tags the result as a smi.
|
| // Result must be a valid smi.
|
| - void Integer64AddToSmi(Register dst, Register src, int constant);
|
| + void Integer64PlusConstantToSmi(Register dst, Register src, int constant);
|
|
|
| // Convert smi to 32-bit integer. I.e., not sign extended into
|
| // high 32 bits of destination.
|
| @@ -165,38 +178,31 @@ class MacroAssembler: public Assembler {
|
| Register src,
|
| int power);
|
|
|
| + // Simple comparison of smis.
|
| + void SmiCompare(Register dst, Register src);
|
| + void SmiCompare(Register dst, Smi* src);
|
| + void SmiCompare(const Operand& dst, Register src);
|
| + void SmiCompare(const Operand& dst, Smi* src);
|
| + // Sets sign and zero flags depending on value of smi in register.
|
| + void SmiTest(Register src);
|
| +
|
| // Functions performing a check on a known or potential smi. Returns
|
| // a condition that is satisfied if the check is successful.
|
|
|
| // Is the value a tagged smi.
|
| Condition CheckSmi(Register src);
|
|
|
| - // Is the value not a tagged smi.
|
| - Condition CheckNotSmi(Register src);
|
| -
|
| // Is the value a positive tagged smi.
|
| Condition CheckPositiveSmi(Register src);
|
|
|
| - // Is the value not a positive tagged smi.
|
| - Condition CheckNotPositiveSmi(Register src);
|
| -
|
| // Are both values are tagged smis.
|
| Condition CheckBothSmi(Register first, Register second);
|
|
|
| - // Is one of the values not a tagged smi.
|
| - Condition CheckNotBothSmi(Register first, Register second);
|
| -
|
| // Is the value the minimum smi value (since we are using
|
| // two's complement numbers, negating the value is known to yield
|
| // a non-smi value).
|
| Condition CheckIsMinSmi(Register src);
|
|
|
| - // Check whether a tagged smi is equal to a constant.
|
| - Condition CheckSmiEqualsConstant(Register src, int constant);
|
| -
|
| - // Check whether a tagged smi is greater than or equal to a constant.
|
| - Condition CheckSmiGreaterEqualsConstant(Register src, int constant);
|
| -
|
| // Checks whether an 32-bit integer value is a valid for conversion
|
| // to a smi.
|
| Condition CheckInteger32ValidSmiValue(Register src);
|
| @@ -216,15 +222,9 @@ class MacroAssembler: public Assembler {
|
| // Jump to label if the value is not a positive tagged smi.
|
| void JumpIfNotPositiveSmi(Register src, Label* on_not_smi);
|
|
|
| - // Jump to label if the value is a tagged smi with value equal
|
| + // Jump to label if the value, which must be a tagged smi, has value equal
|
| // to the constant.
|
| - void JumpIfSmiEqualsConstant(Register src, int constant, Label* on_equals);
|
| -
|
| - // Jump to label if the value is a tagged smi with value greater than or equal
|
| - // to the constant.
|
| - void JumpIfSmiGreaterEqualsConstant(Register src,
|
| - int constant,
|
| - Label* on_equals);
|
| + void JumpIfSmiEqualsConstant(Register src, Smi* constant, Label* on_equals);
|
|
|
| // Jump if either or both register are not smi values.
|
| void JumpIfNotBothSmi(Register src1, Register src2, Label* on_not_both_smi);
|
| @@ -239,29 +239,36 @@ class MacroAssembler: public Assembler {
|
| // the label.
|
| void SmiTryAddConstant(Register dst,
|
| Register src,
|
| - int32_t constant,
|
| + Smi* constant,
|
| Label* on_not_smi_result);
|
|
|
| + // Add an integer constant to a tagged smi, giving a tagged smi as result.
|
| + // No overflow testing on the result is done.
|
| + void SmiAddConstant(Register dst, Register src, Smi* constant);
|
| +
|
| // Add an integer constant to a tagged smi, giving a tagged smi as result,
|
| // or jumping to a label if the result cannot be represented by a smi.
|
| - // If the label is NULL, no testing on the result is done.
|
| void SmiAddConstant(Register dst,
|
| Register src,
|
| - int32_t constant,
|
| + Smi* constant,
|
| Label* on_not_smi_result);
|
|
|
| // Subtract an integer constant from a tagged smi, giving a tagged smi as
|
| + // result. No testing on the result is done.
|
| + void SmiSubConstant(Register dst, Register src, Smi* constant);
|
| +
|
| + // Subtract an integer constant from a tagged smi, giving a tagged smi as
|
| // result, or jumping to a label if the result cannot be represented by a smi.
|
| - // If the label is NULL, no testing on the result is done.
|
| void SmiSubConstant(Register dst,
|
| Register src,
|
| - int32_t constant,
|
| + Smi* constant,
|
| Label* on_not_smi_result);
|
|
|
| // Negating a smi can give a negative zero or too large positive value.
|
| + // NOTICE: This operation jumps on success, not failure!
|
| void SmiNeg(Register dst,
|
| Register src,
|
| - Label* on_not_smi_result);
|
| + Label* on_smi_result);
|
|
|
| // Adds smi values and return the result as a smi.
|
| // If dst is src1, then src1 will be destroyed, even if
|
| @@ -307,9 +314,9 @@ class MacroAssembler: public Assembler {
|
| void SmiAnd(Register dst, Register src1, Register src2);
|
| void SmiOr(Register dst, Register src1, Register src2);
|
| void SmiXor(Register dst, Register src1, Register src2);
|
| - void SmiAndConstant(Register dst, Register src1, int constant);
|
| - void SmiOrConstant(Register dst, Register src1, int constant);
|
| - void SmiXorConstant(Register dst, Register src1, int constant);
|
| + void SmiAndConstant(Register dst, Register src1, Smi* constant);
|
| + void SmiOrConstant(Register dst, Register src1, Smi* constant);
|
| + void SmiXorConstant(Register dst, Register src1, Smi* constant);
|
|
|
| void SmiShiftLeftConstant(Register dst,
|
| Register src,
|
| @@ -367,20 +374,27 @@ class MacroAssembler: public Assembler {
|
| // Converts a positive smi to a negative index.
|
| SmiIndex SmiToNegativeIndex(Register dst, Register src, int shift);
|
|
|
| + bool IsUnsafeSmi(Smi* value);
|
| + void LoadUnsafeSmi(Register dst, Smi* source);
|
| +
|
| + // Basic Smi operations.
|
| + void Move(Register dst, Smi* source);
|
| + void Move(const Operand& dst, Smi* source);
|
| + void Push(Smi* smi);
|
| + void Test(const Operand& dst, Smi* source);
|
| +
|
| // ---------------------------------------------------------------------------
|
| // Macro instructions
|
|
|
| - // Expression support
|
| + // Load a register with a long value as efficiently as possible.
|
| void Set(Register dst, int64_t x);
|
| void Set(const Operand& dst, int64_t x);
|
|
|
| // Handle support
|
| - bool IsUnsafeSmi(Smi* value);
|
| bool IsUnsafeSmi(Handle<Object> value) {
|
| return IsUnsafeSmi(Smi::cast(*value));
|
| }
|
|
|
| - void LoadUnsafeSmi(Register dst, Smi* source);
|
| void LoadUnsafeSmi(Register dst, Handle<Object> source) {
|
| LoadUnsafeSmi(dst, Smi::cast(*source));
|
| }
|
| @@ -390,7 +404,6 @@ class MacroAssembler: public Assembler {
|
| void Cmp(Register dst, Handle<Object> source);
|
| void Cmp(const Operand& dst, Handle<Object> source);
|
| void Push(Handle<Object> source);
|
| - void Push(Smi* smi);
|
|
|
| // Control Flow
|
| void Jump(Address destination, RelocInfo::Mode rmode);
|
|
|