diff options
Diffstat (limited to 'deps/v8/src/ia32/macro-assembler-ia32.cc')
-rw-r--r-- | deps/v8/src/ia32/macro-assembler-ia32.cc | 151 |
1 files changed, 90 insertions, 61 deletions
diff --git a/deps/v8/src/ia32/macro-assembler-ia32.cc b/deps/v8/src/ia32/macro-assembler-ia32.cc index 9c5f31e2cf..14fb8ca852 100644 --- a/deps/v8/src/ia32/macro-assembler-ia32.cc +++ b/deps/v8/src/ia32/macro-assembler-ia32.cc @@ -129,14 +129,22 @@ void MacroAssembler::ClampDoubleToUint8(XMMRegister input_reg, XMMRegister scratch_reg, Register result_reg) { Label done; - ExternalReference zero_ref = ExternalReference::address_of_zero(); - movdbl(scratch_reg, Operand::StaticVariable(zero_ref)); - Set(result_reg, Immediate(0)); - ucomisd(input_reg, scratch_reg); - j(below, &done, Label::kNear); + Label conv_failure; + pxor(scratch_reg, scratch_reg); cvtsd2si(result_reg, input_reg); test(result_reg, Immediate(0xFFFFFF00)); j(zero, &done, Label::kNear); + cmp(result_reg, Immediate(0x80000000)); + j(equal, &conv_failure, Label::kNear); + mov(result_reg, Immediate(0)); + setcc(above, result_reg); + sub(result_reg, Immediate(1)); + and_(result_reg, Immediate(255)); + jmp(&done, Label::kNear); + bind(&conv_failure); + Set(result_reg, Immediate(0)); + ucomisd(input_reg, scratch_reg); + j(below, &done, Label::kNear); Set(result_reg, Immediate(255)); bind(&done); } @@ -274,9 +282,7 @@ void MacroAssembler::RecordWriteForMap( ASSERT(!object.is(value)); ASSERT(!object.is(address)); ASSERT(!value.is(address)); - if (emit_debug_code()) { - AbortIfSmi(object); - } + AssertNotSmi(object); if (!FLAG_incremental_marking) { return; @@ -323,9 +329,7 @@ void MacroAssembler::RecordWrite(Register object, ASSERT(!object.is(value)); ASSERT(!object.is(address)); ASSERT(!value.is(address)); - if (emit_debug_code()) { - AbortIfSmi(object); - } + AssertNotSmi(object); if (remembered_set_action == OMIT_REMEMBERED_SET && !FLAG_incremental_marking) { @@ -503,7 +507,8 @@ void MacroAssembler::StoreNumberToDoubleElements( Register scratch1, XMMRegister scratch2, Label* fail, - bool specialize_for_processor) { + bool specialize_for_processor, + int elements_offset) { Label smi_value, done, maybe_nan, not_nan, is_nan, have_double_value; JumpIfSmi(maybe_number, &smi_value, Label::kNear); @@ -525,12 +530,14 @@ void MacroAssembler::StoreNumberToDoubleElements( CpuFeatures::Scope use_sse2(SSE2); movdbl(scratch2, FieldOperand(maybe_number, HeapNumber::kValueOffset)); bind(&have_double_value); - movdbl(FieldOperand(elements, key, times_4, FixedDoubleArray::kHeaderSize), + movdbl(FieldOperand(elements, key, times_4, + FixedDoubleArray::kHeaderSize - elements_offset), scratch2); } else { fld_d(FieldOperand(maybe_number, HeapNumber::kValueOffset)); bind(&have_double_value); - fstp_d(FieldOperand(elements, key, times_4, FixedDoubleArray::kHeaderSize)); + fstp_d(FieldOperand(elements, key, times_4, + FixedDoubleArray::kHeaderSize - elements_offset)); } jmp(&done); @@ -557,13 +564,15 @@ void MacroAssembler::StoreNumberToDoubleElements( if (CpuFeatures::IsSupported(SSE2) && specialize_for_processor) { CpuFeatures::Scope fscope(SSE2); cvtsi2sd(scratch2, scratch1); - movdbl(FieldOperand(elements, key, times_4, FixedDoubleArray::kHeaderSize), + movdbl(FieldOperand(elements, key, times_4, + FixedDoubleArray::kHeaderSize - elements_offset), scratch2); } else { push(scratch1); fild_s(Operand(esp, 0)); pop(scratch1); - fstp_d(FieldOperand(elements, key, times_4, FixedDoubleArray::kHeaderSize)); + fstp_d(FieldOperand(elements, key, times_4, + FixedDoubleArray::kHeaderSize - elements_offset)); } bind(&done); } @@ -668,36 +677,44 @@ void MacroAssembler::FCmp() { } -void MacroAssembler::AbortIfNotNumber(Register object) { - Label ok; - JumpIfSmi(object, &ok); - cmp(FieldOperand(object, HeapObject::kMapOffset), - isolate()->factory()->heap_number_map()); - Assert(equal, "Operand not a number"); - bind(&ok); +void MacroAssembler::AssertNumber(Register object) { + if (emit_debug_code()) { + Label ok; + JumpIfSmi(object, &ok); + cmp(FieldOperand(object, HeapObject::kMapOffset), + isolate()->factory()->heap_number_map()); + Check(equal, "Operand not a number"); + bind(&ok); + } } -void MacroAssembler::AbortIfNotSmi(Register object) { - test(object, Immediate(kSmiTagMask)); - Assert(equal, "Operand is not a smi"); +void MacroAssembler::AssertSmi(Register object) { + if (emit_debug_code()) { + test(object, Immediate(kSmiTagMask)); + Check(equal, "Operand is not a smi"); + } } -void MacroAssembler::AbortIfNotString(Register object) { - test(object, Immediate(kSmiTagMask)); - Assert(not_equal, "Operand is not a string"); - push(object); - mov(object, FieldOperand(object, HeapObject::kMapOffset)); - CmpInstanceType(object, FIRST_NONSTRING_TYPE); - pop(object); - Assert(below, "Operand is not a string"); +void MacroAssembler::AssertString(Register object) { + if (emit_debug_code()) { + test(object, Immediate(kSmiTagMask)); + Check(not_equal, "Operand is a smi and not a string"); + push(object); + mov(object, FieldOperand(object, HeapObject::kMapOffset)); + CmpInstanceType(object, FIRST_NONSTRING_TYPE); + pop(object); + Check(below, "Operand is not a string"); + } } -void MacroAssembler::AbortIfSmi(Register object) { - test(object, Immediate(kSmiTagMask)); - Assert(not_equal, "Operand is a smi"); +void MacroAssembler::AssertNotSmi(Register object) { + if (emit_debug_code()) { + test(object, Immediate(kSmiTagMask)); + Check(not_equal, "Operand is a smi"); + } } @@ -1441,14 +1458,14 @@ void MacroAssembler::AllocateAsciiString(Register result, Label* gc_required) { // Calculate the number of bytes needed for the characters in the string while // observing object alignment. - ASSERT((SeqAsciiString::kHeaderSize & kObjectAlignmentMask) == 0); + ASSERT((SeqOneByteString::kHeaderSize & kObjectAlignmentMask) == 0); mov(scratch1, length); ASSERT(kCharSize == 1); add(scratch1, Immediate(kObjectAlignmentMask)); and_(scratch1, Immediate(~kObjectAlignmentMask)); // Allocate ASCII string in new space. - AllocateInNewSpace(SeqAsciiString::kHeaderSize, + AllocateInNewSpace(SeqOneByteString::kHeaderSize, times_1, scratch1, result, @@ -1476,7 +1493,7 @@ void MacroAssembler::AllocateAsciiString(Register result, ASSERT(length > 0); // Allocate ASCII string in new space. - AllocateInNewSpace(SeqAsciiString::SizeFor(length), + AllocateInNewSpace(SeqOneByteString::SizeFor(length), result, scratch1, scratch2, @@ -1903,9 +1920,25 @@ void MacroAssembler::CallApiFunctionAndReturn(Address function_address, mov(edi, Operand::StaticVariable(limit_address)); add(Operand::StaticVariable(level_address), Immediate(1)); + if (FLAG_log_timer_events) { + FrameScope frame(this, StackFrame::MANUAL); + PushSafepointRegisters(); + PrepareCallCFunction(0, eax); + CallCFunction(ExternalReference::log_enter_external_function(isolate()), 0); + PopSafepointRegisters(); + } + // Call the api function. call(function_address, RelocInfo::RUNTIME_ENTRY); + if (FLAG_log_timer_events) { + FrameScope frame(this, StackFrame::MANUAL); + PushSafepointRegisters(); + PrepareCallCFunction(0, eax); + CallCFunction(ExternalReference::log_leave_external_function(isolate()), 0); + PopSafepointRegisters(); + } + if (!kReturnHandlesDirectly) { // PrepareCallApiFunction saved pointer to the output slot into // callee-save register esi. @@ -2573,19 +2606,13 @@ void MacroAssembler::Abort(const char* msg) { void MacroAssembler::LoadInstanceDescriptors(Register map, Register descriptors) { - Register temp = descriptors; - mov(temp, FieldOperand(map, Map::kTransitionsOrBackPointerOffset)); + mov(descriptors, FieldOperand(map, Map::kDescriptorsOffset)); +} - Label ok, fail; - CheckMap(temp, - isolate()->factory()->fixed_array_map(), - &fail, - DONT_DO_SMI_CHECK); - mov(descriptors, FieldOperand(temp, TransitionArray::kDescriptorsOffset)); - jmp(&ok); - bind(&fail); - mov(descriptors, isolate()->factory()->empty_descriptor_array()); - bind(&ok); + +void MacroAssembler::NumberOfOwnDescriptors(Register dst, Register map) { + mov(dst, FieldOperand(map, Map::kBitField3Offset)); + DecodeField<Map::NumberOfOwnDescriptorsBits>(dst); } @@ -2609,7 +2636,7 @@ void MacroAssembler::JumpIfInstanceTypeIsNotSequentialAscii( } and_(scratch, kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask); - cmp(scratch, kStringTag | kSeqStringTag | kAsciiStringTag); + cmp(scratch, kStringTag | kSeqStringTag | kOneByteStringTag); j(not_equal, failure); } @@ -2632,15 +2659,17 @@ void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register object1, movzx_b(scratch2, FieldOperand(scratch2, Map::kInstanceTypeOffset)); // Check that both are flat ASCII strings. - const int kFlatAsciiStringMask = - kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask; + const int kFlatAsciiStringMask = kIsNotStringMask | kStringRepresentationMask + | kStringEncodingMask | kAsciiDataHintTag; const int kFlatAsciiStringTag = ASCII_STRING_TYPE; // Interleave bits from both instance types and compare them in one check. - ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3)); + ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 8)); + ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask); and_(scratch1, kFlatAsciiStringMask); and_(scratch2, kFlatAsciiStringMask); - lea(scratch1, Operand(scratch1, scratch2, times_8, 0)); - cmp(scratch1, kFlatAsciiStringTag | (kFlatAsciiStringTag << 3)); + shl(scratch1, 8); + or_(scratch1, scratch2); + cmp(scratch1, kFlatAsciiStringTag | (kFlatAsciiStringTag << 8)); j(not_equal, failure); } @@ -2900,15 +2929,15 @@ void MacroAssembler::EnsureNotWhite( bind(¬_external); // Sequential string, either ASCII or UC16. - ASSERT(kAsciiStringTag == 0x04); + ASSERT(kOneByteStringTag == 0x04); and_(length, Immediate(kStringEncodingMask)); xor_(length, Immediate(kStringEncodingMask)); add(length, Immediate(0x04)); // Value now either 4 (if ASCII) or 8 (if UC16), i.e., char-size shifted // by 2. If we multiply the string length as smi by this, it still // won't overflow a 32-bit value. - ASSERT_EQ(SeqAsciiString::kMaxSize, SeqTwoByteString::kMaxSize); - ASSERT(SeqAsciiString::kMaxSize <= + ASSERT_EQ(SeqOneByteString::kMaxSize, SeqTwoByteString::kMaxSize); + ASSERT(SeqOneByteString::kMaxSize <= static_cast<int>(0xffffffffu >> (2 + kSmiTagSize))); imul(length, FieldOperand(value, String::kLengthOffset)); shr(length, 2 + kSmiTagSize + kSmiShiftSize); |