| Index: src/x64/macro-assembler-x64.cc
|
| diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
|
| index 55ad03ee4d3f4dbf2cd4fdacecb31f267edbe8e0..b4d4d9d1ae384fbce698de4ad210557d5aea997e 100644
|
| --- a/src/x64/macro-assembler-x64.cc
|
| +++ b/src/x64/macro-assembler-x64.cc
|
| @@ -92,7 +92,7 @@ void MacroAssembler::CompareRoot(const Operand& with,
|
| void MacroAssembler::RecordWriteHelper(Register object,
|
| Register addr,
|
| Register scratch) {
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| // Check that the object is not in new space.
|
| NearLabel not_in_new_space;
|
| InNewSpace(object, scratch, not_equal, ¬_in_new_space);
|
| @@ -124,7 +124,7 @@ void MacroAssembler::RecordWrite(Register object,
|
| ASSERT(!object.is(rsi) && !value.is(rsi) && !index.is(rsi));
|
|
|
| // First, check if a write barrier is even needed. The tests below
|
| - // catch stores of Smis and stores into young gen.
|
| + // catch stores of smis and stores into the young generation.
|
| Label done;
|
| JumpIfSmi(value, &done);
|
|
|
| @@ -136,7 +136,7 @@ void MacroAssembler::RecordWrite(Register object,
|
| // clobbering done inside RecordWriteNonSmi but it's necessary to
|
| // avoid having the fast case for smis leave the registers
|
| // unchanged.
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| movq(object, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
|
| movq(value, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
|
| movq(index, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
|
| @@ -153,7 +153,7 @@ void MacroAssembler::RecordWrite(Register object,
|
| ASSERT(!object.is(rsi) && !value.is(rsi) && !address.is(rsi));
|
|
|
| // First, check if a write barrier is even needed. The tests below
|
| - // catch stores of Smis and stores into young gen.
|
| + // catch stores of smis and stores into the young generation.
|
| Label done;
|
| JumpIfSmi(value, &done);
|
|
|
| @@ -165,7 +165,7 @@ void MacroAssembler::RecordWrite(Register object,
|
|
|
| // Clobber all input registers when running with the debug-code flag
|
| // turned on to provoke errors.
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| movq(object, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
|
| movq(address, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
|
| movq(value, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
|
| @@ -179,7 +179,7 @@ void MacroAssembler::RecordWriteNonSmi(Register object,
|
| Register index) {
|
| Label done;
|
|
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| NearLabel okay;
|
| JumpIfNotSmi(object, &okay);
|
| Abort("MacroAssembler::RecordWriteNonSmi cannot deal with smis");
|
| @@ -223,7 +223,7 @@ void MacroAssembler::RecordWriteNonSmi(Register object,
|
|
|
| // Clobber all input registers when running with the debug-code flag
|
| // turned on to provoke errors.
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| movq(object, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
|
| movq(scratch, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
|
| movq(index, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
|
| @@ -231,12 +231,12 @@ void MacroAssembler::RecordWriteNonSmi(Register object,
|
| }
|
|
|
| void MacroAssembler::Assert(Condition cc, const char* msg) {
|
| - if (FLAG_debug_code) Check(cc, msg);
|
| + if (emit_debug_code()) Check(cc, msg);
|
| }
|
|
|
|
|
| void MacroAssembler::AssertFastElements(Register elements) {
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| NearLabel ok;
|
| CompareRoot(FieldOperand(elements, HeapObject::kMapOffset),
|
| Heap::kFixedArrayMapRootIndex);
|
| @@ -713,7 +713,7 @@ Register MacroAssembler::GetSmiConstant(Smi* source) {
|
| }
|
|
|
| void MacroAssembler::LoadSmiConstant(Register dst, Smi* source) {
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| movq(dst,
|
| reinterpret_cast<uint64_t>(Smi::FromInt(kSmiConstantRegisterValue)),
|
| RelocInfo::NONE);
|
| @@ -782,7 +782,7 @@ void MacroAssembler::Integer32ToSmi(Register dst, Register src) {
|
|
|
|
|
| void MacroAssembler::Integer32ToSmiField(const Operand& dst, Register src) {
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| testb(dst, Immediate(0x01));
|
| NearLabel ok;
|
| j(zero, &ok);
|
| @@ -843,12 +843,24 @@ void MacroAssembler::SmiTest(Register src) {
|
| }
|
|
|
|
|
| -void MacroAssembler::SmiCompare(Register dst, Register src) {
|
| - cmpq(dst, src);
|
| +void MacroAssembler::SmiCompare(Register smi1, Register smi2) {
|
| + if (emit_debug_code()) {
|
| + AbortIfNotSmi(smi1);
|
| + AbortIfNotSmi(smi2);
|
| + }
|
| + cmpq(smi1, smi2);
|
| }
|
|
|
|
|
| void MacroAssembler::SmiCompare(Register dst, Smi* src) {
|
| + if (emit_debug_code()) {
|
| + AbortIfNotSmi(dst);
|
| + }
|
| + Cmp(dst, src);
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::Cmp(Register dst, Smi* src) {
|
| ASSERT(!dst.is(kScratchRegister));
|
| if (src->value() == 0) {
|
| testq(dst, dst);
|
| @@ -860,20 +872,39 @@ void MacroAssembler::SmiCompare(Register dst, Smi* src) {
|
|
|
|
|
| void MacroAssembler::SmiCompare(Register dst, const Operand& src) {
|
| + if (emit_debug_code()) {
|
| + AbortIfNotSmi(dst);
|
| + AbortIfNotSmi(src);
|
| + }
|
| cmpq(dst, src);
|
| }
|
|
|
|
|
| void MacroAssembler::SmiCompare(const Operand& dst, Register src) {
|
| + if (emit_debug_code()) {
|
| + AbortIfNotSmi(dst);
|
| + AbortIfNotSmi(src);
|
| + }
|
| cmpq(dst, src);
|
| }
|
|
|
|
|
| void MacroAssembler::SmiCompare(const Operand& dst, Smi* src) {
|
| + if (emit_debug_code()) {
|
| + AbortIfNotSmi(dst);
|
| + }
|
| cmpl(Operand(dst, kSmiShift / kBitsPerByte), Immediate(src->value()));
|
| }
|
|
|
|
|
| +void MacroAssembler::Cmp(const Operand& dst, Smi* src) {
|
| + // The Operand cannot use the smi register.
|
| + Register smi_reg = GetSmiConstant(src);
|
| + ASSERT(!dst.AddressUsesRegister(smi_reg));
|
| + cmpq(dst, smi_reg);
|
| +}
|
| +
|
| +
|
| void MacroAssembler::SmiCompareInteger32(const Operand& dst, Register src) {
|
| cmpl(Operand(dst, kSmiShift / kBitsPerByte), src);
|
| }
|
| @@ -1358,7 +1389,7 @@ void MacroAssembler::Move(const Operand& dst, Handle<Object> source) {
|
|
|
| void MacroAssembler::Cmp(Register dst, Handle<Object> source) {
|
| if (source->IsSmi()) {
|
| - SmiCompare(dst, Smi::cast(*source));
|
| + Cmp(dst, Smi::cast(*source));
|
| } else {
|
| Move(kScratchRegister, source);
|
| cmpq(dst, kScratchRegister);
|
| @@ -1368,7 +1399,7 @@ void MacroAssembler::Cmp(Register dst, Handle<Object> source) {
|
|
|
| void MacroAssembler::Cmp(const Operand& dst, Handle<Object> source) {
|
| if (source->IsSmi()) {
|
| - SmiCompare(dst, Smi::cast(*source));
|
| + Cmp(dst, Smi::cast(*source));
|
| } else {
|
| ASSERT(source->IsHeapObject());
|
| movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT);
|
| @@ -1760,7 +1791,12 @@ void MacroAssembler::AbortIfSmi(Register object) {
|
|
|
|
|
| void MacroAssembler::AbortIfNotSmi(Register object) {
|
| - NearLabel ok;
|
| + Condition is_smi = CheckSmi(object);
|
| + Assert(is_smi, "Operand is not a smi");
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::AbortIfNotSmi(const Operand& object) {
|
| Condition is_smi = CheckSmi(object);
|
| Assert(is_smi, "Operand is not a smi");
|
| }
|
| @@ -1998,7 +2034,7 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) {
|
| Push(Smi::FromInt(type));
|
| movq(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT);
|
| push(kScratchRegister);
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| movq(kScratchRegister,
|
| FACTORY->undefined_value(),
|
| RelocInfo::EMBEDDED_OBJECT);
|
| @@ -2009,7 +2045,7 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) {
|
|
|
|
|
| void MacroAssembler::LeaveFrame(StackFrame::Type type) {
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| Move(kScratchRegister, Smi::FromInt(type));
|
| cmpq(Operand(rbp, StandardFrameConstants::kMarkerOffset), kScratchRegister);
|
| Check(equal, "stack frame types must match");
|
| @@ -2159,7 +2195,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
|
| movq(scratch, Operand(rbp, StandardFrameConstants::kContextOffset));
|
|
|
| // When generating debug code, make sure the lexical context is set.
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| cmpq(scratch, Immediate(0));
|
| Check(not_equal, "we should not have an empty lexical context");
|
| }
|
| @@ -2169,7 +2205,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
|
| movq(scratch, FieldOperand(scratch, GlobalObject::kGlobalContextOffset));
|
|
|
| // Check the context is a global context.
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| Cmp(FieldOperand(scratch, HeapObject::kMapOffset),
|
| FACTORY->global_context_map());
|
| Check(equal, "JSGlobalObject::global_context should be a global context.");
|
| @@ -2185,7 +2221,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
|
| // object.
|
|
|
| // Check the context is a global context.
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| // Preserve original value of holder_reg.
|
| push(holder_reg);
|
| movq(holder_reg, FieldOperand(holder_reg, JSGlobalProxy::kContextOffset));
|
| @@ -2246,7 +2282,7 @@ void MacroAssembler::LoadAllocationTopHelper(Register result,
|
|
|
| void MacroAssembler::UpdateAllocationTopHelper(Register result_end,
|
| Register scratch) {
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| testq(result_end, Immediate(kObjectAlignmentMask));
|
| Check(zero, "Unaligned allocation in new space");
|
| }
|
| @@ -2277,7 +2313,7 @@ void MacroAssembler::AllocateInNewSpace(int object_size,
|
| Label* gc_required,
|
| AllocationFlags flags) {
|
| if (!FLAG_inline_new) {
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| // Trash the registers to simulate an allocation failure.
|
| movl(result, Immediate(0x7091));
|
| if (result_end.is_valid()) {
|
| @@ -2335,7 +2371,7 @@ void MacroAssembler::AllocateInNewSpace(int header_size,
|
| Label* gc_required,
|
| AllocationFlags flags) {
|
| if (!FLAG_inline_new) {
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| // Trash the registers to simulate an allocation failure.
|
| movl(result, Immediate(0x7091));
|
| movl(result_end, Immediate(0x7191));
|
| @@ -2382,7 +2418,7 @@ void MacroAssembler::AllocateInNewSpace(Register object_size,
|
| Label* gc_required,
|
| AllocationFlags flags) {
|
| if (!FLAG_inline_new) {
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| // Trash the registers to simulate an allocation failure.
|
| movl(result, Immediate(0x7091));
|
| movl(result_end, Immediate(0x7191));
|
| @@ -2589,7 +2625,7 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) {
|
| // (i.e., the static scope chain and runtime context chain do not agree).
|
| // A variable occurring in such a scope should have slot type LOOKUP and
|
| // not CONTEXT.
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| cmpq(dst, Operand(dst, Context::SlotOffset(Context::FCONTEXT_INDEX)));
|
| Check(equal, "Yo dawg, I heard you liked function contexts "
|
| "so I put function contexts in all your contexts");
|
| @@ -2616,7 +2652,7 @@ void MacroAssembler::LoadGlobalFunctionInitialMap(Register function,
|
| Register map) {
|
| // Load the initial map. The global functions all have initial maps.
|
| movq(map, FieldOperand(function, JSFunction::kPrototypeOrInitialMapOffset));
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| Label ok, fail;
|
| CheckMap(map, FACTORY->meta_map(), &fail, false);
|
| jmp(&ok);
|
| @@ -2694,7 +2730,7 @@ void MacroAssembler::CallCFunction(Register function, int num_arguments) {
|
| }
|
|
|
| // Check stack alignment.
|
| - if (FLAG_debug_code) {
|
| + if (emit_debug_code()) {
|
| CheckStackAlignment();
|
| }
|
|
|
|
|