diff options
Diffstat (limited to 'deps/v8/src/x64')
-rw-r--r-- | deps/v8/src/x64/assembler-x64-inl.h | 16 | ||||
-rw-r--r-- | deps/v8/src/x64/assembler-x64.cc | 25 | ||||
-rw-r--r-- | deps/v8/src/x64/assembler-x64.h | 2 | ||||
-rw-r--r-- | deps/v8/src/x64/code-stubs-x64.cc | 89 | ||||
-rw-r--r-- | deps/v8/src/x64/deoptimizer-x64.cc | 37 | ||||
-rw-r--r-- | deps/v8/src/x64/disasm-x64.cc | 25 | ||||
-rw-r--r-- | deps/v8/src/x64/interface-descriptors-x64.cc | 18 | ||||
-rw-r--r-- | deps/v8/src/x64/macro-assembler-x64.cc | 3 | ||||
-rw-r--r-- | deps/v8/src/x64/sse-instr.h | 4 |
9 files changed, 91 insertions, 128 deletions
diff --git a/deps/v8/src/x64/assembler-x64-inl.h b/deps/v8/src/x64/assembler-x64-inl.h index 7deaf23635..4a2e9a17e8 100644 --- a/deps/v8/src/x64/assembler-x64-inl.h +++ b/deps/v8/src/x64/assembler-x64-inl.h @@ -521,23 +521,23 @@ template <typename ObjectVisitor> void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { RelocInfo::Mode mode = rmode(); if (mode == RelocInfo::EMBEDDED_OBJECT) { - visitor->VisitEmbeddedPointer(this); + visitor->VisitEmbeddedPointer(host(), this); Assembler::FlushICache(isolate, pc_, sizeof(Address)); } else if (RelocInfo::IsCodeTarget(mode)) { - visitor->VisitCodeTarget(this); + visitor->VisitCodeTarget(host(), this); } else if (mode == RelocInfo::CELL) { - visitor->VisitCell(this); + visitor->VisitCellPointer(host(), this); } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { - visitor->VisitExternalReference(this); + visitor->VisitExternalReference(host(), this); } else if (mode == RelocInfo::INTERNAL_REFERENCE) { - visitor->VisitInternalReference(this); + visitor->VisitInternalReference(host(), this); } else if (RelocInfo::IsCodeAgeSequence(mode)) { - visitor->VisitCodeAgeSequence(this); + visitor->VisitCodeAgeSequence(host(), this); } else if (RelocInfo::IsDebugBreakSlot(mode) && IsPatchedDebugBreakSlotSequence()) { - visitor->VisitDebugTarget(this); + visitor->VisitDebugTarget(host(), this); } else if (RelocInfo::IsRuntimeEntry(mode)) { - visitor->VisitRuntimeEntry(this); + visitor->VisitRuntimeEntry(host(), this); } } diff --git a/deps/v8/src/x64/assembler-x64.cc b/deps/v8/src/x64/assembler-x64.cc index b366e66c2a..b2330b3320 100644 --- a/deps/v8/src/x64/assembler-x64.cc +++ b/deps/v8/src/x64/assembler-x64.cc @@ -935,7 +935,6 @@ void Assembler::cld() { emit(0xFC); } - void Assembler::cdq() { EnsureSpace ensure_space(this); emit(0x99); @@ -2892,11 +2891,11 @@ void Assembler::pextrw(Register dst, XMMRegister src, int8_t imm8) { DCHECK(is_uint8(imm8)); EnsureSpace ensure_space(this); emit(0x66); - emit_optional_rex_32(dst, src); + emit_optional_rex_32(src, dst); emit(0x0F); emit(0x3A); emit(0x15); - emit_sse_operand(dst, src); + emit_sse_operand(src, dst); emit(imm8); } @@ -4636,6 +4635,26 @@ void Assembler::psrldq(XMMRegister dst, uint8_t shift) { emit(shift); } +void Assembler::pshufhw(XMMRegister dst, XMMRegister src, uint8_t shuffle) { + EnsureSpace ensure_space(this); + emit(0xF3); + emit_optional_rex_32(dst, src); + emit(0x0F); + emit(0x70); + emit_sse_operand(dst, src); + emit(shuffle); +} + +void Assembler::pshuflw(XMMRegister dst, XMMRegister src, uint8_t shuffle) { + EnsureSpace ensure_space(this); + emit(0xF2); + emit_optional_rex_32(dst, src); + emit(0x0F); + emit(0x70); + emit_sse_operand(dst, src); + emit(shuffle); +} + void Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) { EnsureSpace ensure_space(this); emit(0x66); diff --git a/deps/v8/src/x64/assembler-x64.h b/deps/v8/src/x64/assembler-x64.h index 6a28b51fc8..0f2f27247e 100644 --- a/deps/v8/src/x64/assembler-x64.h +++ b/deps/v8/src/x64/assembler-x64.h @@ -1305,6 +1305,8 @@ class Assembler : public AssemblerBase { void psrldq(XMMRegister dst, uint8_t shift); void pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle); void pshufd(XMMRegister dst, const Operand& src, uint8_t shuffle); + void pshufhw(XMMRegister dst, XMMRegister src, uint8_t shuffle); + void pshuflw(XMMRegister dst, XMMRegister src, uint8_t shuffle); void cvtdq2ps(XMMRegister dst, XMMRegister src); void cvtdq2ps(XMMRegister dst, const Operand& src); diff --git a/deps/v8/src/x64/code-stubs-x64.cc b/deps/v8/src/x64/code-stubs-x64.cc index fc080f4c4c..84630928d4 100644 --- a/deps/v8/src/x64/code-stubs-x64.cc +++ b/deps/v8/src/x64/code-stubs-x64.cc @@ -350,85 +350,6 @@ void MathPowStub::Generate(MacroAssembler* masm) { __ ret(0); } -void RegExpExecStub::Generate(MacroAssembler* masm) { -#ifdef V8_INTERPRETED_REGEXP - // This case is handled prior to the RegExpExecStub call. - __ Abort(kUnexpectedRegExpExecCall); -#else // V8_INTERPRETED_REGEXP - // Isolates: note we add an additional parameter here (isolate pointer). - static const int kRegExpExecuteArguments = 9; - int argument_slots_on_stack = - masm->ArgumentStackSlotsForCFunctionCall(kRegExpExecuteArguments); - __ EnterApiExitFrame(argument_slots_on_stack); - - // Argument 9: Pass current isolate address. - __ LoadAddress(kScratchRegister, - ExternalReference::isolate_address(isolate())); - __ movq(Operand(rsp, (argument_slots_on_stack - 1) * kRegisterSize), - kScratchRegister); - - // Argument 8: Indicate that this is a direct call from JavaScript. - __ movq(Operand(rsp, (argument_slots_on_stack - 2) * kRegisterSize), - Immediate(1)); - - // Argument 7: Start (high end) of backtracking stack memory area. - ExternalReference address_of_regexp_stack_memory_address = - ExternalReference::address_of_regexp_stack_memory_address(isolate()); - ExternalReference address_of_regexp_stack_memory_size = - ExternalReference::address_of_regexp_stack_memory_size(isolate()); - __ Move(kScratchRegister, address_of_regexp_stack_memory_address); - __ movp(r12, Operand(kScratchRegister, 0)); - __ Move(kScratchRegister, address_of_regexp_stack_memory_size); - __ addp(r12, Operand(kScratchRegister, 0)); - __ movq(Operand(rsp, (argument_slots_on_stack - 3) * kRegisterSize), r12); - - // Argument 6: Set the number of capture registers to zero to force global - // regexps to behave as non-global. This does not affect non-global regexps. - // Argument 6 is passed in r9 on Linux and on the stack on Windows. -#ifdef _WIN64 - __ movq(Operand(rsp, (argument_slots_on_stack - 4) * kRegisterSize), - Immediate(0)); -#else - __ Set(r9, 0); -#endif - - // Argument 5: static offsets vector buffer. - // Argument 5 passed in r8 on Linux and on the stack on Windows. -#ifdef _WIN64 - __ LoadAddress( - r12, ExternalReference::address_of_static_offsets_vector(isolate())); - __ movq(Operand(rsp, (argument_slots_on_stack - 5) * kRegisterSize), r12); -#else // _WIN64 - __ LoadAddress( - r8, ExternalReference::address_of_static_offsets_vector(isolate())); -#endif - - // Argument 2: Previous index. - // TODO(jgruber): Ideally, LastIndexRegister would already equal arg_reg_2, - // but that makes register allocation fail. - __ movp(arg_reg_2, RegExpExecDescriptor::LastIndexRegister()); - - // Argument 4: End of string data - // Argument 3: Start of string data - CHECK(arg_reg_4.is(RegExpExecDescriptor::StringEndRegister())); - CHECK(arg_reg_3.is(RegExpExecDescriptor::StringStartRegister())); - - // Argument 1: Original subject string. - CHECK(arg_reg_1.is(RegExpExecDescriptor::StringRegister())); - - __ addp(RegExpExecDescriptor::CodeRegister(), - Immediate(Code::kHeaderSize - kHeapObjectTag)); - __ call(RegExpExecDescriptor::CodeRegister()); - - __ LeaveApiExitFrame(true); - - // TODO(jgruber): Don't tag return value once this is supported by stubs. - __ Integer32ToSmi(rax, rax); - __ ret(0 * kPointerSize); -#endif // V8_INTERPRETED_REGEXP -} - - static int NegativeComparisonResult(Condition cc) { DCHECK(cc != equal); DCHECK((cc == less) || (cc == less_equal) @@ -2822,15 +2743,13 @@ void CallApiCallbackStub::Generate(MacroAssembler* masm) { // call data __ Push(call_data); - Register scratch = call_data; - if (!this->call_data_undefined()) { - __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); - } + // return value - __ Push(scratch); + __ PushRoot(Heap::kUndefinedValueRootIndex); // return value default - __ Push(scratch); + __ PushRoot(Heap::kUndefinedValueRootIndex); // isolate + Register scratch = call_data; __ Move(scratch, ExternalReference::isolate_address(masm->isolate())); __ Push(scratch); // holder diff --git a/deps/v8/src/x64/deoptimizer-x64.cc b/deps/v8/src/x64/deoptimizer-x64.cc index 46176b13c6..611a3c6c21 100644 --- a/deps/v8/src/x64/deoptimizer-x64.cc +++ b/deps/v8/src/x64/deoptimizer-x64.cc @@ -30,29 +30,27 @@ void Deoptimizer::EnsureRelocSpaceForLazyDeoptimization(Handle<Code> code) { void Deoptimizer::PatchCodeForDeoptimization(Isolate* isolate, Code* code) { + Address instruction_start = code->instruction_start(); // Invalidate the relocation information, as it will become invalid by the // code patching below, and is not needed any more. code->InvalidateRelocation(); - if (FLAG_zap_code_space) { - // Fail hard and early if we enter this code object again. - byte* pointer = code->FindCodeAgeSequence(); - if (pointer != NULL) { - pointer += kNoCodeAgeSequenceLength; - } else { - pointer = code->instruction_start(); - } - CodePatcher patcher(isolate, pointer, 1); - patcher.masm()->int3(); - - DeoptimizationInputData* data = - DeoptimizationInputData::cast(code->deoptimization_data()); - int osr_offset = data->OsrPcOffset()->value(); - if (osr_offset > 0) { - CodePatcher osr_patcher(isolate, code->instruction_start() + osr_offset, - 1); - osr_patcher.masm()->int3(); - } + // Fail hard and early if we enter this code object again. + byte* pointer = code->FindCodeAgeSequence(); + if (pointer != NULL) { + pointer += kNoCodeAgeSequenceLength; + } else { + pointer = code->instruction_start(); + } + CodePatcher patcher(isolate, pointer, 1); + patcher.masm()->int3(); + + DeoptimizationInputData* data = + DeoptimizationInputData::cast(code->deoptimization_data()); + int osr_offset = data->OsrPcOffset()->value(); + if (osr_offset > 0) { + CodePatcher osr_patcher(isolate, instruction_start + osr_offset, 1); + osr_patcher.masm()->int3(); } // For each LLazyBailout instruction insert a absolute call to the @@ -61,7 +59,6 @@ void Deoptimizer::PatchCodeForDeoptimization(Isolate* isolate, Code* code) { // before the safepoint table (space was allocated there when the Code // object was created, if necessary). - Address instruction_start = code->instruction_start(); #ifdef DEBUG Address prev_call_address = NULL; #endif diff --git a/deps/v8/src/x64/disasm-x64.cc b/deps/v8/src/x64/disasm-x64.cc index 11cc30a7b6..a7438ad275 100644 --- a/deps/v8/src/x64/disasm-x64.cc +++ b/deps/v8/src/x64/disasm-x64.cc @@ -1682,7 +1682,7 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { get_modrm(*current, &mod, ®op, &rm); AppendToBuffer("pextrw "); // reg/m32, xmm, imm8 current += PrintRightOperand(current); - AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), (*current) & 3); + AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), (*current) & 7); current += 1; } else if (third_byte == 0x16) { get_modrm(*current, &mod, ®op, &rm); @@ -1788,6 +1788,11 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { current += 1; } else if (opcode == 0xB1) { current += PrintOperands("cmpxchg", OPER_REG_OP_ORDER, current); + } else if (opcode == 0xC4) { + AppendToBuffer("pinsrw %s,", NameOfXMMRegister(regop)); + current += PrintRightOperand(current); + AppendToBuffer(",0x%x", (*current) & 7); + current += 1; } else { const char* mnemonic = "?"; if (opcode == 0x54) { @@ -1824,10 +1829,6 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { mnemonic = "punpckhdq"; } else if (opcode == 0x6B) { mnemonic = "packssdw"; - } else if (opcode == 0xC4) { - mnemonic = "pinsrw"; - } else if (opcode == 0xC5) { - mnemonic = "pextrw"; } else if (opcode == 0xD1) { mnemonic = "psrlw"; } else if (opcode == 0xD2) { @@ -1941,6 +1942,13 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { get_modrm(*current, &mod, ®op, &rm); AppendToBuffer("%s %s,", mnemonic, NameOfXMMRegister(regop)); current += PrintRightXMMOperand(current); + } else if (opcode == 0x70) { + int mod, regop, rm; + get_modrm(*current, &mod, ®op, &rm); + AppendToBuffer("pshuflw %s, ", NameOfXMMRegister(regop)); + current += PrintRightXMMOperand(current); + AppendToBuffer(", %d", (*current) & 7); + current += 1; } else if (opcode == 0xC2) { // Intel manual 2A, Table 3-18. int mod, regop, rm; @@ -1996,6 +2004,13 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) { AppendToBuffer("cvttss2si%c %s,", operand_size_code(), NameOfCPURegister(regop)); current += PrintRightXMMOperand(current); + } else if (opcode == 0x70) { + int mod, regop, rm; + get_modrm(*current, &mod, ®op, &rm); + AppendToBuffer("pshufhw %s, ", NameOfXMMRegister(regop)); + current += PrintRightXMMOperand(current); + AppendToBuffer(", %d", (*current) & 7); + current += 1; } else if (opcode == 0x7E) { int mod, regop, rm; get_modrm(*current, &mod, ®op, &rm); diff --git a/deps/v8/src/x64/interface-descriptors-x64.cc b/deps/v8/src/x64/interface-descriptors-x64.cc index dd03f19cbc..b6ab7ca1af 100644 --- a/deps/v8/src/x64/interface-descriptors-x64.cc +++ b/deps/v8/src/x64/interface-descriptors-x64.cc @@ -56,11 +56,6 @@ const Register MathPowIntegerDescriptor::exponent() { return MathPowTaggedDescriptor::exponent(); } -const Register RegExpExecDescriptor::StringRegister() { return arg_reg_1; } -const Register RegExpExecDescriptor::LastIndexRegister() { return r11; } -const Register RegExpExecDescriptor::StringStartRegister() { return arg_reg_3; } -const Register RegExpExecDescriptor::StringEndRegister() { return arg_reg_4; } -const Register RegExpExecDescriptor::CodeRegister() { return rax; } const Register GrowArrayElementsDescriptor::ObjectRegister() { return rax; } const Register GrowArrayElementsDescriptor::KeyRegister() { return rbx; } @@ -160,9 +155,20 @@ void CallTrampolineDescriptor::InitializePlatformSpecific( void CallForwardVarargsDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { + // rax : number of arguments + // rcx : start index (to support rest parameters) + // rdi : the target to call + Register registers[] = {rdi, rax, rcx}; + data->InitializePlatformSpecific(arraysize(registers), registers); +} + +void ConstructForwardVarargsDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + // rax : number of arguments + // rdx : the new target // rcx : start index (to support rest parameters) // rdi : the target to call - Register registers[] = {rdi, rcx}; + Register registers[] = {rdi, rdx, rax, rcx}; data->InitializePlatformSpecific(arraysize(registers), registers); } diff --git a/deps/v8/src/x64/macro-assembler-x64.cc b/deps/v8/src/x64/macro-assembler-x64.cc index c31b5ac379..7087c03973 100644 --- a/deps/v8/src/x64/macro-assembler-x64.cc +++ b/deps/v8/src/x64/macro-assembler-x64.cc @@ -292,7 +292,7 @@ void MacroAssembler::RecordWriteField( leap(dst, FieldOperand(object, offset)); if (emit_debug_code()) { Label ok; - testb(dst, Immediate((1 << kPointerSizeLog2) - 1)); + testb(dst, Immediate(kPointerSize - 1)); j(zero, &ok, Label::kNear); int3(); bind(&ok); @@ -4786,6 +4786,7 @@ void MacroAssembler::CallCFunction(ExternalReference function, void MacroAssembler::CallCFunction(Register function, int num_arguments) { + DCHECK_LE(num_arguments, kMaxCParameters); DCHECK(has_frame()); // Check stack alignment. if (emit_debug_code()) { diff --git a/deps/v8/src/x64/sse-instr.h b/deps/v8/src/x64/sse-instr.h index 00957278a7..235aa75fcf 100644 --- a/deps/v8/src/x64/sse-instr.h +++ b/deps/v8/src/x64/sse-instr.h @@ -41,6 +41,8 @@ V(psubsw, 66, 0F, E9) \ V(psubusb, 66, 0F, D8) \ V(psubusw, 66, 0F, D9) \ + V(pand, 66, 0F, DB) \ + V(por, 66, 0F, EB) \ V(pxor, 66, 0F, EF) \ V(cvtps2dq, 66, 0F, 5B) @@ -48,6 +50,8 @@ V(pabsb, 66, 0F, 38, 1C) \ V(pabsw, 66, 0F, 38, 1D) \ V(pabsd, 66, 0F, 38, 1E) \ + V(phaddd, 66, 0F, 38, 02) \ + V(phaddw, 66, 0F, 38, 01) \ V(pshufb, 66, 0F, 38, 00) \ V(psignb, 66, 0F, 38, 08) \ V(psignw, 66, 0F, 38, 09) \ |