diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-07-08 16:40:11 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-07-08 16:40:11 -0700 |
commit | e5564a3f29e0a818832a97c7c3b28d7c8b3b0460 (patch) | |
tree | 4b48a6577080d5e44da4d2cbebb7fe7951660de8 /deps/v8/src/x64/assembler-x64.cc | |
parent | 0df2f74d364826053641395b01c2fcb1345057a9 (diff) | |
download | node-new-e5564a3f29e0a818832a97c7c3b28d7c8b3b0460.tar.gz |
Upgrade V8 to 3.4.10
Diffstat (limited to 'deps/v8/src/x64/assembler-x64.cc')
-rw-r--r-- | deps/v8/src/x64/assembler-x64.cc | 525 |
1 files changed, 195 insertions, 330 deletions
diff --git a/deps/v8/src/x64/assembler-x64.cc b/deps/v8/src/x64/assembler-x64.cc index 35c05b3ac3..745fdaeb8f 100644 --- a/deps/v8/src/x64/assembler-x64.cc +++ b/deps/v8/src/x64/assembler-x64.cc @@ -38,21 +38,38 @@ namespace internal { // ----------------------------------------------------------------------------- // Implementation of CpuFeatures -// The required user mode extensions in X64 are (from AMD64 ABI Table A.1): -// fpu, tsc, cx8, cmov, mmx, sse, sse2, fxsr, syscall -uint64_t CpuFeatures::supported_ = kDefaultCpuFeatures; -uint64_t CpuFeatures::enabled_ = 0; + +#ifdef DEBUG +bool CpuFeatures::initialized_ = false; +#endif +uint64_t CpuFeatures::supported_ = CpuFeatures::kDefaultCpuFeatures; uint64_t CpuFeatures::found_by_runtime_probing_ = 0; -void CpuFeatures::Probe(bool portable) { - ASSERT(Heap::HasBeenSetup()); + +void CpuFeatures::Probe() { + ASSERT(!initialized_); +#ifdef DEBUG + initialized_ = true; +#endif supported_ = kDefaultCpuFeatures; - if (portable && Serializer::enabled()) { + if (Serializer::enabled()) { supported_ |= OS::CpuFeaturesImpliedByPlatform(); return; // No features if we might serialize. } - Assembler assm(NULL, 0); + const int kBufferSize = 4 * KB; + VirtualMemory* memory = new VirtualMemory(kBufferSize); + if (!memory->IsReserved()) { + delete memory; + return; + } + ASSERT(memory->size() >= static_cast<size_t>(kBufferSize)); + if (!memory->Commit(memory->address(), kBufferSize, true/*executable*/)) { + delete memory; + return; + } + + Assembler assm(NULL, memory->address(), kBufferSize); Label cpuid, done; #define __ assm. // Save old rsp, since we are going to modify the stack. @@ -82,7 +99,7 @@ void CpuFeatures::Probe(bool portable) { // ecx:edx. Temporarily enable CPUID support because we know it's // safe here. __ bind(&cpuid); - __ movq(rax, Immediate(1)); + __ movl(rax, Immediate(1)); supported_ = kDefaultCpuFeatures | (1 << CPUID); { Scope fscope(CPUID); __ cpuid(); @@ -116,28 +133,20 @@ void CpuFeatures::Probe(bool portable) { __ ret(0); #undef __ - CodeDesc desc; - assm.GetCode(&desc); - MaybeObject* maybe_code = Heap::CreateCode(desc, - Code::ComputeFlags(Code::STUB), - Handle<Object>()); - Object* code; - if (!maybe_code->ToObject(&code)) return; - if (!code->IsCode()) return; - PROFILE(CodeCreateEvent(Logger::BUILTIN_TAG, - Code::cast(code), "CpuFeatures::Probe")); typedef uint64_t (*F0)(); - F0 probe = FUNCTION_CAST<F0>(Code::cast(code)->entry()); + F0 probe = FUNCTION_CAST<F0>(reinterpret_cast<Address>(memory->address())); supported_ = probe(); found_by_runtime_probing_ = supported_; found_by_runtime_probing_ &= ~kDefaultCpuFeatures; uint64_t os_guarantees = OS::CpuFeaturesImpliedByPlatform(); supported_ |= os_guarantees; - found_by_runtime_probing_ &= portable ? ~os_guarantees : 0; + found_by_runtime_probing_ &= ~os_guarantees; // SSE2 and CMOV must be available on an X64 CPU. ASSERT(IsSupported(CPUID)); ASSERT(IsSupported(SSE2)); ASSERT(IsSupported(CMOV)); + + delete memory; } @@ -191,12 +200,12 @@ void RelocInfo::PatchCode(byte* instructions, int instruction_count) { // Register constants. const int Register::kRegisterCodeByAllocationIndex[kNumAllocatableRegisters] = { - // rax, rbx, rdx, rcx, rdi, r8, r9, r11, r14, r12 - 0, 3, 2, 1, 7, 8, 9, 11, 14, 12 + // rax, rbx, rdx, rcx, rdi, r8, r9, r11, r14, r15 + 0, 3, 2, 1, 7, 8, 9, 11, 14, 15 }; const int Register::kAllocationIndexByRegisterCode[kNumRegisters] = { - 0, 3, 2, 1, -1, -1, -1, 4, 5, 6, -1, 7, 9, -1, 8, -1 + 0, 3, 2, 1, -1, -1, -1, 4, 5, 6, -1, 7, -1, -1, 8, 9 }; @@ -335,18 +344,19 @@ bool Operand::AddressUsesRegister(Register reg) const { static void InitCoverageLog(); #endif -byte* Assembler::spare_buffer_ = NULL; - -Assembler::Assembler(void* buffer, int buffer_size) - : code_targets_(100), positions_recorder_(this) { +Assembler::Assembler(Isolate* arg_isolate, void* buffer, int buffer_size) + : AssemblerBase(arg_isolate), + code_targets_(100), + positions_recorder_(this), + emit_debug_code_(FLAG_debug_code) { if (buffer == NULL) { // Do our own buffer management. if (buffer_size <= kMinimalBufferSize) { buffer_size = kMinimalBufferSize; - if (spare_buffer_ != NULL) { - buffer = spare_buffer_; - spare_buffer_ = NULL; + if (isolate() != NULL && isolate()->assembler_spare_buffer() != NULL) { + buffer = isolate()->assembler_spare_buffer(); + isolate()->set_assembler_spare_buffer(NULL); } } if (buffer == NULL) { @@ -378,7 +388,6 @@ Assembler::Assembler(void* buffer, int buffer_size) pc_ = buffer_; reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); - last_pc_ = NULL; #ifdef GENERATED_CODE_COVERAGE InitCoverageLog(); @@ -388,8 +397,10 @@ Assembler::Assembler(void* buffer, int buffer_size) Assembler::~Assembler() { if (own_buffer_) { - if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { - spare_buffer_ = buffer_; + if (isolate() != NULL && + isolate()->assembler_spare_buffer() == NULL && + buffer_size_ == kMinimalBufferSize) { + isolate()->set_assembler_spare_buffer(buffer_); } else { DeleteArray(buffer_); } @@ -409,8 +420,6 @@ void Assembler::GetCode(CodeDesc* desc) { desc->reloc_size = static_cast<int>((buffer_ + buffer_size_) - reloc_info_writer.pos()); desc->origin = this; - - Counters::reloc_info_size.Increment(desc->reloc_size); } @@ -434,7 +443,6 @@ void Assembler::CodeTargetAlign() { void Assembler::bind_to(Label* L, int pos) { ASSERT(!L->is_bound()); // Label may only be bound once. - last_pc_ = NULL; ASSERT(0 <= pos && pos <= pc_offset()); // Position must be valid. if (L->is_linked()) { int current = L->pos(); @@ -450,6 +458,20 @@ void Assembler::bind_to(Label* L, int pos) { int last_imm32 = pos - (current + sizeof(int32_t)); long_at_put(current, last_imm32); } + while (L->is_near_linked()) { + int fixup_pos = L->near_link_pos(); + int offset_to_next = + static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos))); + ASSERT(offset_to_next <= 0); + int disp = pos - (fixup_pos + sizeof(int8_t)); + ASSERT(is_int8(disp)); + set_byte_at(fixup_pos, disp); + if (offset_to_next < 0) { + L->link_to(fixup_pos + offset_to_next, Label::kNear); + } else { + L->UnuseNear(); + } + } L->bind_to(pos); } @@ -459,20 +481,6 @@ void Assembler::bind(Label* L) { } -void Assembler::bind(NearLabel* L) { - ASSERT(!L->is_bound()); - last_pc_ = NULL; - while (L->unresolved_branches_ > 0) { - int branch_pos = L->unresolved_positions_[L->unresolved_branches_ - 1]; - int disp = pc_offset() - branch_pos; - ASSERT(is_int8(disp)); - set_byte_at(branch_pos - sizeof(int8_t), disp); - L->unresolved_branches_--; - } - L->bind_to(pc_offset()); -} - - void Assembler::GrowBuffer() { ASSERT(buffer_overflow()); if (!own_buffer_) FATAL("external code buffer is too small"); @@ -487,7 +495,7 @@ void Assembler::GrowBuffer() { // Some internal data structures overflow for very large buffers, // they must ensure that kMaximalBufferSize is not too large. if ((desc.buffer_size > kMaximalBufferSize) || - (desc.buffer_size > Heap::MaxOldGenerationSize())) { + (desc.buffer_size > HEAP->MaxOldGenerationSize())) { V8::FatalProcessOutOfMemory("Assembler::GrowBuffer"); } @@ -512,17 +520,16 @@ void Assembler::GrowBuffer() { reloc_info_writer.pos(), desc.reloc_size); // Switch buffers. - if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { - spare_buffer_ = buffer_; + if (isolate() != NULL && + isolate()->assembler_spare_buffer() == NULL && + buffer_size_ == kMinimalBufferSize) { + isolate()->set_assembler_spare_buffer(buffer_); } else { DeleteArray(buffer_); } buffer_ = desc.buffer; buffer_size_ = desc.buffer_size; pc_ += pc_delta; - if (last_pc_ != NULL) { - last_pc_ += pc_delta; - } reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, reloc_info_writer.last_pc() + pc_delta); @@ -560,7 +567,6 @@ void Assembler::emit_operand(int code, const Operand& adr) { void Assembler::arithmetic_op(byte opcode, Register reg, const Operand& op) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(reg, op); emit(opcode); emit_operand(reg, op); @@ -569,7 +575,6 @@ void Assembler::arithmetic_op(byte opcode, Register reg, const Operand& op) { void Assembler::arithmetic_op(byte opcode, Register reg, Register rm_reg) { EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT((opcode & 0xC6) == 2); if (rm_reg.low_bits() == 4) { // Forces SIB byte. // Swap reg and rm_reg and change opcode operand order. @@ -586,7 +591,6 @@ void Assembler::arithmetic_op(byte opcode, Register reg, Register rm_reg) { void Assembler::arithmetic_op_16(byte opcode, Register reg, Register rm_reg) { EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT((opcode & 0xC6) == 2); if (rm_reg.low_bits() == 4) { // Forces SIB byte. // Swap reg and rm_reg and change opcode operand order. @@ -607,7 +611,6 @@ void Assembler::arithmetic_op_16(byte opcode, Register reg, const Operand& rm_reg) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(reg, rm_reg); emit(opcode); @@ -617,7 +620,6 @@ void Assembler::arithmetic_op_16(byte opcode, void Assembler::arithmetic_op_32(byte opcode, Register reg, Register rm_reg) { EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT((opcode & 0xC6) == 2); if (rm_reg.low_bits() == 4) { // Forces SIB byte. // Swap reg and rm_reg and change opcode operand order. @@ -636,7 +638,6 @@ void Assembler::arithmetic_op_32(byte opcode, Register reg, const Operand& rm_reg) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(reg, rm_reg); emit(opcode); emit_operand(reg, rm_reg); @@ -647,7 +648,6 @@ void Assembler::immediate_arithmetic_op(byte subcode, Register dst, Immediate src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); if (is_int8(src.value_)) { emit(0x83); @@ -667,7 +667,6 @@ void Assembler::immediate_arithmetic_op(byte subcode, const Operand& dst, Immediate src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); if (is_int8(src.value_)) { emit(0x83); @@ -685,7 +684,6 @@ void Assembler::immediate_arithmetic_op_16(byte subcode, Register dst, Immediate src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); // Operand size override prefix. emit_optional_rex_32(dst); if (is_int8(src.value_)) { @@ -707,7 +705,6 @@ void Assembler::immediate_arithmetic_op_16(byte subcode, const Operand& dst, Immediate src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); // Operand size override prefix. emit_optional_rex_32(dst); if (is_int8(src.value_)) { @@ -726,7 +723,6 @@ void Assembler::immediate_arithmetic_op_32(byte subcode, Register dst, Immediate src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); if (is_int8(src.value_)) { emit(0x83); @@ -747,7 +743,6 @@ void Assembler::immediate_arithmetic_op_32(byte subcode, const Operand& dst, Immediate src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); if (is_int8(src.value_)) { emit(0x83); @@ -765,7 +760,6 @@ void Assembler::immediate_arithmetic_op_8(byte subcode, const Operand& dst, Immediate src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); ASSERT(is_int8(src.value_) || is_uint8(src.value_)); emit(0x80); @@ -778,7 +772,6 @@ void Assembler::immediate_arithmetic_op_8(byte subcode, Register dst, Immediate src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (dst.code() > 3) { // Use 64-bit mode byte registers. emit_rex_64(dst); @@ -792,7 +785,6 @@ void Assembler::immediate_arithmetic_op_8(byte subcode, void Assembler::shift(Register dst, Immediate shift_amount, int subcode) { EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT(is_uint6(shift_amount.value_)); // illegal shift count if (shift_amount.value_ == 1) { emit_rex_64(dst); @@ -809,7 +801,6 @@ void Assembler::shift(Register dst, Immediate shift_amount, int subcode) { void Assembler::shift(Register dst, int subcode) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xD3); emit_modrm(subcode, dst); @@ -818,7 +809,6 @@ void Assembler::shift(Register dst, int subcode) { void Assembler::shift_32(Register dst, int subcode) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xD3); emit_modrm(subcode, dst); @@ -827,7 +817,6 @@ void Assembler::shift_32(Register dst, int subcode) { void Assembler::shift_32(Register dst, Immediate shift_amount, int subcode) { EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT(is_uint5(shift_amount.value_)); // illegal shift count if (shift_amount.value_ == 1) { emit_optional_rex_32(dst); @@ -844,7 +833,6 @@ void Assembler::shift_32(Register dst, Immediate shift_amount, int subcode) { void Assembler::bt(const Operand& dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(src, dst); emit(0x0F); emit(0xA3); @@ -854,7 +842,6 @@ void Assembler::bt(const Operand& dst, Register src) { void Assembler::bts(const Operand& dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(src, dst); emit(0x0F); emit(0xAB); @@ -865,7 +852,6 @@ void Assembler::bts(const Operand& dst, Register src) { void Assembler::call(Label* L) { positions_recorder()->WriteRecordedPositions(); EnsureSpace ensure_space(this); - last_pc_ = pc_; // 1110 1000 #32-bit disp. emit(0xE8); if (L->is_bound()) { @@ -884,20 +870,20 @@ void Assembler::call(Label* L) { } -void Assembler::call(Handle<Code> target, RelocInfo::Mode rmode) { +void Assembler::call(Handle<Code> target, + RelocInfo::Mode rmode, + unsigned ast_id) { positions_recorder()->WriteRecordedPositions(); EnsureSpace ensure_space(this); - last_pc_ = pc_; // 1110 1000 #32-bit disp. emit(0xE8); - emit_code_target(target, rmode); + emit_code_target(target, rmode, ast_id); } void Assembler::call(Register adr) { positions_recorder()->WriteRecordedPositions(); EnsureSpace ensure_space(this); - last_pc_ = pc_; // Opcode: FF /2 r64. emit_optional_rex_32(adr); emit(0xFF); @@ -908,7 +894,6 @@ void Assembler::call(Register adr) { void Assembler::call(const Operand& op) { positions_recorder()->WriteRecordedPositions(); EnsureSpace ensure_space(this); - last_pc_ = pc_; // Opcode: FF /2 m64. emit_optional_rex_32(op); emit(0xFF); @@ -923,7 +908,6 @@ void Assembler::call(const Operand& op) { 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; @@ -935,13 +919,16 @@ void Assembler::call(Address target) { void Assembler::clc() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF8); } +void Assembler::cld() { + EnsureSpace ensure_space(this); + emit(0xFC); +} + void Assembler::cdq() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x99); } @@ -956,7 +943,6 @@ void Assembler::cmovq(Condition cc, Register dst, Register src) { // 64-bit architecture. ASSERT(cc >= 0); // Use mov for unconditional moves. EnsureSpace ensure_space(this); - last_pc_ = pc_; // Opcode: REX.W 0f 40 + cc /r. emit_rex_64(dst, src); emit(0x0f); @@ -973,7 +959,6 @@ void Assembler::cmovq(Condition cc, Register dst, const Operand& src) { } ASSERT(cc >= 0); EnsureSpace ensure_space(this); - last_pc_ = pc_; // Opcode: REX.W 0f 40 + cc /r. emit_rex_64(dst, src); emit(0x0f); @@ -990,7 +975,6 @@ void Assembler::cmovl(Condition cc, Register dst, Register src) { } ASSERT(cc >= 0); EnsureSpace ensure_space(this); - last_pc_ = pc_; // Opcode: 0f 40 + cc /r. emit_optional_rex_32(dst, src); emit(0x0f); @@ -1007,7 +991,6 @@ void Assembler::cmovl(Condition cc, Register dst, const Operand& src) { } ASSERT(cc >= 0); EnsureSpace ensure_space(this); - last_pc_ = pc_; // Opcode: 0f 40 + cc /r. emit_optional_rex_32(dst, src); emit(0x0f); @@ -1019,7 +1002,6 @@ void Assembler::cmovl(Condition cc, Register dst, const Operand& src) { void Assembler::cmpb_al(Immediate imm8) { ASSERT(is_int8(imm8.value_) || is_uint8(imm8.value_)); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x3c); emit(imm8.value_); } @@ -1028,7 +1010,6 @@ void Assembler::cmpb_al(Immediate imm8) { void Assembler::cpuid() { ASSERT(CpuFeatures::IsEnabled(CPUID)); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x0F); emit(0xA2); } @@ -1036,7 +1017,6 @@ void Assembler::cpuid() { void Assembler::cqo() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(); emit(0x99); } @@ -1044,7 +1024,6 @@ void Assembler::cqo() { void Assembler::decq(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xFF); emit_modrm(0x1, dst); @@ -1053,7 +1032,6 @@ void Assembler::decq(Register dst) { void Assembler::decq(const Operand& dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xFF); emit_operand(1, dst); @@ -1062,7 +1040,6 @@ void Assembler::decq(const Operand& dst) { void Assembler::decl(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xFF); emit_modrm(0x1, dst); @@ -1071,7 +1048,6 @@ void Assembler::decl(Register dst) { void Assembler::decl(const Operand& dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xFF); emit_operand(1, dst); @@ -1080,7 +1056,6 @@ void Assembler::decl(const Operand& dst) { void Assembler::decb(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (dst.code() > 3) { // Register is not one of al, bl, cl, dl. Its encoding needs REX. emit_rex_32(dst); @@ -1092,7 +1067,6 @@ void Assembler::decb(Register dst) { void Assembler::decb(const Operand& dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xFE); emit_operand(1, dst); @@ -1101,7 +1075,6 @@ void Assembler::decb(const Operand& dst) { void Assembler::enter(Immediate size) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xC8); emitw(size.value_); // 16 bit operand, always. emit(0); @@ -1110,14 +1083,12 @@ void Assembler::enter(Immediate size) { void Assembler::hlt() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF4); } void Assembler::idivq(Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(src); emit(0xF7); emit_modrm(0x7, src); @@ -1126,7 +1097,6 @@ void Assembler::idivq(Register src) { void Assembler::idivl(Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(src); emit(0xF7); emit_modrm(0x7, src); @@ -1135,7 +1105,6 @@ void Assembler::idivl(Register src) { void Assembler::imul(Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(src); emit(0xF7); emit_modrm(0x5, src); @@ -1144,7 +1113,6 @@ void Assembler::imul(Register src) { void Assembler::imul(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst, src); emit(0x0F); emit(0xAF); @@ -1154,7 +1122,6 @@ void Assembler::imul(Register dst, Register src) { void Assembler::imul(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst, src); emit(0x0F); emit(0xAF); @@ -1164,7 +1131,6 @@ void Assembler::imul(Register dst, const Operand& src) { void Assembler::imul(Register dst, Register src, Immediate imm) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst, src); if (is_int8(imm.value_)) { emit(0x6B); @@ -1180,7 +1146,6 @@ void Assembler::imul(Register dst, Register src, Immediate imm) { void Assembler::imull(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst, src); emit(0x0F); emit(0xAF); @@ -1190,7 +1155,6 @@ void Assembler::imull(Register dst, Register src) { 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); @@ -1200,7 +1164,6 @@ void Assembler::imull(Register dst, const Operand& src) { void Assembler::imull(Register dst, Register src, Immediate imm) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst, src); if (is_int8(imm.value_)) { emit(0x6B); @@ -1216,7 +1179,6 @@ void Assembler::imull(Register dst, Register src, Immediate imm) { void Assembler::incq(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xFF); emit_modrm(0x0, dst); @@ -1225,7 +1187,6 @@ void Assembler::incq(Register dst) { void Assembler::incq(const Operand& dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xFF); emit_operand(0, dst); @@ -1234,7 +1195,6 @@ void Assembler::incq(const Operand& dst) { void Assembler::incl(const Operand& dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xFF); emit_operand(0, dst); @@ -1243,7 +1203,6 @@ void Assembler::incl(const Operand& dst) { void Assembler::incl(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xFF); emit_modrm(0, dst); @@ -1252,12 +1211,11 @@ void Assembler::incl(Register dst) { void Assembler::int3() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xCC); } -void Assembler::j(Condition cc, Label* L) { +void Assembler::j(Condition cc, Label* L, Label::Distance distance) { if (cc == always) { jmp(L); return; @@ -1265,7 +1223,6 @@ void Assembler::j(Condition cc, Label* L) { return; } EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT(is_uint4(cc)); if (L->is_bound()) { const int short_size = 2; @@ -1282,6 +1239,17 @@ void Assembler::j(Condition cc, Label* L) { emit(0x80 | cc); emitl(offs - long_size); } + } else if (distance == Label::kNear) { + // 0111 tttn #8-bit disp + emit(0x70 | cc); + byte disp = 0x00; + if (L->is_near_linked()) { + int offset = L->near_link_pos() - pc_offset(); + ASSERT(is_int8(offset)); + disp = static_cast<byte>(offset & 0xFF); + } + L->link_to(pc_offset(), Label::kNear); + emit(disp); } else if (L->is_linked()) { // 0000 1111 1000 tttn #32-bit disp. emit(0x0F); @@ -1303,7 +1271,6 @@ void Assembler::j(Condition cc, Handle<Code> target, RelocInfo::Mode rmode) { EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT(is_uint4(cc)); // 0000 1111 1000 tttn #32-bit disp. emit(0x0F); @@ -1312,30 +1279,8 @@ void Assembler::j(Condition cc, } -void Assembler::j(Condition cc, NearLabel* L, Hint hint) { +void Assembler::jmp(Label* L, Label::Distance distance) { EnsureSpace ensure_space(this); - last_pc_ = pc_; - ASSERT(0 <= cc && cc < 16); - if (FLAG_emit_branch_hints && hint != no_hint) emit(hint); - if (L->is_bound()) { - const int short_size = 2; - int offs = L->pos() - pc_offset(); - ASSERT(offs <= 0); - ASSERT(is_int8(offs - short_size)); - // 0111 tttn #8-bit disp - emit(0x70 | cc); - emit((offs - short_size) & 0xFF); - } else { - emit(0x70 | cc); - emit(0x00); // The displacement will be resolved later. - L->link_to(pc_offset()); - } -} - - -void Assembler::jmp(Label* L) { - EnsureSpace ensure_space(this); - last_pc_ = pc_; const int short_size = sizeof(int8_t); const int long_size = sizeof(int32_t); if (L->is_bound()) { @@ -1350,7 +1295,17 @@ void Assembler::jmp(Label* L) { emit(0xE9); emitl(offs - long_size); } - } else if (L->is_linked()) { + } else if (distance == Label::kNear) { + emit(0xEB); + byte disp = 0x00; + if (L->is_near_linked()) { + int offset = L->near_link_pos() - pc_offset(); + ASSERT(is_int8(offset)); + disp = static_cast<byte>(offset & 0xFF); + } + L->link_to(pc_offset(), Label::kNear); + emit(disp); + } else if (L->is_linked()) { // 1110 1001 #32-bit disp. emit(0xE9); emitl(L->pos()); @@ -1368,35 +1323,14 @@ void Assembler::jmp(Label* L) { void Assembler::jmp(Handle<Code> target, RelocInfo::Mode rmode) { EnsureSpace ensure_space(this); - last_pc_ = pc_; // 1110 1001 #32-bit disp. emit(0xE9); emit_code_target(target, rmode); } -void Assembler::jmp(NearLabel* L) { - EnsureSpace ensure_space(this); - last_pc_ = pc_; - if (L->is_bound()) { - const int short_size = 2; - int offs = L->pos() - pc_offset(); - ASSERT(offs <= 0); - ASSERT(is_int8(offs - short_size)); - // 1110 1011 #8-bit disp. - emit(0xEB); - emit((offs - short_size) & 0xFF); - } else { - emit(0xEB); - emit(0x00); // The displacement will be resolved later. - L->link_to(pc_offset()); - } -} - - void Assembler::jmp(Register target) { EnsureSpace ensure_space(this); - last_pc_ = pc_; // Opcode FF/4 r64. emit_optional_rex_32(target); emit(0xFF); @@ -1406,7 +1340,6 @@ void Assembler::jmp(Register target) { void Assembler::jmp(const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; // Opcode FF/4 m64. emit_optional_rex_32(src); emit(0xFF); @@ -1416,7 +1349,6 @@ void Assembler::jmp(const Operand& src) { void Assembler::lea(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst, src); emit(0x8D); emit_operand(dst, src); @@ -1425,7 +1357,6 @@ void Assembler::lea(Register dst, const Operand& src) { void Assembler::leal(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst, src); emit(0x8D); emit_operand(dst, src); @@ -1434,7 +1365,6 @@ void Assembler::leal(Register dst, const Operand& src) { void Assembler::load_rax(void* value, RelocInfo::Mode mode) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x48); // REX.W emit(0xA1); emitq(reinterpret_cast<uintptr_t>(value), mode); @@ -1448,15 +1378,18 @@ void Assembler::load_rax(ExternalReference ref) { void Assembler::leave() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xC9); } void Assembler::movb(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; - emit_rex_32(dst, src); + if (dst.code() > 3) { + // Register is not one of al, bl, cl, dl. Its encoding needs REX. + emit_rex_32(dst, src); + } else { + emit_optional_rex_32(dst, src); + } emit(0x8A); emit_operand(dst, src); } @@ -1464,18 +1397,21 @@ void Assembler::movb(Register dst, const Operand& src) { void Assembler::movb(Register dst, Immediate imm) { EnsureSpace ensure_space(this); - last_pc_ = pc_; - emit_rex_32(dst); - emit(0xC6); - emit_modrm(0x0, dst); + if (dst.code() > 3) { + emit_rex_32(dst); + } + emit(0xB0 + dst.low_bits()); emit(imm.value_); } void Assembler::movb(const Operand& dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; - emit_rex_32(src, dst); + if (src.code() > 3) { + emit_rex_32(src, dst); + } else { + emit_optional_rex_32(src, dst); + } emit(0x88); emit_operand(src, dst); } @@ -1483,7 +1419,6 @@ void Assembler::movb(const Operand& dst, Register src) { void Assembler::movw(const Operand& dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(src, dst); emit(0x89); @@ -1493,7 +1428,6 @@ void Assembler::movw(const Operand& dst, Register src) { void Assembler::movl(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst, src); emit(0x8B); emit_operand(dst, src); @@ -1502,7 +1436,6 @@ void Assembler::movl(Register dst, const Operand& src) { void Assembler::movl(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (src.low_bits() == 4) { emit_optional_rex_32(src, dst); emit(0x89); @@ -1517,7 +1450,6 @@ void Assembler::movl(Register dst, Register src) { void Assembler::movl(const Operand& dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(src, dst); emit(0x89); emit_operand(src, dst); @@ -1526,27 +1458,23 @@ void Assembler::movl(const Operand& dst, Register src) { void Assembler::movl(const Operand& dst, Immediate value) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xC7); emit_operand(0x0, dst); - emit(value); // Only 32-bit immediates are possible, not 8-bit immediates. + emit(value); } void Assembler::movl(Register dst, Immediate value) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); - emit(0xC7); - emit_modrm(0x0, dst); - emit(value); // Only 32-bit immediates are possible, not 8-bit immediates. + emit(0xB8 + dst.low_bits()); + emit(value); } void Assembler::movq(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst, src); emit(0x8B); emit_operand(dst, src); @@ -1555,7 +1483,6 @@ void Assembler::movq(Register dst, const Operand& src) { void Assembler::movq(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (src.low_bits() == 4) { emit_rex_64(src, dst); emit(0x89); @@ -1570,7 +1497,6 @@ void Assembler::movq(Register dst, Register src) { void Assembler::movq(Register dst, Immediate value) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xC7); emit_modrm(0x0, dst); @@ -1580,7 +1506,6 @@ void Assembler::movq(Register dst, Immediate value) { void Assembler::movq(const Operand& dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(src, dst); emit(0x89); emit_operand(src, dst); @@ -1592,7 +1517,6 @@ void Assembler::movq(Register dst, void* value, RelocInfo::Mode rmode) { // address is not GC safe. Use the handle version instead. ASSERT(rmode > RelocInfo::LAST_GCED_ENUM); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xB8 | dst.low_bits()); emitq(reinterpret_cast<uintptr_t>(value), rmode); @@ -1614,7 +1538,6 @@ void Assembler::movq(Register dst, int64_t value, RelocInfo::Mode rmode) { // value. } EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xB8 | dst.low_bits()); emitq(value, rmode); @@ -1629,7 +1552,6 @@ void Assembler::movq(Register dst, ExternalReference ref) { void Assembler::movq(const Operand& dst, Immediate value) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xC7); emit_operand(0, dst); @@ -1641,7 +1563,6 @@ void Assembler::movq(const Operand& dst, Immediate value) { // (as a 32-bit offset sign extended to 64-bit). void Assembler::movl(const Operand& dst, Label* src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xC7); emit_operand(0, dst); @@ -1671,9 +1592,8 @@ void Assembler::movq(Register dst, Handle<Object> value, RelocInfo::Mode mode) { movq(dst, reinterpret_cast<int64_t>(*value), RelocInfo::NONE); } else { EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT(value->IsHeapObject()); - ASSERT(!Heap::InNewSpace(*value)); + ASSERT(!HEAP->InNewSpace(*value)); emit_rex_64(dst); emit(0xB8 | dst.low_bits()); emitq(reinterpret_cast<uintptr_t>(value.location()), mode); @@ -1683,7 +1603,6 @@ void Assembler::movq(Register dst, Handle<Object> value, RelocInfo::Mode mode) { void Assembler::movsxbq(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst, src); emit(0x0F); emit(0xBE); @@ -1693,7 +1612,6 @@ void Assembler::movsxbq(Register dst, const Operand& src) { void Assembler::movsxwq(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst, src); emit(0x0F); emit(0xBF); @@ -1703,7 +1621,6 @@ void Assembler::movsxwq(Register dst, const Operand& src) { void Assembler::movsxlq(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst, src); emit(0x63); emit_modrm(dst, src); @@ -1712,7 +1629,6 @@ void Assembler::movsxlq(Register dst, Register src) { void Assembler::movsxlq(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst, src); emit(0x63); emit_operand(dst, src); @@ -1721,7 +1637,6 @@ void Assembler::movsxlq(Register dst, const Operand& src) { void Assembler::movzxbq(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst, src); emit(0x0F); emit(0xB6); @@ -1731,7 +1646,6 @@ void Assembler::movzxbq(Register dst, const Operand& src) { void Assembler::movzxbl(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst, src); emit(0x0F); emit(0xB6); @@ -1741,7 +1655,6 @@ void Assembler::movzxbl(Register dst, const Operand& src) { void Assembler::movzxwq(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst, src); emit(0x0F); emit(0xB7); @@ -1751,7 +1664,6 @@ void Assembler::movzxwq(Register dst, const Operand& src) { void Assembler::movzxwl(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst, src); emit(0x0F); emit(0xB7); @@ -1761,7 +1673,6 @@ void Assembler::movzxwl(Register dst, const Operand& src) { void Assembler::repmovsb() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); emit(0xA4); } @@ -1769,7 +1680,6 @@ void Assembler::repmovsb() { void Assembler::repmovsw() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); // Operand size override. emit(0xF3); emit(0xA4); @@ -1778,7 +1688,6 @@ void Assembler::repmovsw() { void Assembler::repmovsl() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); emit(0xA5); } @@ -1786,7 +1695,6 @@ void Assembler::repmovsl() { void Assembler::repmovsq() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); emit_rex_64(); emit(0xA5); @@ -1795,7 +1703,6 @@ void Assembler::repmovsq() { void Assembler::mul(Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(src); emit(0xF7); emit_modrm(0x4, src); @@ -1804,7 +1711,6 @@ void Assembler::mul(Register src) { void Assembler::neg(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xF7); emit_modrm(0x3, dst); @@ -1813,7 +1719,6 @@ void Assembler::neg(Register dst) { void Assembler::negl(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xF7); emit_modrm(0x3, dst); @@ -1822,7 +1727,6 @@ void Assembler::negl(Register dst) { void Assembler::neg(const Operand& dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xF7); emit_operand(3, dst); @@ -1831,14 +1735,12 @@ void Assembler::neg(const Operand& dst) { void Assembler::nop() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x90); } void Assembler::not_(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xF7); emit_modrm(0x2, dst); @@ -1847,7 +1749,6 @@ void Assembler::not_(Register dst) { void Assembler::not_(const Operand& dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(dst); emit(0xF7); emit_operand(2, dst); @@ -1856,7 +1757,6 @@ void Assembler::not_(const Operand& dst) { void Assembler::notl(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0xF7); emit_modrm(0x2, dst); @@ -1881,7 +1781,6 @@ void Assembler::nop(int n) { ASSERT(1 <= n); ASSERT(n <= 9); EnsureSpace ensure_space(this); - last_pc_ = pc_; switch (n) { case 1: emit(0x90); @@ -1952,7 +1851,6 @@ void Assembler::nop(int n) { void Assembler::pop(Register dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0x58 | dst.low_bits()); } @@ -1960,7 +1858,6 @@ void Assembler::pop(Register dst) { void Assembler::pop(const Operand& dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(dst); emit(0x8F); emit_operand(0, dst); @@ -1969,14 +1866,12 @@ void Assembler::pop(const Operand& dst) { void Assembler::popfq() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x9D); } void Assembler::push(Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(src); emit(0x50 | src.low_bits()); } @@ -1984,7 +1879,6 @@ void Assembler::push(Register src) { void Assembler::push(const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(src); emit(0xFF); emit_operand(6, src); @@ -1993,7 +1887,6 @@ void Assembler::push(const Operand& src) { void Assembler::push(Immediate value) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (is_int8(value.value_)) { emit(0x6A); emit(value.value_); // Emit low byte of value. @@ -2006,7 +1899,6 @@ void Assembler::push(Immediate value) { void Assembler::push_imm32(int32_t imm32) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x68); emitl(imm32); } @@ -2014,14 +1906,12 @@ void Assembler::push_imm32(int32_t imm32) { void Assembler::pushfq() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x9C); } void Assembler::rdtsc() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x0F); emit(0x31); } @@ -2029,7 +1919,6 @@ void Assembler::rdtsc() { void Assembler::ret(int imm16) { EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT(is_uint16(imm16)); if (imm16 == 0) { emit(0xC3); @@ -2047,7 +1936,6 @@ void Assembler::setcc(Condition cc, Register reg) { return; } EnsureSpace ensure_space(this); - last_pc_ = pc_; ASSERT(is_uint4(cc)); if (reg.code() > 3) { // Use x64 byte registers, where different. emit_rex_32(reg); @@ -2060,7 +1948,6 @@ void Assembler::setcc(Condition cc, Register reg) { void Assembler::shld(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(src, dst); emit(0x0F); emit(0xA5); @@ -2070,7 +1957,6 @@ void Assembler::shld(Register dst, Register src) { void Assembler::shrd(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(src, dst); emit(0x0F); emit(0xAD); @@ -2080,7 +1966,6 @@ void Assembler::shrd(Register dst, Register src) { void Assembler::xchg(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (src.is(rax) || dst.is(rax)) { // Single-byte encoding Register other = src.is(rax) ? dst : src; emit_rex_64(other); @@ -2099,7 +1984,6 @@ void Assembler::xchg(Register dst, Register src) { void Assembler::store_rax(void* dst, RelocInfo::Mode mode) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x48); // REX.W emit(0xA3); emitq(reinterpret_cast<uintptr_t>(dst), mode); @@ -2113,7 +1997,6 @@ void Assembler::store_rax(ExternalReference ref) { void Assembler::testb(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (src.low_bits() == 4) { emit_rex_32(src, dst); emit(0x84); @@ -2132,7 +2015,6 @@ void Assembler::testb(Register dst, Register src) { void Assembler::testb(Register reg, Immediate mask) { ASSERT(is_int8(mask.value_) || is_uint8(mask.value_)); EnsureSpace ensure_space(this); - last_pc_ = pc_; if (reg.is(rax)) { emit(0xA8); emit(mask.value_); // Low byte emitted. @@ -2151,7 +2033,6 @@ void Assembler::testb(Register reg, Immediate mask) { void Assembler::testb(const Operand& op, Immediate mask) { ASSERT(is_int8(mask.value_) || is_uint8(mask.value_)); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(rax, op); emit(0xF6); emit_operand(rax, op); // Operation code 0 @@ -2161,7 +2042,6 @@ void Assembler::testb(const Operand& op, Immediate mask) { void Assembler::testb(const Operand& op, Register reg) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (reg.code() > 3) { // Register is not one of al, bl, cl, dl. Its encoding needs REX. emit_rex_32(reg, op); @@ -2175,7 +2055,6 @@ void Assembler::testb(const Operand& op, Register reg) { void Assembler::testl(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (src.low_bits() == 4) { emit_optional_rex_32(src, dst); emit(0x85); @@ -2195,7 +2074,6 @@ void Assembler::testl(Register reg, Immediate mask) { return; } EnsureSpace ensure_space(this); - last_pc_ = pc_; if (reg.is(rax)) { emit(0xA9); emit(mask); @@ -2215,7 +2093,6 @@ void Assembler::testl(const Operand& op, Immediate mask) { return; } EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(rax, op); emit(0xF7); emit_operand(rax, op); // Operation code 0 @@ -2225,7 +2102,6 @@ void Assembler::testl(const Operand& op, Immediate mask) { void Assembler::testq(const Operand& op, Register reg) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_rex_64(reg, op); emit(0x85); emit_operand(reg, op); @@ -2234,7 +2110,6 @@ void Assembler::testq(const Operand& op, Register reg) { void Assembler::testq(Register dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (src.low_bits() == 4) { emit_rex_64(src, dst); emit(0x85); @@ -2249,7 +2124,6 @@ void Assembler::testq(Register dst, Register src) { void Assembler::testq(Register dst, Immediate mask) { EnsureSpace ensure_space(this); - last_pc_ = pc_; if (dst.is(rax)) { emit_rex_64(); emit(0xA9); @@ -2268,14 +2142,12 @@ void Assembler::testq(Register dst, Immediate mask) { void Assembler::fld(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xD9, 0xC0, i); } void Assembler::fld1() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xE8); } @@ -2283,7 +2155,6 @@ void Assembler::fld1() { void Assembler::fldz() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xEE); } @@ -2291,7 +2162,6 @@ void Assembler::fldz() { void Assembler::fldpi() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xEB); } @@ -2299,7 +2169,6 @@ void Assembler::fldpi() { void Assembler::fldln2() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xED); } @@ -2307,7 +2176,6 @@ void Assembler::fldln2() { void Assembler::fld_s(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xD9); emit_operand(0, adr); @@ -2316,7 +2184,6 @@ void Assembler::fld_s(const Operand& adr) { void Assembler::fld_d(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDD); emit_operand(0, adr); @@ -2325,7 +2192,6 @@ void Assembler::fld_d(const Operand& adr) { void Assembler::fstp_s(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xD9); emit_operand(3, adr); @@ -2334,7 +2200,6 @@ void Assembler::fstp_s(const Operand& adr) { void Assembler::fstp_d(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDD); emit_operand(3, adr); @@ -2344,14 +2209,12 @@ void Assembler::fstp_d(const Operand& adr) { void Assembler::fstp(int index) { ASSERT(is_uint3(index)); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDD, 0xD8, index); } void Assembler::fild_s(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDB); emit_operand(0, adr); @@ -2360,7 +2223,6 @@ void Assembler::fild_s(const Operand& adr) { void Assembler::fild_d(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDF); emit_operand(5, adr); @@ -2369,7 +2231,6 @@ void Assembler::fild_d(const Operand& adr) { void Assembler::fistp_s(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDB); emit_operand(3, adr); @@ -2379,7 +2240,6 @@ void Assembler::fistp_s(const Operand& adr) { void Assembler::fisttp_s(const Operand& adr) { ASSERT(CpuFeatures::IsEnabled(SSE3)); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDB); emit_operand(1, adr); @@ -2389,7 +2249,6 @@ void Assembler::fisttp_s(const Operand& adr) { void Assembler::fisttp_d(const Operand& adr) { ASSERT(CpuFeatures::IsEnabled(SSE3)); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDD); emit_operand(1, adr); @@ -2398,7 +2257,6 @@ void Assembler::fisttp_d(const Operand& adr) { void Assembler::fist_s(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDB); emit_operand(2, adr); @@ -2407,7 +2265,6 @@ void Assembler::fist_s(const Operand& adr) { void Assembler::fistp_d(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDF); emit_operand(7, adr); @@ -2416,7 +2273,6 @@ void Assembler::fistp_d(const Operand& adr) { void Assembler::fabs() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xE1); } @@ -2424,7 +2280,6 @@ void Assembler::fabs() { void Assembler::fchs() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xE0); } @@ -2432,7 +2287,6 @@ void Assembler::fchs() { void Assembler::fcos() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xFF); } @@ -2440,7 +2294,6 @@ void Assembler::fcos() { void Assembler::fsin() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xFE); } @@ -2448,7 +2301,6 @@ void Assembler::fsin() { void Assembler::fyl2x() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xF1); } @@ -2456,21 +2308,18 @@ void Assembler::fyl2x() { void Assembler::fadd(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDC, 0xC0, i); } void Assembler::fsub(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDC, 0xE8, i); } void Assembler::fisub_s(const Operand& adr) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_optional_rex_32(adr); emit(0xDA); emit_operand(4, adr); @@ -2479,56 +2328,48 @@ void Assembler::fisub_s(const Operand& adr) { void Assembler::fmul(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDC, 0xC8, i); } void Assembler::fdiv(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDC, 0xF8, i); } void Assembler::faddp(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDE, 0xC0, i); } void Assembler::fsubp(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDE, 0xE8, i); } void Assembler::fsubrp(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDE, 0xE0, i); } void Assembler::fmulp(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDE, 0xC8, i); } void Assembler::fdivp(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDE, 0xF8, i); } void Assembler::fprem() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xF8); } @@ -2536,7 +2377,6 @@ void Assembler::fprem() { void Assembler::fprem1() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xF5); } @@ -2544,14 +2384,12 @@ void Assembler::fprem1() { void Assembler::fxch(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xD9, 0xC8, i); } void Assembler::fincstp() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xF7); } @@ -2559,14 +2397,12 @@ void Assembler::fincstp() { void Assembler::ffree(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDD, 0xC0, i); } void Assembler::ftst() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xE4); } @@ -2574,14 +2410,12 @@ void Assembler::ftst() { void Assembler::fucomp(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit_farith(0xDD, 0xE8, i); } void Assembler::fucompp() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xDA); emit(0xE9); } @@ -2589,7 +2423,6 @@ void Assembler::fucompp() { void Assembler::fucomi(int i) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xDB); emit(0xE8 + i); } @@ -2597,7 +2430,6 @@ void Assembler::fucomi(int i) { void Assembler::fucomip() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xDF); emit(0xE9); } @@ -2605,7 +2437,6 @@ void Assembler::fucomip() { void Assembler::fcompp() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xDE); emit(0xD9); } @@ -2613,7 +2444,6 @@ void Assembler::fcompp() { void Assembler::fnstsw_ax() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xDF); emit(0xE0); } @@ -2621,14 +2451,12 @@ void Assembler::fnstsw_ax() { void Assembler::fwait() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x9B); } void Assembler::frndint() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xD9); emit(0xFC); } @@ -2636,7 +2464,6 @@ void Assembler::frndint() { void Assembler::fnclex() { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xDB); emit(0xE2); } @@ -2646,7 +2473,6 @@ void Assembler::sahf() { // TODO(X64): Test for presence. Not all 64-bit intel CPU's have sahf // in 64-bit mode. Test CpuID. EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x9E); } @@ -2662,7 +2488,6 @@ void Assembler::emit_farith(int b1, int b2, int i) { void Assembler::movd(XMMRegister dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2673,7 +2498,6 @@ void Assembler::movd(XMMRegister dst, Register src) { void Assembler::movd(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(src, dst); emit(0x0F); @@ -2684,7 +2508,6 @@ void Assembler::movd(Register dst, XMMRegister src) { void Assembler::movq(XMMRegister dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_rex_64(dst, src); emit(0x0F); @@ -2695,7 +2518,6 @@ void Assembler::movq(XMMRegister dst, Register src) { void Assembler::movq(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_rex_64(src, dst); emit(0x0F); @@ -2704,10 +2526,26 @@ void Assembler::movq(Register dst, XMMRegister src) { } +void Assembler::movq(XMMRegister dst, XMMRegister src) { + EnsureSpace ensure_space(this); + if (dst.low_bits() == 4) { + // Avoid unnecessary SIB byte. + emit(0xf3); + emit_optional_rex_32(dst, src); + emit(0x0F); + emit(0x7e); + emit_sse_operand(dst, src); + } else { + emit(0x66); + emit_optional_rex_32(src, dst); + emit(0x0F); + emit(0xD6); + emit_sse_operand(src, dst); + } +} + void Assembler::movdqa(const Operand& dst, XMMRegister src) { - ASSERT(CpuFeatures::IsEnabled(SSE2)); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_rex_64(src, dst); emit(0x0F); @@ -2717,9 +2555,7 @@ void Assembler::movdqa(const Operand& dst, XMMRegister src) { void Assembler::movdqa(XMMRegister dst, const Operand& src) { - ASSERT(CpuFeatures::IsEnabled(SSE2)); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_rex_64(dst, src); emit(0x0F); @@ -2731,7 +2567,6 @@ void Assembler::movdqa(XMMRegister dst, const Operand& src) { void Assembler::extractps(Register dst, XMMRegister src, byte imm8) { ASSERT(is_uint2(imm8)); EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2744,7 +2579,6 @@ void Assembler::extractps(Register dst, XMMRegister src, byte imm8) { void Assembler::movsd(const Operand& dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); // double emit_optional_rex_32(src, dst); emit(0x0F); @@ -2755,7 +2589,6 @@ void Assembler::movsd(const Operand& dst, XMMRegister src) { void Assembler::movsd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); // double emit_optional_rex_32(dst, src); emit(0x0F); @@ -2766,7 +2599,6 @@ void Assembler::movsd(XMMRegister dst, XMMRegister src) { void Assembler::movsd(XMMRegister dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); // double emit_optional_rex_32(dst, src); emit(0x0F); @@ -2775,9 +2607,44 @@ void Assembler::movsd(XMMRegister dst, const Operand& src) { } +void Assembler::movaps(XMMRegister dst, XMMRegister src) { + EnsureSpace ensure_space(this); + if (src.low_bits() == 4) { + // Try to avoid an unnecessary SIB byte. + emit_optional_rex_32(src, dst); + emit(0x0F); + emit(0x29); + emit_sse_operand(src, dst); + } else { + emit_optional_rex_32(dst, src); + emit(0x0F); + emit(0x28); + emit_sse_operand(dst, src); + } +} + + +void Assembler::movapd(XMMRegister dst, XMMRegister src) { + EnsureSpace ensure_space(this); + if (src.low_bits() == 4) { + // Try to avoid an unnecessary SIB byte. + emit(0x66); + emit_optional_rex_32(src, dst); + emit(0x0F); + emit(0x29); + emit_sse_operand(src, dst); + } else { + emit(0x66); + emit_optional_rex_32(dst, src); + emit(0x0F); + emit(0x28); + emit_sse_operand(dst, src); + } +} + + void Assembler::movss(XMMRegister dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); // single emit_optional_rex_32(dst, src); emit(0x0F); @@ -2788,7 +2655,6 @@ void Assembler::movss(XMMRegister dst, const Operand& src) { void Assembler::movss(const Operand& src, XMMRegister dst) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); // single emit_optional_rex_32(dst, src); emit(0x0F); @@ -2799,7 +2665,6 @@ void Assembler::movss(const Operand& src, XMMRegister dst) { void Assembler::cvttss2si(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2810,7 +2675,6 @@ void Assembler::cvttss2si(Register dst, const Operand& src) { void Assembler::cvttss2si(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2821,7 +2685,6 @@ void Assembler::cvttss2si(Register dst, XMMRegister src) { void Assembler::cvttsd2si(Register dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2832,7 +2695,6 @@ void Assembler::cvttsd2si(Register dst, const Operand& src) { void Assembler::cvttsd2si(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2843,7 +2705,6 @@ void Assembler::cvttsd2si(Register dst, XMMRegister src) { void Assembler::cvttsd2siq(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_rex_64(dst, src); emit(0x0F); @@ -2854,7 +2715,6 @@ void Assembler::cvttsd2siq(Register dst, XMMRegister src) { void Assembler::cvtlsi2sd(XMMRegister dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2865,7 +2725,6 @@ void Assembler::cvtlsi2sd(XMMRegister dst, const Operand& src) { void Assembler::cvtlsi2sd(XMMRegister dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2876,7 +2735,6 @@ void Assembler::cvtlsi2sd(XMMRegister dst, Register src) { void Assembler::cvtlsi2ss(XMMRegister dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2887,7 +2745,6 @@ void Assembler::cvtlsi2ss(XMMRegister dst, Register src) { void Assembler::cvtqsi2sd(XMMRegister dst, Register src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_rex_64(dst, src); emit(0x0F); @@ -2898,7 +2755,6 @@ void Assembler::cvtqsi2sd(XMMRegister dst, Register src) { void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2909,7 +2765,6 @@ void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) { void Assembler::cvtss2sd(XMMRegister dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF3); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2920,7 +2775,6 @@ void Assembler::cvtss2sd(XMMRegister dst, const Operand& src) { void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2931,7 +2785,6 @@ void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) { void Assembler::cvtsd2si(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2942,7 +2795,6 @@ void Assembler::cvtsd2si(Register dst, XMMRegister src) { void Assembler::cvtsd2siq(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_rex_64(dst, src); emit(0x0F); @@ -2953,7 +2805,6 @@ void Assembler::cvtsd2siq(Register dst, XMMRegister src) { void Assembler::addsd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2964,7 +2815,6 @@ void Assembler::addsd(XMMRegister dst, XMMRegister src) { void Assembler::mulsd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2975,7 +2825,6 @@ void Assembler::mulsd(XMMRegister dst, XMMRegister src) { void Assembler::subsd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2986,7 +2835,6 @@ void Assembler::subsd(XMMRegister dst, XMMRegister src) { void Assembler::divsd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -2997,7 +2845,6 @@ void Assembler::divsd(XMMRegister dst, XMMRegister src) { void Assembler::andpd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(dst, src); emit(0x0F); @@ -3008,7 +2855,6 @@ void Assembler::andpd(XMMRegister dst, XMMRegister src) { void Assembler::orpd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(dst, src); emit(0x0F); @@ -3019,7 +2865,6 @@ void Assembler::orpd(XMMRegister dst, XMMRegister src) { void Assembler::xorpd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(dst, src); emit(0x0F); @@ -3028,9 +2873,17 @@ void Assembler::xorpd(XMMRegister dst, XMMRegister src) { } +void Assembler::xorps(XMMRegister dst, XMMRegister src) { + EnsureSpace ensure_space(this); + emit_optional_rex_32(dst, src); + emit(0x0F); + emit(0x57); + emit_sse_operand(dst, src); +} + + void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0xF2); emit_optional_rex_32(dst, src); emit(0x0F); @@ -3041,7 +2894,6 @@ void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) { void Assembler::ucomisd(XMMRegister dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(dst, src); emit(0x0f); @@ -3052,7 +2904,6 @@ void Assembler::ucomisd(XMMRegister dst, XMMRegister src) { void Assembler::ucomisd(XMMRegister dst, const Operand& src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(dst, src); emit(0x0f); @@ -3061,9 +2912,23 @@ void Assembler::ucomisd(XMMRegister dst, const Operand& src) { } +void Assembler::roundsd(XMMRegister dst, XMMRegister src, + Assembler::RoundingMode mode) { + ASSERT(CpuFeatures::IsEnabled(SSE4_1)); + EnsureSpace ensure_space(this); + emit(0x66); + emit_optional_rex_32(dst, src); + emit(0x0f); + emit(0x3a); + emit(0x0b); + emit_sse_operand(dst, src); + // Mask precision exeption. + emit(static_cast<byte>(mode) | 0x8); +} + + void Assembler::movmskpd(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); - last_pc_ = pc_; emit(0x66); emit_optional_rex_32(dst, src); emit(0x0f); @@ -3114,7 +2979,7 @@ void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { Serializer::TooLateToEnableNow(); } #endif - if (!Serializer::enabled() && !FLAG_debug_code) { + if (!Serializer::enabled() && !emit_debug_code()) { return; } } |