diff options
Diffstat (limited to 'deps/v8/src/ia32/macro-assembler-ia32.cc')
-rw-r--r-- | deps/v8/src/ia32/macro-assembler-ia32.cc | 139 |
1 files changed, 88 insertions, 51 deletions
diff --git a/deps/v8/src/ia32/macro-assembler-ia32.cc b/deps/v8/src/ia32/macro-assembler-ia32.cc index 5a03586fe2..72fc778966 100644 --- a/deps/v8/src/ia32/macro-assembler-ia32.cc +++ b/deps/v8/src/ia32/macro-assembler-ia32.cc @@ -27,9 +27,10 @@ namespace internal { // ------------------------------------------------------------------------- // MacroAssembler implementation. -MacroAssembler::MacroAssembler(Isolate* isolate, void* buffer, int size, - CodeObjectRequired create_code_object) - : TurboAssembler(isolate, buffer, size, create_code_object) { +MacroAssembler::MacroAssembler(Isolate* isolate, + const AssemblerOptions& options, void* buffer, + int size, CodeObjectRequired create_code_object) + : TurboAssembler(isolate, options, buffer, size, create_code_object) { if (create_code_object == CodeObjectRequired::kYes) { // Unlike TurboAssembler, which can be used off the main thread and may not // allocate, macro assembler creates its own copy of the self-reference @@ -41,16 +42,7 @@ MacroAssembler::MacroAssembler(Isolate* isolate, void* buffer, int size, } } -TurboAssembler::TurboAssembler(Isolate* isolate, void* buffer, int buffer_size, - CodeObjectRequired create_code_object) - : Assembler(isolate, buffer, buffer_size), isolate_(isolate) { - if (create_code_object == CodeObjectRequired::kYes) { - code_object_ = Handle<HeapObject>::New( - isolate->heap()->self_reference_marker(), isolate); - } -} - -void MacroAssembler::LoadRoot(Register destination, Heap::RootListIndex index) { +void TurboAssembler::LoadRoot(Register destination, Heap::RootListIndex index) { if (isolate()->heap()->RootCanBeTreatedAsConstant(index)) { Handle<Object> object = isolate()->heap()->root_handle(index); if (object->IsHeapObject()) { @@ -68,7 +60,6 @@ void MacroAssembler::LoadRoot(Register destination, Heap::RootListIndex index) { roots_array_start)); } - void MacroAssembler::CompareRoot(Register with, Register scratch, Heap::RootListIndex index) { @@ -510,17 +501,6 @@ void MacroAssembler::AssertSmi(Register object) { } } -void MacroAssembler::AssertFixedArray(Register object) { - if (emit_debug_code()) { - test(object, Immediate(kSmiTagMask)); - Check(not_equal, AbortReason::kOperandIsASmiAndNotAFixedArray); - Push(object); - CmpObjectType(object, FIXED_ARRAY_TYPE, object); - Pop(object); - Check(equal, AbortReason::kOperandIsNotAFixedArray); - } -} - void MacroAssembler::AssertConstructor(Register object) { if (emit_debug_code()) { test(object, Immediate(kSmiTagMask)); @@ -623,14 +603,6 @@ void TurboAssembler::EnterFrame(StackFrame::Type type) { push(ebp); mov(ebp, esp); push(Immediate(StackFrame::TypeToMarker(type))); - if (type == StackFrame::INTERNAL) { - push(Immediate(CodeObject())); - // Check at runtime that this code object was patched correctly. - if (emit_debug_code()) { - cmp(Operand(esp, 0), Immediate(isolate()->factory()->undefined_value())); - Check(not_equal, AbortReason::kCodeObjectNotProperlyPatched); - } - } } void TurboAssembler::LeaveFrame(StackFrame::Type type) { @@ -642,6 +614,30 @@ void TurboAssembler::LeaveFrame(StackFrame::Type type) { leave(); } +#ifdef V8_OS_WIN +void TurboAssembler::AllocateStackFrame(Register bytes_scratch) { + // In windows, we cannot increment the stack size by more than one page + // (minimum page size is 4KB) without accessing at least one byte on the + // page. Check this: + // https://msdn.microsoft.com/en-us/library/aa227153(v=vs.60).aspx. + constexpr int kPageSize = 4 * 1024; + Label check_offset; + Label touch_next_page; + jmp(&check_offset); + bind(&touch_next_page); + sub(esp, Immediate(kPageSize)); + // Just to touch the page, before we increment further. + mov(Operand(esp, 0), Immediate(0)); + sub(bytes_scratch, Immediate(kPageSize)); + + bind(&check_offset); + cmp(bytes_scratch, kPageSize); + j(greater, &touch_next_page); + + sub(esp, bytes_scratch); +} +#endif + void MacroAssembler::EnterBuiltinFrame(Register context, Register target, Register argc) { Push(ebp); @@ -850,8 +846,8 @@ void MacroAssembler::CallRuntime(const Runtime::Function* f, Call(code, RelocInfo::CODE_TARGET); } -void TurboAssembler::CallRuntimeDelayed(Zone* zone, Runtime::FunctionId fid, - SaveFPRegsMode save_doubles) { +void TurboAssembler::CallRuntimeWithCEntry(Runtime::FunctionId fid, + Register centry) { const Runtime::Function* f = Runtime::FunctionForId(fid); // TODO(1236192): Most runtime routines don't need the number of // arguments passed in because it is constant. At some point we @@ -859,9 +855,9 @@ void TurboAssembler::CallRuntimeDelayed(Zone* zone, Runtime::FunctionId fid, // smarter. Move(eax, Immediate(f->nargs)); mov(ebx, Immediate(ExternalReference::Create(f))); - Handle<Code> code = - CodeFactory::CEntry(isolate(), f->result_size, save_doubles); - Call(code, RelocInfo::CODE_TARGET); + DCHECK(!AreAliased(centry, eax, ebx)); + add(centry, Immediate(Code::kHeaderSize - kHeapObjectTag)); + Call(centry); } void MacroAssembler::TailCallRuntime(Runtime::FunctionId fid) { @@ -1134,7 +1130,8 @@ void MacroAssembler::InvokeFunction(Register fun, Register new_target, DCHECK(fun == edi); mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); - mov(ebx, FieldOperand(ebx, SharedFunctionInfo::kFormalParameterCountOffset)); + movzx_w(ebx, + FieldOperand(ebx, SharedFunctionInfo::kFormalParameterCountOffset)); ParameterCount expected(ebx); InvokeFunctionCode(edi, new_target, expected, actual, flag); @@ -1276,6 +1273,15 @@ void TurboAssembler::Move(XMMRegister dst, uint64_t src) { } } +void TurboAssembler::Pshufhw(XMMRegister dst, Operand src, uint8_t shuffle) { + if (CpuFeatures::IsSupported(AVX)) { + CpuFeatureScope scope(this, AVX); + vpshufhw(dst, src, shuffle); + } else { + pshufhw(dst, src, shuffle); + } +} + void TurboAssembler::Pshuflw(XMMRegister dst, Operand src, uint8_t shuffle) { if (CpuFeatures::IsSupported(AVX)) { CpuFeatureScope scope(this, AVX); @@ -1294,6 +1300,24 @@ void TurboAssembler::Pshufd(XMMRegister dst, Operand src, uint8_t shuffle) { } } +void TurboAssembler::Psraw(XMMRegister dst, int8_t shift) { + if (CpuFeatures::IsSupported(AVX)) { + CpuFeatureScope scope(this, AVX); + vpsraw(dst, dst, shift); + } else { + psraw(dst, shift); + } +} + +void TurboAssembler::Psrlw(XMMRegister dst, int8_t shift) { + if (CpuFeatures::IsSupported(AVX)) { + CpuFeatureScope scope(this, AVX); + vpsrlw(dst, dst, shift); + } else { + psrlw(dst, shift); + } +} + void TurboAssembler::Psignb(XMMRegister dst, Operand src) { if (CpuFeatures::IsSupported(AVX)) { CpuFeatureScope scope(this, AVX); @@ -1336,29 +1360,43 @@ void TurboAssembler::Psignd(XMMRegister dst, Operand src) { UNREACHABLE(); } -void TurboAssembler::Ptest(XMMRegister dst, Operand src) { +void TurboAssembler::Pshufb(XMMRegister dst, Operand src) { if (CpuFeatures::IsSupported(AVX)) { CpuFeatureScope scope(this, AVX); - vptest(dst, src); + vpshufb(dst, dst, src); + return; + } + if (CpuFeatures::IsSupported(SSSE3)) { + CpuFeatureScope sse_scope(this, SSSE3); + pshufb(dst, src); + return; + } + UNREACHABLE(); +} + +void TurboAssembler::Pblendw(XMMRegister dst, Operand src, uint8_t imm8) { + if (CpuFeatures::IsSupported(AVX)) { + CpuFeatureScope scope(this, AVX); + vpblendw(dst, dst, src, imm8); return; } if (CpuFeatures::IsSupported(SSE4_1)) { CpuFeatureScope sse_scope(this, SSE4_1); - ptest(dst, src); + pblendw(dst, src, imm8); return; } UNREACHABLE(); } -void TurboAssembler::Pshufb(XMMRegister dst, Operand src) { +void TurboAssembler::Palignr(XMMRegister dst, Operand src, uint8_t imm8) { if (CpuFeatures::IsSupported(AVX)) { CpuFeatureScope scope(this, AVX); - vpshufb(dst, dst, src); + vpalignr(dst, dst, src, imm8); return; } if (CpuFeatures::IsSupported(SSSE3)) { CpuFeatureScope sse_scope(this, SSSE3); - pshufb(dst, src); + palignr(dst, src, imm8); return; } UNREACHABLE(); @@ -1543,16 +1581,15 @@ void TurboAssembler::CheckStackAlignment() { void TurboAssembler::Abort(AbortReason reason) { #ifdef DEBUG const char* msg = GetAbortReason(reason); - if (msg != nullptr) { - RecordComment("Abort message: "); - RecordComment(msg); - } + RecordComment("Abort message: "); + RecordComment(msg); +#endif - if (FLAG_trap_on_abort) { + // Avoid emitting call to builtin if requested. + if (trap_on_abort()) { int3(); return; } -#endif Move(edx, Smi::FromInt(static_cast<int>(reason))); |