diff options
Diffstat (limited to 'deps/v8/src/codegen/x64')
-rw-r--r-- | deps/v8/src/codegen/x64/assembler-x64.cc | 40 | ||||
-rw-r--r-- | deps/v8/src/codegen/x64/assembler-x64.h | 16 | ||||
-rw-r--r-- | deps/v8/src/codegen/x64/macro-assembler-x64.cc | 30 | ||||
-rw-r--r-- | deps/v8/src/codegen/x64/macro-assembler-x64.h | 3 | ||||
-rw-r--r-- | deps/v8/src/codegen/x64/sse-instr.h | 10 |
5 files changed, 72 insertions, 27 deletions
diff --git a/deps/v8/src/codegen/x64/assembler-x64.cc b/deps/v8/src/codegen/x64/assembler-x64.cc index 1d28f1d45d..1783da700b 100644 --- a/deps/v8/src/codegen/x64/assembler-x64.cc +++ b/deps/v8/src/codegen/x64/assembler-x64.cc @@ -109,15 +109,16 @@ void CpuFeatures::ProbeImpl(bool cross_compile) { void CpuFeatures::PrintTarget() {} void CpuFeatures::PrintFeatures() { printf( - "SSE3=%d SSSE3=%d SSE4_1=%d SAHF=%d AVX=%d FMA3=%d BMI1=%d BMI2=%d " + "SSE3=%d SSSE3=%d SSE4_1=%d SSE4_2=%d SAHF=%d AVX=%d FMA3=%d BMI1=%d " + "BMI2=%d " "LZCNT=%d " "POPCNT=%d ATOM=%d\n", CpuFeatures::IsSupported(SSE3), CpuFeatures::IsSupported(SSSE3), - CpuFeatures::IsSupported(SSE4_1), CpuFeatures::IsSupported(SAHF), - CpuFeatures::IsSupported(AVX), CpuFeatures::IsSupported(FMA3), - CpuFeatures::IsSupported(BMI1), CpuFeatures::IsSupported(BMI2), - CpuFeatures::IsSupported(LZCNT), CpuFeatures::IsSupported(POPCNT), - CpuFeatures::IsSupported(ATOM)); + CpuFeatures::IsSupported(SSE4_1), CpuFeatures::IsSupported(SSE4_2), + CpuFeatures::IsSupported(SAHF), CpuFeatures::IsSupported(AVX), + CpuFeatures::IsSupported(FMA3), CpuFeatures::IsSupported(BMI1), + CpuFeatures::IsSupported(BMI2), CpuFeatures::IsSupported(LZCNT), + CpuFeatures::IsSupported(POPCNT), CpuFeatures::IsSupported(ATOM)); } // ----------------------------------------------------------------------------- @@ -428,6 +429,9 @@ Assembler::Assembler(const AssemblerOptions& options, std::unique_ptr<AssemblerBuffer> buffer) : AssemblerBase(options, std::move(buffer)), constpool_(this) { reloc_info_writer.Reposition(buffer_start_ + buffer_->size(), pc_); + if (CpuFeatures::IsSupported(SSE4_2)) { + EnableCpuFeature(SSE4_1); + } if (CpuFeatures::IsSupported(SSE4_1)) { EnableCpuFeature(SSSE3); } @@ -3524,8 +3528,8 @@ void Assembler::cmpps(XMMRegister dst, Operand src, int8_t cmp) { void Assembler::cmppd(XMMRegister dst, XMMRegister src, int8_t cmp) { EnsureSpace ensure_space(this); - emit_optional_rex_32(dst, src); emit(0x66); + emit_optional_rex_32(dst, src); emit(0x0F); emit(0xC2); emit_sse_operand(dst, src); @@ -3534,8 +3538,8 @@ void Assembler::cmppd(XMMRegister dst, XMMRegister src, int8_t cmp) { void Assembler::cmppd(XMMRegister dst, Operand src, int8_t cmp) { EnsureSpace ensure_space(this); - emit_optional_rex_32(dst, src); emit(0x66); + emit_optional_rex_32(dst, src); emit(0x0F); emit(0xC2); emit_sse_operand(dst, src); @@ -4716,6 +4720,26 @@ void Assembler::lddqu(XMMRegister dst, Operand src) { emit_sse_operand(dst, src); } +void Assembler::movddup(XMMRegister dst, XMMRegister src) { + DCHECK(IsEnabled(SSE3)); + EnsureSpace ensure_space(this); + emit(0xF2); + emit_optional_rex_32(dst, src); + emit(0x0F); + emit(0x12); + emit_sse_operand(dst, src); +} + +void Assembler::movddup(XMMRegister dst, Operand src) { + DCHECK(IsEnabled(SSE3)); + EnsureSpace ensure_space(this); + emit(0xF2); + emit_optional_rex_32(dst, src); + emit(0x0F); + emit(0x12); + emit_sse_operand(dst, src); +} + void Assembler::psrldq(XMMRegister dst, uint8_t shift) { EnsureSpace ensure_space(this); emit(0x66); diff --git a/deps/v8/src/codegen/x64/assembler-x64.h b/deps/v8/src/codegen/x64/assembler-x64.h index acb4fce82c..7c69b4c473 100644 --- a/deps/v8/src/codegen/x64/assembler-x64.h +++ b/deps/v8/src/codegen/x64/assembler-x64.h @@ -916,6 +916,8 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase { // SSE3 void lddqu(XMMRegister dst, Operand src); + void movddup(XMMRegister dst, Operand src); + void movddup(XMMRegister dst, XMMRegister src); // SSSE3 void ssse3_instr(XMMRegister dst, XMMRegister src, byte prefix, byte escape1, @@ -1329,14 +1331,14 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase { } AVX_SP_3(vsqrt, 0x51) - AVX_SP_3(vadd, 0x58) - AVX_SP_3(vsub, 0x5c) - AVX_SP_3(vmul, 0x59) - AVX_SP_3(vdiv, 0x5e) - AVX_SP_3(vmin, 0x5d) - AVX_SP_3(vmax, 0x5f) + AVX_S_3(vadd, 0x58) + AVX_S_3(vsub, 0x5c) + AVX_S_3(vmul, 0x59) + AVX_S_3(vdiv, 0x5e) + AVX_S_3(vmin, 0x5d) + AVX_S_3(vmax, 0x5f) AVX_P_3(vand, 0x54) - AVX_P_3(vandn, 0x55) + AVX_3(vandnps, 0x55, vps) AVX_P_3(vor, 0x56) AVX_P_3(vxor, 0x57) AVX_3(vcvtsd2ss, 0x5a, vsd) diff --git a/deps/v8/src/codegen/x64/macro-assembler-x64.cc b/deps/v8/src/codegen/x64/macro-assembler-x64.cc index f13811b1ae..4deeb1bc02 100644 --- a/deps/v8/src/codegen/x64/macro-assembler-x64.cc +++ b/deps/v8/src/codegen/x64/macro-assembler-x64.cc @@ -505,8 +505,9 @@ void MacroAssembler::RecordWrite(Register object, Register address, DCHECK(value != address); AssertNotSmi(object); - if (remembered_set_action == OMIT_REMEMBERED_SET && - !FLAG_incremental_marking) { + if ((remembered_set_action == OMIT_REMEMBERED_SET && + !FLAG_incremental_marking) || + FLAG_disable_write_barriers) { return; } @@ -1523,9 +1524,10 @@ void MacroAssembler::Pop(Operand dst) { popq(dst); } void MacroAssembler::PopQuad(Operand dst) { popq(dst); } -void TurboAssembler::Jump(ExternalReference ext) { - LoadAddress(kScratchRegister, ext); - jmp(kScratchRegister); +void TurboAssembler::Jump(const ExternalReference& reference) { + DCHECK(root_array_available()); + jmp(Operand(kRootRegister, RootRegisterOffsetForExternalReferenceTableEntry( + isolate(), reference))); } void TurboAssembler::Jump(Operand op) { jmp(op); } @@ -1594,12 +1596,7 @@ void TurboAssembler::Call(Handle<Code> code_object, RelocInfo::Mode rmode) { if (isolate()->builtins()->IsBuiltinHandle(code_object, &builtin_index) && Builtins::IsIsolateIndependent(builtin_index)) { // Inline the trampoline. - RecordCommentForOffHeapTrampoline(builtin_index); - CHECK_NE(builtin_index, Builtins::kNoBuiltinId); - EmbeddedData d = EmbeddedData::FromBlob(); - Address entry = d.InstructionStartOfBuiltin(builtin_index); - Move(kScratchRegister, entry, RelocInfo::OFF_HEAP_TARGET); - call(kScratchRegister); + CallBuiltin(builtin_index); return; } } @@ -1634,6 +1631,17 @@ void TurboAssembler::CallBuiltinByIndex(Register builtin_index) { Call(EntryFromBuiltinIndexAsOperand(builtin_index)); } +void TurboAssembler::CallBuiltin(int builtin_index) { + DCHECK(Builtins::IsBuiltinId(builtin_index)); + DCHECK(FLAG_embedded_builtins); + RecordCommentForOffHeapTrampoline(builtin_index); + CHECK_NE(builtin_index, Builtins::kNoBuiltinId); + EmbeddedData d = EmbeddedData::FromBlob(); + Address entry = d.InstructionStartOfBuiltin(builtin_index); + Move(kScratchRegister, entry, RelocInfo::OFF_HEAP_TARGET); + call(kScratchRegister); +} + void TurboAssembler::LoadCodeObjectEntry(Register destination, Register code_object) { // Code objects are called differently depending on whether we are generating diff --git a/deps/v8/src/codegen/x64/macro-assembler-x64.h b/deps/v8/src/codegen/x64/macro-assembler-x64.h index 139690bb8d..8e7766c7e1 100644 --- a/deps/v8/src/codegen/x64/macro-assembler-x64.h +++ b/deps/v8/src/codegen/x64/macro-assembler-x64.h @@ -344,6 +344,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { Operand EntryFromBuiltinIndexAsOperand(Register builtin_index); void CallBuiltinByIndex(Register builtin_index) override; + void CallBuiltin(int builtin_index); void LoadCodeObjectEntry(Register destination, Register code_object) override; void CallCodeObject(Register code_object) override; @@ -353,7 +354,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { void RetpolineCall(Address destination, RelocInfo::Mode rmode); void Jump(Address destination, RelocInfo::Mode rmode); - void Jump(ExternalReference ext); + void Jump(const ExternalReference& reference) override; void Jump(Operand op); void Jump(Handle<Code> code_object, RelocInfo::Mode rmode, Condition cc = always); diff --git a/deps/v8/src/codegen/x64/sse-instr.h b/deps/v8/src/codegen/x64/sse-instr.h index 56618d20e0..8ba54e85b4 100644 --- a/deps/v8/src/codegen/x64/sse-instr.h +++ b/deps/v8/src/codegen/x64/sse-instr.h @@ -6,7 +6,14 @@ #define V8_CODEGEN_X64_SSE_INSTR_H_ #define SSE2_INSTRUCTION_LIST(V) \ + V(andnpd, 66, 0F, 55) \ + V(addpd, 66, 0F, 58) \ + V(mulpd, 66, 0F, 59) \ V(cvtps2dq, 66, 0F, 5B) \ + V(subpd, 66, 0F, 5C) \ + V(minpd, 66, 0F, 5D) \ + V(maxpd, 66, 0F, 5F) \ + V(divpd, 66, 0F, 5E) \ V(punpcklbw, 66, 0F, 60) \ V(punpcklwd, 66, 0F, 61) \ V(punpckldq, 66, 0F, 62) \ @@ -40,10 +47,12 @@ V(pmuludq, 66, 0F, F4) \ V(psllw, 66, 0F, F1) \ V(pslld, 66, 0F, F2) \ + V(psllq, 66, 0F, F3) \ V(psraw, 66, 0F, E1) \ V(psrad, 66, 0F, E2) \ V(psrlw, 66, 0F, D1) \ V(psrld, 66, 0F, D2) \ + V(psrlq, 66, 0F, D3) \ V(psubb, 66, 0F, F8) \ V(psubw, 66, 0F, F9) \ V(psubd, 66, 0F, FA) \ @@ -68,6 +77,7 @@ V(psignd, 66, 0F, 38, 0A) #define SSE4_INSTRUCTION_LIST(V) \ + V(blendvpd, 66, 0F, 38, 15) \ V(pcmpeqq, 66, 0F, 38, 29) \ V(ptest, 66, 0F, 38, 17) \ V(pmovsxbw, 66, 0F, 38, 20) \ |