Index: src/ppc/macro-assembler-ppc.h |
diff --git a/src/ppc/macro-assembler-ppc.h b/src/ppc/macro-assembler-ppc.h |
index 8f1aeab09fc6b683ef863b23b4bcf77733855c05..146489d1310021d837a6fe26ee7139fb250d7527 100644 |
--- a/src/ppc/macro-assembler-ppc.h |
+++ b/src/ppc/macro-assembler-ppc.h |
@@ -177,9 +177,6 @@ class MacroAssembler : public Assembler { |
void CheckPageFlag(Register object, Register scratch, int mask, Condition cc, |
Label* condition_met); |
- void CheckMapDeprecated(Handle<Map> map, Register scratch, |
- Label* if_deprecated); |
- |
// Check if object is in new space. Jumps if the object is not in new space. |
// The register scratch can be object itself, but scratch will be clobbered. |
void JumpIfNotInNewSpace(Register object, Register scratch, Label* branch) { |
@@ -389,7 +386,8 @@ class MacroAssembler : public Assembler { |
// Expect the number of values, pushed prior to the exit frame, to |
// remove in a register (or no_reg, if there is nothing to remove). |
void LeaveExitFrame(bool save_doubles, Register argument_count, |
- bool restore_context); |
+ bool restore_context, |
+ bool argument_count_is_length = false); |
// Get the actual activation frame alignment for target environment. |
static int ActivationFrameAlignment(); |
@@ -433,26 +431,26 @@ class MacroAssembler : public Assembler { |
void LoadDoubleLiteral(DoubleRegister result, double value, Register scratch); |
void LoadWord(Register dst, const MemOperand& mem, Register scratch); |
- |
void LoadWordArith(Register dst, const MemOperand& mem, |
Register scratch = no_reg); |
- |
void StoreWord(Register src, const MemOperand& mem, Register scratch); |
void LoadHalfWord(Register dst, const MemOperand& mem, Register scratch); |
- |
+ void LoadHalfWordArith(Register dst, const MemOperand& mem, |
+ Register scratch = no_reg); |
void StoreHalfWord(Register src, const MemOperand& mem, Register scratch); |
void LoadByte(Register dst, const MemOperand& mem, Register scratch); |
- |
void StoreByte(Register src, const MemOperand& mem, Register scratch); |
void LoadRepresentation(Register dst, const MemOperand& mem, Representation r, |
Register scratch = no_reg); |
- |
void StoreRepresentation(Register src, const MemOperand& mem, |
Representation r, Register scratch = no_reg); |
+ void LoadDouble(DoubleRegister dst, const MemOperand& mem, Register scratch); |
+ void StoreDouble(DoubleRegister src, const MemOperand& mem, Register scratch); |
+ |
// Move values between integer and floating point registers. |
void MovIntToDouble(DoubleRegister dst, Register src, Register scratch); |
void MovUnsignedIntToDouble(DoubleRegister dst, Register src, |
@@ -762,12 +760,22 @@ class MacroAssembler : public Assembler { |
Label* fail, SmiCheckType smi_check_type); |
- // Check if the map of an object is equal to a specified map and branch to a |
- // specified target if equal. Skip the smi check if not required (object is |
- // known to be a heap object) |
- void DispatchMap(Register obj, Register scratch, Handle<Map> map, |
- Handle<Code> success, SmiCheckType smi_check_type); |
+ // Check if the map of an object is equal to a specified weak map and branch |
+ // to a specified target if equal. Skip the smi check if not required |
+ // (object is known to be a heap object) |
+ void DispatchWeakMap(Register obj, Register scratch1, Register scratch2, |
+ Handle<WeakCell> cell, Handle<Code> success, |
+ SmiCheckType smi_check_type); |
+ |
+ // Compare the given value and the value of weak cell. |
+ void CmpWeakValue(Register value, Handle<WeakCell> cell, Register scratch, |
+ CRegister cr = cr7); |
+ void GetWeakValue(Register value, Handle<WeakCell> cell); |
+ |
+ // Load the value of the weak cell in the value register. Branch to the given |
+ // miss label if the weak cell was cleared. |
+ void LoadWeakValue(Register value, Handle<WeakCell> cell, Label* miss); |
// Compare the object in a register to a value from the root list. |
// Uses the ip register as scratch. |
@@ -781,7 +789,7 @@ class MacroAssembler : public Assembler { |
LoadP(type, FieldMemOperand(obj, HeapObject::kMapOffset)); |
lbz(type, FieldMemOperand(type, Map::kInstanceTypeOffset)); |
andi(r0, type, Operand(kIsNotStringMask)); |
- DCHECK_EQ(0, kStringTag); |
+ DCHECK_EQ(0u, kStringTag); |
return eq; |
} |
@@ -965,15 +973,6 @@ class MacroAssembler : public Assembler { |
void MovFromFloatParameter(DoubleRegister dst); |
void MovFromFloatResult(DoubleRegister dst); |
- // Calls an API function. Allocates HandleScope, extracts returned value |
- // from handle and propagates exceptions. Restores context. stack_space |
- // - space to be unwound on exit (includes the call JS arguments space and |
- // the additional space allocated for the fast call). |
- void CallApiFunctionAndReturn(Register function_address, |
- ExternalReference thunk_ref, int stack_space, |
- MemOperand return_value_operand, |
- MemOperand* context_restore_operand); |
- |
// Jump to a runtime routine. |
void JumpToExternalReference(const ExternalReference& builtin); |
@@ -1123,7 +1122,7 @@ class MacroAssembler : public Assembler { |
// --------------------------------------------------------------------------- |
// Smi utilities |
- // Shift left by 1 |
+ // Shift left by kSmiShift |
void SmiTag(Register reg, RCBit rc = LeaveRC) { SmiTag(reg, reg, rc); } |
void SmiTag(Register dst, Register src, RCBit rc = LeaveRC) { |
ShiftLeftImm(dst, src, Operand(kSmiShift), rc); |
@@ -1137,6 +1136,7 @@ class MacroAssembler : public Assembler { |
inline void JumpIfNotSmiCandidate(Register value, Register scratch, |
Label* not_smi_label) { |
// High bits must be identical to fit into an Smi |
+ STATIC_ASSERT(kSmiShift == 1); |
addis(scratch, value, Operand(0x40000000u >> 16)); |
cmpi(scratch, Operand::Zero()); |
blt(not_smi_label); |
@@ -1235,16 +1235,15 @@ class MacroAssembler : public Assembler { |
void UntagAndJumpIfNotSmi(Register dst, Register src, Label* non_smi_case); |
inline void TestIfSmi(Register value, Register scratch) { |
- TestBit(value, 0, scratch); // tst(value, Operand(kSmiTagMask)); |
+ TestBitRange(value, kSmiTagSize - 1, 0, scratch); |
} |
inline void TestIfPositiveSmi(Register value, Register scratch) { |
- STATIC_ASSERT((kSmiTagMask | kSmiSignMask) == |
- (intptr_t)(1UL << (kBitsPerPointer - 1) | 1)); |
#if V8_TARGET_ARCH_PPC64 |
- rldicl(scratch, value, 1, kBitsPerPointer - 2, SetRC); |
+ rldicl(scratch, value, 1, kBitsPerPointer - (1 + kSmiTagSize), SetRC); |
#else |
- rlwinm(scratch, value, 1, kBitsPerPointer - 2, kBitsPerPointer - 1, SetRC); |
+ rlwinm(scratch, value, 1, kBitsPerPointer - (1 + kSmiTagSize), |
+ kBitsPerPointer - 1, SetRC); |
#endif |
} |
@@ -1269,12 +1268,11 @@ class MacroAssembler : public Assembler { |
#if V8_TARGET_ARCH_PPC64 |
- inline void TestIfInt32(Register value, Register scratch1, Register scratch2, |
+ inline void TestIfInt32(Register value, Register scratch, |
CRegister cr = cr7) { |
// High bits must be identical to fit into an 32-bit integer |
- srawi(scratch1, value, 31); |
- sradi(scratch2, value, 32); |
- cmp(scratch1, scratch2, cr); |
+ extsw(scratch, value); |
+ cmp(scratch, value, cr); |
} |
#else |
inline void TestIfInt32(Register hi_word, Register lo_word, Register scratch, |
@@ -1285,6 +1283,18 @@ class MacroAssembler : public Assembler { |
} |
#endif |
+#if V8_TARGET_ARCH_PPC64 |
+ // Ensure it is permissable to read/write int value directly from |
+ // upper half of the smi. |
+ STATIC_ASSERT(kSmiTag == 0); |
+ STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 32); |
+#endif |
+#if V8_TARGET_ARCH_PPC64 && V8_TARGET_LITTLE_ENDIAN |
+#define SmiWordOffset(offset) (offset + kPointerSize / 2) |
+#else |
+#define SmiWordOffset(offset) offset |
+#endif |
+ |
// Abort execution if argument is not a string, enabled via --debug-code. |
void AssertString(Register object); |
@@ -1369,15 +1379,18 @@ class MacroAssembler : public Assembler { |
void LoadInstanceDescriptors(Register map, Register descriptors); |
void EnumLength(Register dst, Register map); |
void NumberOfOwnDescriptors(Register dst, Register map); |
+ void LoadAccessor(Register dst, Register holder, int accessor_index, |
+ AccessorComponent accessor); |
template <typename Field> |
- void DecodeField(Register dst, Register src) { |
- ExtractBitRange(dst, src, Field::kShift + Field::kSize - 1, Field::kShift); |
+ void DecodeField(Register dst, Register src, RCBit rc = LeaveRC) { |
+ ExtractBitRange(dst, src, Field::kShift + Field::kSize - 1, Field::kShift, |
+ rc); |
} |
template <typename Field> |
- void DecodeField(Register reg) { |
- DecodeField<Field>(reg, reg); |
+ void DecodeField(Register reg, RCBit rc = LeaveRC) { |
+ DecodeField<Field>(reg, reg, rc); |
} |
template <typename Field> |