| Index: src/x64/assembler-x64.cc
|
| ===================================================================
|
| --- src/x64/assembler-x64.cc (revision 7006)
|
| +++ src/x64/assembler-x64.cc (working copy)
|
| @@ -920,6 +920,23 @@
|
| }
|
|
|
|
|
| +// Calls directly to the given address using a relative offset.
|
| +// Should only ever be used in Code objects for calls within the
|
| +// same Code object. Should not be used when generating new code (use labels),
|
| +// but only when patching existing code.
|
| +void Assembler::call(Address target) {
|
| + positions_recorder()->WriteRecordedPositions();
|
| + EnsureSpace ensure_space(this);
|
| + last_pc_ = pc_;
|
| + // 1110 1000 #32-bit disp.
|
| + emit(0xE8);
|
| + Address source = pc_ + 4;
|
| + intptr_t displacement = target - source;
|
| + ASSERT(is_int32(displacement));
|
| + emitl(static_cast<int32_t>(displacement));
|
| +}
|
| +
|
| +
|
| void Assembler::clc() {
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| @@ -1175,6 +1192,16 @@
|
| }
|
|
|
|
|
| +void Assembler::imull(Register dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + last_pc_ = pc_;
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0xAF);
|
| + emit_operand(dst, src);
|
| +}
|
| +
|
| +
|
| void Assembler::imull(Register dst, Register src, Immediate imm) {
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| @@ -3016,7 +3043,17 @@
|
| }
|
|
|
|
|
| +void Assembler::movmskpd(Register dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + last_pc_ = pc_;
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0f);
|
| + emit(0x50);
|
| + emit_sse_operand(dst, src);
|
| +}
|
|
|
| +
|
| void Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) {
|
| Register ireg = { reg.code() };
|
| emit_operand(ireg, adr);
|
| @@ -3053,10 +3090,15 @@
|
| void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
|
| ASSERT(rmode != RelocInfo::NONE);
|
| // Don't record external references unless the heap will be serialized.
|
| - if (rmode == RelocInfo::EXTERNAL_REFERENCE &&
|
| - !Serializer::enabled() &&
|
| - !FLAG_debug_code) {
|
| - return;
|
| + if (rmode == RelocInfo::EXTERNAL_REFERENCE) {
|
| +#ifdef DEBUG
|
| + if (!Serializer::enabled()) {
|
| + Serializer::TooLateToEnableNow();
|
| + }
|
| +#endif
|
| + if (!Serializer::enabled() && !FLAG_debug_code) {
|
| + return;
|
| + }
|
| }
|
| RelocInfo rinfo(pc_, rmode, data);
|
| reloc_info_writer.Write(&rinfo);
|
|
|