summaryrefslogtreecommitdiff
path: root/deps/v8/src/x64/macro-assembler-x64.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/x64/macro-assembler-x64.cc')
-rw-r--r--deps/v8/src/x64/macro-assembler-x64.cc111
1 files changed, 55 insertions, 56 deletions
diff --git a/deps/v8/src/x64/macro-assembler-x64.cc b/deps/v8/src/x64/macro-assembler-x64.cc
index e09321e183..b30391fde8 100644
--- a/deps/v8/src/x64/macro-assembler-x64.cc
+++ b/deps/v8/src/x64/macro-assembler-x64.cc
@@ -100,20 +100,6 @@ int64_t TurboAssembler::RootRegisterDelta(ExternalReference other) {
return delta;
}
-
-Operand MacroAssembler::ExternalOperand(ExternalReference target,
- Register scratch) {
- if (root_array_available_ && !serializer_enabled()) {
- int64_t delta = RootRegisterDelta(target);
- if (delta != kInvalidRootRegisterDelta && is_int32(delta)) {
- return Operand(kRootRegister, static_cast<int32_t>(delta));
- }
- }
- Move(scratch, target);
- return Operand(scratch, 0);
-}
-
-
void MacroAssembler::Load(Register destination, ExternalReference source) {
if (root_array_available_ && !serializer_enabled()) {
int64_t delta = RootRegisterDelta(source);
@@ -162,6 +148,18 @@ void TurboAssembler::LoadAddress(Register destination,
Move(destination, source);
}
+Operand TurboAssembler::ExternalOperand(ExternalReference target,
+ Register scratch) {
+ if (root_array_available_ && !serializer_enabled()) {
+ int64_t delta = RootRegisterDelta(target);
+ if (delta != kInvalidRootRegisterDelta && is_int32(delta)) {
+ return Operand(kRootRegister, static_cast<int32_t>(delta));
+ }
+ }
+ Move(scratch, target);
+ return Operand(scratch, 0);
+}
+
int TurboAssembler::LoadAddressSize(ExternalReference source) {
if (root_array_available_ && !serializer_enabled()) {
// This calculation depends on the internals of LoadAddress.
@@ -1133,15 +1131,19 @@ void TurboAssembler::MoveNumber(Register dst, double value) {
void TurboAssembler::Move(XMMRegister dst, uint32_t src) {
if (src == 0) {
- Xorpd(dst, dst);
+ Xorps(dst, dst);
} else {
+ unsigned nlz = base::bits::CountLeadingZeros(src);
+ unsigned ntz = base::bits::CountTrailingZeros(src);
unsigned pop = base::bits::CountPopulation(src);
DCHECK_NE(0u, pop);
- if (pop == 32) {
+ if (pop + ntz + nlz == 32) {
Pcmpeqd(dst, dst);
+ if (ntz) Pslld(dst, static_cast<byte>(ntz + nlz));
+ if (nlz) Psrld(dst, static_cast<byte>(nlz));
} else {
movl(kScratchRegister, Immediate(src));
- Movq(dst, kScratchRegister);
+ Movd(dst, kScratchRegister);
}
}
}
@@ -1154,14 +1156,10 @@ void TurboAssembler::Move(XMMRegister dst, uint64_t src) {
unsigned ntz = base::bits::CountTrailingZeros(src);
unsigned pop = base::bits::CountPopulation(src);
DCHECK_NE(0u, pop);
- if (pop == 64) {
+ if (pop + ntz + nlz == 64) {
Pcmpeqd(dst, dst);
- } else if (pop + ntz == 64) {
- Pcmpeqd(dst, dst);
- Psllq(dst, static_cast<byte>(ntz));
- } else if (pop + nlz == 64) {
- Pcmpeqd(dst, dst);
- Psrlq(dst, static_cast<byte>(nlz));
+ if (ntz) Psllq(dst, static_cast<byte>(ntz + nlz));
+ if (nlz) Psrlq(dst, static_cast<byte>(nlz));
} else {
uint32_t lower = static_cast<uint32_t>(src);
uint32_t upper = static_cast<uint32_t>(src >> 32);
@@ -1178,23 +1176,23 @@ void TurboAssembler::Move(XMMRegister dst, uint64_t src) {
// ----------------------------------------------------------------------------
void MacroAssembler::Absps(XMMRegister dst) {
- Andps(dst,
- ExternalOperand(ExternalReference::address_of_float_abs_constant()));
+ Andps(dst, ExternalOperand(
+ ExternalReference::address_of_float_abs_constant(isolate())));
}
void MacroAssembler::Negps(XMMRegister dst) {
- Xorps(dst,
- ExternalOperand(ExternalReference::address_of_float_neg_constant()));
+ Xorps(dst, ExternalOperand(
+ ExternalReference::address_of_float_neg_constant(isolate())));
}
void MacroAssembler::Abspd(XMMRegister dst) {
- Andps(dst,
- ExternalOperand(ExternalReference::address_of_double_abs_constant()));
+ Andps(dst, ExternalOperand(
+ ExternalReference::address_of_double_abs_constant(isolate())));
}
void MacroAssembler::Negpd(XMMRegister dst) {
- Xorps(dst,
- ExternalOperand(ExternalReference::address_of_double_neg_constant()));
+ Xorps(dst, ExternalOperand(
+ ExternalReference::address_of_double_neg_constant(isolate())));
}
void MacroAssembler::Cmp(Register dst, Handle<Object> source) {
@@ -1366,9 +1364,8 @@ void MacroAssembler::Jump(Handle<Code> code_object, RelocInfo::Mode rmode) {
jmp(code_object, rmode);
}
-void MacroAssembler::JumpToInstructionStream(const InstructionStream* stream) {
- Address bytes_address = reinterpret_cast<Address>(stream->bytes());
- Move(kOffHeapTrampolineRegister, bytes_address, RelocInfo::NONE);
+void MacroAssembler::JumpToInstructionStream(Address entry) {
+ Move(kOffHeapTrampolineRegister, entry, RelocInfo::OFF_HEAP_TARGET);
jmp(kOffHeapTrampolineRegister);
}
@@ -1825,6 +1822,18 @@ void TurboAssembler::AssertZeroExtended(Register int32_register) {
}
}
+void MacroAssembler::AssertConstructor(Register object) {
+ if (emit_debug_code()) {
+ testb(object, Immediate(kSmiTagMask));
+ Check(not_equal, AbortReason::kOperandIsASmiAndNotAConstructor);
+ Push(object);
+ movq(object, FieldOperand(object, HeapObject::kMapOffset));
+ testb(FieldOperand(object, Map::kBitFieldOffset),
+ Immediate(Map::IsConstructorBit::kMask));
+ Pop(object);
+ Check(not_zero, AbortReason::kOperandIsNotAConstructor);
+ }
+}
void MacroAssembler::AssertFunction(Register object) {
if (emit_debug_code()) {
@@ -1885,6 +1894,13 @@ void MacroAssembler::AssertUndefinedOrAllocationSite(Register object) {
}
}
+void MacroAssembler::LoadWeakValue(Register in_out, Label* target_if_cleared) {
+ cmpp(in_out, Immediate(kClearedWeakHeapObject));
+ j(equal, target_if_cleared);
+
+ andp(in_out, Immediate(~kWeakHeapObjectMask));
+}
+
void MacroAssembler::IncrementCounter(StatsCounter* counter, int value) {
DCHECK_GT(value, 0);
if (FLAG_native_code_counters && counter->Enabled()) {
@@ -2109,31 +2125,13 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
void MacroAssembler::CheckDebugHook(Register fun, Register new_target,
const ParameterCount& expected,
const ParameterCount& actual) {
- Label skip_hook, call_hook;
- ExternalReference debug_is_active =
- ExternalReference::debug_is_active_address(isolate());
- Operand debug_is_active_operand = ExternalOperand(debug_is_active);
- cmpb(debug_is_active_operand, Immediate(0));
- j(equal, &skip_hook);
-
+ Label skip_hook;
ExternalReference debug_hook_active =
ExternalReference::debug_hook_on_function_call_address(isolate());
Operand debug_hook_active_operand = ExternalOperand(debug_hook_active);
cmpb(debug_hook_active_operand, Immediate(0));
- j(not_equal, &call_hook);
-
- movp(kScratchRegister,
- FieldOperand(fun, JSFunction::kSharedFunctionInfoOffset));
- movp(kScratchRegister,
- FieldOperand(kScratchRegister, SharedFunctionInfo::kDebugInfoOffset));
- JumpIfSmi(kScratchRegister, &skip_hook);
- movp(kScratchRegister,
- FieldOperand(kScratchRegister, DebugInfo::kFlagsOffset));
- SmiToInteger32(kScratchRegister, kScratchRegister);
- testp(kScratchRegister, Immediate(DebugInfo::kBreakAtEntry));
- j(zero, &skip_hook);
-
- bind(&call_hook);
+ j(equal, &skip_hook);
+
{
FrameScope frame(this,
has_frame() ? StackFrame::NONE : StackFrame::INTERNAL);
@@ -2493,6 +2491,7 @@ void TurboAssembler::ComputeCodeStartAddress(Register dst) {
}
void TurboAssembler::ResetSpeculationPoisonRegister() {
+ // TODO(tebbi): Perhaps, we want to put an lfence here.
Set(kSpeculationPoisonRegister, -1);
}