5 #include "src/x64/assembler-x64.h" 15 #include <sys/sysctl.h> 18 #include "src/assembler-inl.h" 19 #include "src/base/bits.h" 20 #include "src/base/cpu.h" 21 #include "src/code-stubs.h" 22 #include "src/deoptimizer.h" 23 #include "src/macro-assembler.h" 24 #include "src/string-constants.h" 37 V8_INLINE uint64_t _xgetbv(
unsigned int xcr) {
43 __asm__
volatile(
".byte 0x0F, 0x01, 0xD0" :
"=a"(eax),
"=d"(edx) :
"c"(xcr));
44 return static_cast<uint64_t
>(eax) | (static_cast<uint64_t>(edx) << 32);
47 #define _XCR_XFEATURE_ENABLED_MASK 0 49 #endif // !V8_LIBC_MSVCRT 52 bool OSHasAVXSupport() {
57 size_t buffer_size = arraysize(buffer);
58 int ctl_name[] = {CTL_KERN, KERN_OSRELEASE};
59 if (sysctl(ctl_name, 2, buffer, &buffer_size,
nullptr, 0) != 0) {
60 FATAL(
"V8 failed to get kernel version");
64 char* period_pos = strchr(buffer,
'.');
65 DCHECK_NOT_NULL(period_pos);
67 long kernel_version_major = strtol(buffer,
nullptr, 10);
68 if (kernel_version_major <= 13)
return false;
69 #endif // V8_OS_MACOSX 71 uint64_t feature_mask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
72 return (feature_mask & 0x6) == 0x6;
78 void CpuFeatures::ProbeImpl(
bool cross_compile) {
80 CHECK(cpu.has_sse2());
81 CHECK(cpu.has_cmov());
84 if (cross_compile)
return;
86 if (cpu.has_sse41() && FLAG_enable_sse4_1) {
87 supported_ |= 1u << SSE4_1;
88 supported_ |= 1u << SSSE3;
90 if (cpu.has_ssse3() && FLAG_enable_ssse3) supported_ |= 1u << SSSE3;
91 if (cpu.has_sse3() && FLAG_enable_sse3) supported_ |= 1u << SSE3;
93 if (cpu.has_sahf() && FLAG_enable_sahf) supported_ |= 1u << SAHF;
94 if (cpu.has_avx() && FLAG_enable_avx && cpu.has_osxsave() &&
96 supported_ |= 1u << AVX;
98 if (cpu.has_fma3() && FLAG_enable_fma3 && cpu.has_osxsave() &&
100 supported_ |= 1u << FMA3;
102 if (cpu.has_bmi1() && FLAG_enable_bmi1) supported_ |= 1u << BMI1;
103 if (cpu.has_bmi2() && FLAG_enable_bmi2) supported_ |= 1u << BMI2;
104 if (cpu.has_lzcnt() && FLAG_enable_lzcnt) supported_ |= 1u << LZCNT;
105 if (cpu.has_popcnt() && FLAG_enable_popcnt) supported_ |= 1u << POPCNT;
106 if (strcmp(FLAG_mcpu,
"auto") == 0) {
107 if (cpu.is_atom()) supported_ |= 1u << ATOM;
108 }
else if (strcmp(FLAG_mcpu,
"atom") == 0) {
109 supported_ |= 1u << ATOM;
114 void CpuFeatures::PrintTarget() { }
115 void CpuFeatures::PrintFeatures() {
117 "SSE3=%d SSSE3=%d SSE4_1=%d SAHF=%d AVX=%d FMA3=%d BMI1=%d BMI2=%d " 119 "POPCNT=%d ATOM=%d\n",
120 CpuFeatures::IsSupported(SSE3), CpuFeatures::IsSupported(SSSE3),
121 CpuFeatures::IsSupported(SSE4_1), CpuFeatures::IsSupported(SAHF),
122 CpuFeatures::IsSupported(AVX), CpuFeatures::IsSupported(FMA3),
123 CpuFeatures::IsSupported(BMI1), CpuFeatures::IsSupported(BMI2),
124 CpuFeatures::IsSupported(LZCNT), CpuFeatures::IsSupported(POPCNT),
125 CpuFeatures::IsSupported(ATOM));
131 uint32_t RelocInfo::wasm_call_tag()
const {
132 DCHECK(rmode_ == WASM_CALL || rmode_ == WASM_STUB_CALL);
133 return Memory<uint32_t>(pc_);
140 class OperandBuilder {
142 OperandBuilder(Register base, int32_t disp) {
143 if (base == rsp || base == r12) {
145 set_sib(times_1, rsp, base);
148 if (disp == 0 && base != rbp && base != r13) {
150 }
else if (is_int8(disp)) {
159 OperandBuilder(Register base, Register index, ScaleFactor scale,
161 DCHECK(index != rsp);
162 set_sib(scale, index, base);
163 if (disp == 0 && base != rbp && base != r13) {
167 }
else if (is_int8(disp)) {
176 OperandBuilder(Register index, ScaleFactor scale, int32_t disp) {
177 DCHECK(index != rsp);
179 set_sib(scale, index, rbp);
183 OperandBuilder(Label* label,
int addend) {
184 data_.addend = addend;
185 DCHECK_NOT_NULL(label);
186 DCHECK(addend == 0 || (is_int8(addend) && label->is_bound()));
188 set_disp64(reinterpret_cast<intptr_t>(label));
191 OperandBuilder(Operand operand, int32_t offset) {
192 DCHECK_GE(operand.data().len, 1);
194 byte modrm = operand.data().buf[0];
195 DCHECK_LT(modrm, 0xC0);
196 bool has_sib = ((modrm & 0x07) == 0x04);
197 byte mode = modrm & 0xC0;
198 int disp_offset = has_sib ? 2 : 1;
199 int base_reg = (has_sib ? operand.data().buf[1] : modrm) & 0x07;
203 (mode == 0) && (base_reg == 0x05);
204 int32_t disp_value = 0;
205 if (mode == 0x80 || is_baseless) {
207 disp_value = *bit_cast<
const int32_t*>(&operand.data().buf[disp_offset]);
208 }
else if (mode == 0x40) {
210 disp_value =
static_cast<signed char>(operand.data().buf[disp_offset]);
214 DCHECK(offset >= 0 ? disp_value + offset > disp_value
215 : disp_value + offset < disp_value);
216 disp_value += offset;
217 data_.rex = operand.data().rex;
218 if (!is_int8(disp_value) || is_baseless) {
220 data_.buf[0] = (modrm & 0x3F) | (is_baseless ? 0x00 : 0x80);
221 data_.len = disp_offset + 4;
222 Memory<int32_t>(
reinterpret_cast<Address
>(&data_.buf[disp_offset])) =
224 }
else if (disp_value != 0 || (base_reg == 0x05)) {
226 data_.buf[0] = (modrm & 0x3F) | 0x40;
227 data_.len = disp_offset + 1;
228 data_.buf[disp_offset] =
static_cast<byte
>(disp_value);
231 data_.buf[0] = (modrm & 0x3F);
232 data_.len = disp_offset;
235 data_.buf[1] = operand.data().buf[1];
239 void set_modrm(
int mod, Register rm_reg) {
240 DCHECK(is_uint2(mod));
241 data_.buf[0] = mod << 6 | rm_reg.low_bits();
243 data_.rex |= rm_reg.high_bit();
246 void set_sib(ScaleFactor scale, Register index, Register base) {
247 DCHECK_EQ(data_.len, 1);
248 DCHECK(is_uint2(scale));
251 DCHECK(index != rsp || base == rsp || base == r12);
252 data_.buf[1] = (scale << 6) | (index.low_bits() << 3) | base.low_bits();
253 data_.rex |= index.high_bit() << 1 | base.high_bit();
257 void set_disp8(
int disp) {
258 DCHECK(is_int8(disp));
259 DCHECK(data_.len == 1 || data_.len == 2);
260 int8_t* p =
reinterpret_cast<int8_t*
>(&data_.buf[data_.len]);
262 data_.len +=
sizeof(int8_t);
265 void set_disp32(
int disp) {
266 DCHECK(data_.len == 1 || data_.len == 2);
267 int32_t* p =
reinterpret_cast<int32_t*
>(&data_.buf[data_.len]);
269 data_.len +=
sizeof(int32_t);
272 void set_disp64(
int64_t disp) {
273 DCHECK_EQ(1, data_.len);
276 data_.len +=
sizeof(disp);
279 const Operand::Data& data()
const {
return data_; }
286 Operand::Operand(Register base, int32_t disp)
287 : data_(OperandBuilder(base, disp).data()) {}
289 Operand::Operand(Register base, Register index, ScaleFactor scale, int32_t disp)
290 : data_(OperandBuilder(base, index, scale, disp).data()) {}
292 Operand::Operand(Register index, ScaleFactor scale, int32_t disp)
293 : data_(OperandBuilder(index, scale, disp).data()) {}
295 Operand::Operand(Label* label,
int addend)
296 : data_(OperandBuilder(label, addend).data()) {}
298 Operand::Operand(Operand operand, int32_t offset)
299 : data_(OperandBuilder(operand, offset).data()) {}
301 bool Operand::AddressUsesRegister(Register reg)
const {
302 int code = reg.code();
303 DCHECK_NE(data_.buf[0] & 0xC0, 0xC0);
306 int base_code = data_.buf[0] & 0x07;
307 if (base_code == rsp.code()) {
310 int index_code = ((data_.buf[1] >> 3) & 0x07) | ((data_.rex & 0x02) << 2);
312 if (index_code != rsp.code() && index_code == code)
return true;
314 base_code = (data_.buf[1] & 0x07) | ((data_.rex & 0x01) << 3);
316 if (base_code == rbp.code() && ((data_.buf[0] & 0xC0) == 0))
return false;
317 return code == base_code;
321 if (base_code == rbp.code() && ((data_.buf[0] & 0xC0) == 0))
return false;
322 base_code |= ((data_.rex & 0x01) << 3);
323 return code == base_code;
327 void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
328 DCHECK_IMPLIES(isolate ==
nullptr, heap_object_requests_.empty());
329 for (
auto& request : heap_object_requests_) {
330 Address pc =
reinterpret_cast<Address
>(buffer_) + request.offset();
331 switch (request.kind()) {
332 case HeapObjectRequest::kHeapNumber: {
333 Handle<HeapNumber>
object =
334 isolate->factory()->NewHeapNumber(request.heap_number(), TENURED);
335 Memory<Handle<Object>>(pc) =
object;
338 case HeapObjectRequest::kCodeStub: {
339 request.code_stub()->set_isolate(isolate);
340 UpdateCodeTarget(Memory<int32_t>(pc), request.code_stub()->GetCode());
343 case HeapObjectRequest::kStringConstant: {
344 const StringConstantBase* str = request.string();
346 Handle<String> allocated = str->AllocateStringConstant(isolate);
347 Memory<Handle<Object>>(pc) = allocated;
355 bool ConstPool::AddSharedEntry(uint64_t data,
int offset) {
356 auto existing = entries_.find(data);
357 if (existing == entries_.end()) {
358 entries_.insert(std::make_pair(data, offset + kMoveImm64Offset));
363 DCHECK_GT(offset + kMoveImm64Offset, existing->second);
365 entries_.insert(std::make_pair(data, offset + kMoveRipRelativeDispOffset));
369 bool ConstPool::TryRecordEntry(intptr_t data, RelocInfo::Mode mode) {
370 if (!FLAG_partial_constant_pool)
return false;
371 if (!RelocInfo::IsShareableRelocMode(mode))
return false;
375 if (mode != RelocInfo::NONE && mode != RelocInfo::EXTERNAL_REFERENCE &&
376 mode != RelocInfo::OFF_HEAP_TARGET)
379 uint64_t raw_data =
static_cast<uint64_t
>(data);
380 int offset = assm_->pc_offset();
381 return AddSharedEntry(raw_data, offset);
384 bool ConstPool::IsMoveRipRelative(byte* instr) {
385 if ((*reinterpret_cast<uint32_t*>(instr) & kMoveRipRelativeMask) ==
386 kMoveRipRelativeInstr)
391 void ConstPool::Clear() { entries_.clear(); }
393 void ConstPool::PatchEntries() {
394 for (EntryMap::iterator iter = entries_.begin(); iter != entries_.end();
395 iter = entries_.upper_bound(iter->first)) {
396 std::pair<EntryMap::iterator, EntryMap::iterator> range =
397 entries_.equal_range(iter->first);
398 int constant_entry_offset = 0;
399 for (EntryMap::iterator it = range.first; it != range.second; it++) {
400 if (it == range.first) {
401 constant_entry_offset = it->second;
405 DCHECK_GT(constant_entry_offset, 0);
406 DCHECK_LT(constant_entry_offset, it->second);
408 constant_entry_offset - (it->second + kRipRelativeDispSize);
409 byte* disp_addr = assm_->addr_at(it->second);
412 DCHECK(IsMoveRipRelative(disp_addr - kMoveRipRelativeDispOffset));
414 DCHECK(*reinterpret_cast<uint32_t*>(disp_addr) == 0);
415 *
reinterpret_cast<int32_t*
>(disp_addr) = disp32;
421 void Assembler::PatchConstPool() {
423 if (constpool_.IsEmpty()) {
426 constpool_.PatchEntries();
429 bool Assembler::UseConstPoolFor(RelocInfo::Mode rmode) {
430 if (!FLAG_partial_constant_pool)
return false;
431 return (rmode == RelocInfo::NONE || rmode == RelocInfo::EXTERNAL_REFERENCE ||
432 rmode == RelocInfo::OFF_HEAP_TARGET);
438 Assembler::Assembler(
const AssemblerOptions& options,
void* buffer,
440 : AssemblerBase(options, buffer, buffer_size), constpool_(this) {
445 if (own_buffer_) ZapCode(reinterpret_cast<Address>(buffer_), buffer_size_);
448 ReserveCodeTargetSpace(100);
449 reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_);
450 if (CpuFeatures::IsSupported(SSE4_1)) {
451 EnableCpuFeature(SSSE3);
455 void Assembler::GetCode(Isolate* isolate, CodeDesc* desc) {
457 DCHECK(constpool_.IsEmpty());
461 DCHECK(pc_ <= reloc_info_writer.pos());
463 AllocateAndInstallRequestedHeapObjects(isolate);
466 desc->buffer = buffer_;
467 desc->buffer_size = buffer_size_;
468 desc->instr_size = pc_offset();
469 DCHECK_GT(desc->instr_size, 0);
471 static_cast<int>((buffer_ + buffer_size_) - reloc_info_writer.pos());
473 desc->constant_pool_size = 0;
474 desc->unwinding_info_size = 0;
475 desc->unwinding_info =
nullptr;
478 auto jump_opt = jump_optimization_info();
479 if (jump_opt && jump_opt->is_collecting()) {
480 auto& bitmap = jump_opt->farjmp_bitmap();
481 int num =
static_cast<int>(farjmp_positions_.size());
482 if (num && bitmap.empty()) {
483 bool can_opt =
false;
485 bitmap.resize((num + 31) / 32, 0);
486 for (
int i = 0;
i < num;
i++) {
487 int disp_pos = farjmp_positions_[
i];
488 int disp = long_at(disp_pos);
490 bitmap[
i / 32] |= 1 << (
i & 31);
495 jump_opt->set_optimizable();
502 void Assembler::Align(
int m) {
503 DCHECK(base::bits::IsPowerOfTwo(m));
504 int delta = (m - (pc_offset() & (m - 1))) & (m - 1);
509 void Assembler::CodeTargetAlign() {
514 bool Assembler::IsNop(Address addr) {
515 byte* a =
reinterpret_cast<byte*
>(addr);
516 while (*a == 0x66) a++;
517 if (*a == 0x90)
return true;
518 if (a[0] == 0xF && a[1] == 0x1F)
return true;
523 void Assembler::bind_to(Label* L,
int pos) {
524 DCHECK(!L->is_bound());
525 DCHECK(0 <= pos && pos <= pc_offset());
526 if (L->is_linked()) {
527 int current = L->pos();
528 int next = long_at(current);
529 while (next != current) {
530 if (current >= 4 && long_at(current - 4) == 0) {
532 intptr_t imm64 =
reinterpret_cast<intptr_t
>(buffer_ + pos);
533 *
reinterpret_cast<intptr_t*
>(addr_at(current - 4)) = imm64;
534 internal_reference_positions_.push_back(current - 4);
537 int imm32 = pos - (current +
sizeof(int32_t));
538 long_at_put(current, imm32);
541 next = long_at(next);
544 if (current >= 4 && long_at(current - 4) == 0) {
546 intptr_t imm64 =
reinterpret_cast<intptr_t
>(buffer_ + pos);
547 *
reinterpret_cast<intptr_t*
>(addr_at(current - 4)) = imm64;
548 internal_reference_positions_.push_back(current - 4);
551 int imm32 = pos - (current +
sizeof(int32_t));
552 long_at_put(current, imm32);
555 while (L->is_near_linked()) {
556 int fixup_pos = L->near_link_pos();
558 static_cast<int>(*
reinterpret_cast<int8_t*
>(addr_at(fixup_pos)));
559 DCHECK_LE(offset_to_next, 0);
560 int disp = pos - (fixup_pos +
sizeof(int8_t));
561 CHECK(is_int8(disp));
562 set_byte_at(fixup_pos, disp);
563 if (offset_to_next < 0) {
564 L->link_to(fixup_pos + offset_to_next, Label::kNear);
571 auto jump_opt = jump_optimization_info();
572 if (jump_opt && jump_opt->is_optimizing()) {
573 auto it = label_farjmp_maps_.find(L);
574 if (it != label_farjmp_maps_.end()) {
575 auto& pos_vector = it->second;
576 for (
auto fixup_pos : pos_vector) {
577 int disp = pos - (fixup_pos +
sizeof(int8_t));
578 CHECK(is_int8(disp));
579 set_byte_at(fixup_pos, disp);
581 label_farjmp_maps_.erase(it);
588 void Assembler::bind(Label* L) {
589 bind_to(L, pc_offset());
592 void Assembler::record_farjmp_position(Label* L,
int pos) {
593 auto& pos_vector = label_farjmp_maps_[L];
594 pos_vector.push_back(pos);
597 bool Assembler::is_optimizable_farjmp(
int idx) {
598 if (predictable_code_size())
return false;
600 auto jump_opt = jump_optimization_info();
601 CHECK(jump_opt->is_optimizing());
603 auto& bitmap = jump_opt->farjmp_bitmap();
604 CHECK(idx < static_cast<int>(bitmap.size() * 32));
605 return !!(bitmap[idx / 32] & (1 << (idx & 31)));
608 void Assembler::GrowBuffer() {
609 DCHECK(buffer_overflow());
610 if (!own_buffer_) FATAL(
"external code buffer is too small");
614 desc.buffer_size = 2 * buffer_size_;
618 if (desc.buffer_size > kMaximalBufferSize) {
619 V8::FatalProcessOutOfMemory(
nullptr,
"Assembler::GrowBuffer");
623 desc.buffer = NewArray<byte>(desc.buffer_size);
625 desc.instr_size = pc_offset();
627 static_cast<int>((buffer_ + buffer_size_) - (reloc_info_writer.pos()));
632 ZapCode(reinterpret_cast<Address>(desc.buffer), desc.buffer_size);
636 intptr_t pc_delta = desc.buffer - buffer_;
637 intptr_t rc_delta = (desc.buffer + desc.buffer_size) -
638 (buffer_ + buffer_size_);
639 MemMove(desc.buffer, buffer_, desc.instr_size);
640 MemMove(rc_delta + reloc_info_writer.pos(), reloc_info_writer.pos(),
644 DeleteArray(buffer_);
645 buffer_ = desc.buffer;
646 buffer_size_ = desc.buffer_size;
648 reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta,
649 reloc_info_writer.last_pc() + pc_delta);
652 for (
auto pos : internal_reference_positions_) {
653 intptr_t* p =
reinterpret_cast<intptr_t*
>(buffer_ + pos);
657 DCHECK(!buffer_overflow());
660 void Assembler::emit_operand(
int code, Operand adr) {
661 DCHECK(is_uint3(code));
662 const unsigned length = adr.data().len;
663 DCHECK_GT(length, 0);
666 DCHECK_EQ(adr.data().buf[0] & 0x38, 0);
667 *pc_++ = adr.data().buf[0] | code << 3;
670 if (adr.data().buf[0] == 5) {
671 DCHECK_EQ(9u, length);
672 Label* label = *bit_cast<Label*
const*>(&adr.data().buf[1]);
673 if (label->is_bound()) {
675 label->pos() - pc_offset() -
sizeof(int32_t) + adr.data().addend;
676 DCHECK_GE(0, offset);
678 }
else if (label->is_linked()) {
680 label->link_to(pc_offset() -
sizeof(int32_t));
682 DCHECK(label->is_unused());
683 int32_t current = pc_offset();
685 label->link_to(current);
689 for (
unsigned i = 1;
i < length;
i++) *pc_++ = adr.data().buf[
i];
696 void Assembler::arithmetic_op(byte opcode, Register reg, Operand op,
int size) {
697 EnsureSpace ensure_space(
this);
698 emit_rex(reg, op, size);
700 emit_operand(reg, op);
704 void Assembler::arithmetic_op(byte opcode,
708 EnsureSpace ensure_space(
this);
709 DCHECK_EQ(opcode & 0xC6, 2);
710 if (rm_reg.low_bits() == 4) {
712 emit_rex(rm_reg, reg, size);
714 emit_modrm(rm_reg, reg);
716 emit_rex(reg, rm_reg, size);
718 emit_modrm(reg, rm_reg);
723 void Assembler::arithmetic_op_16(byte opcode, Register reg, Register rm_reg) {
724 EnsureSpace ensure_space(
this);
725 DCHECK_EQ(opcode & 0xC6, 2);
726 if (rm_reg.low_bits() == 4) {
729 emit_optional_rex_32(rm_reg, reg);
731 emit_modrm(rm_reg, reg);
734 emit_optional_rex_32(reg, rm_reg);
736 emit_modrm(reg, rm_reg);
740 void Assembler::arithmetic_op_16(byte opcode, Register reg, Operand rm_reg) {
741 EnsureSpace ensure_space(
this);
743 emit_optional_rex_32(reg, rm_reg);
745 emit_operand(reg, rm_reg);
748 void Assembler::arithmetic_op_8(byte opcode, Register reg, Operand op) {
749 EnsureSpace ensure_space(
this);
750 if (!reg.is_byte_register()) {
751 emit_rex_32(reg, op);
753 emit_optional_rex_32(reg, op);
756 emit_operand(reg, op);
760 void Assembler::arithmetic_op_8(byte opcode, Register reg, Register rm_reg) {
761 EnsureSpace ensure_space(
this);
762 DCHECK_EQ(opcode & 0xC6, 2);
763 if (rm_reg.low_bits() == 4) {
765 if (!rm_reg.is_byte_register() || !reg.is_byte_register()) {
767 emit_rex_32(rm_reg, reg);
770 emit_modrm(rm_reg, reg);
772 if (!reg.is_byte_register() || !rm_reg.is_byte_register()) {
774 emit_rex_32(reg, rm_reg);
777 emit_modrm(reg, rm_reg);
782 void Assembler::immediate_arithmetic_op(byte subcode,
786 EnsureSpace ensure_space(
this);
788 if (is_int8(src.value_) && RelocInfo::IsNone(src.rmode_)) {
790 emit_modrm(subcode, dst);
792 }
else if (dst == rax) {
793 emit(0x05 | (subcode << 3));
797 emit_modrm(subcode, dst);
802 void Assembler::immediate_arithmetic_op(byte subcode, Operand dst,
803 Immediate src,
int size) {
804 EnsureSpace ensure_space(
this);
806 if (is_int8(src.value_) && RelocInfo::IsNone(src.rmode_)) {
808 emit_operand(subcode, dst);
812 emit_operand(subcode, dst);
818 void Assembler::immediate_arithmetic_op_16(byte subcode,
821 EnsureSpace ensure_space(
this);
823 emit_optional_rex_32(dst);
824 if (is_int8(src.value_)) {
826 emit_modrm(subcode, dst);
828 }
else if (dst == rax) {
829 emit(0x05 | (subcode << 3));
833 emit_modrm(subcode, dst);
838 void Assembler::immediate_arithmetic_op_16(byte subcode, Operand dst,
840 EnsureSpace ensure_space(
this);
842 emit_optional_rex_32(dst);
843 if (is_int8(src.value_)) {
845 emit_operand(subcode, dst);
849 emit_operand(subcode, dst);
854 void Assembler::immediate_arithmetic_op_8(byte subcode, Operand dst,
856 EnsureSpace ensure_space(
this);
857 emit_optional_rex_32(dst);
858 DCHECK(is_int8(src.value_) || is_uint8(src.value_));
860 emit_operand(subcode, dst);
865 void Assembler::immediate_arithmetic_op_8(byte subcode,
868 EnsureSpace ensure_space(
this);
869 if (!dst.is_byte_register()) {
873 DCHECK(is_int8(src.value_) || is_uint8(src.value_));
875 emit_modrm(subcode, dst);
880 void Assembler::shift(Register dst,
881 Immediate shift_amount,
884 EnsureSpace ensure_space(
this);
885 DCHECK(size == kInt64Size ? is_uint6(shift_amount.value_)
886 : is_uint5(shift_amount.value_));
887 if (shift_amount.value_ == 1) {
890 emit_modrm(subcode, dst);
894 emit_modrm(subcode, dst);
895 emit(shift_amount.value_);
900 void Assembler::shift(Operand dst, Immediate shift_amount,
int subcode,
902 EnsureSpace ensure_space(
this);
903 DCHECK(size == kInt64Size ? is_uint6(shift_amount.value_)
904 : is_uint5(shift_amount.value_));
905 if (shift_amount.value_ == 1) {
908 emit_operand(subcode, dst);
912 emit_operand(subcode, dst);
913 emit(shift_amount.value_);
918 void Assembler::shift(Register dst,
int subcode,
int size) {
919 EnsureSpace ensure_space(
this);
922 emit_modrm(subcode, dst);
926 void Assembler::shift(Operand dst,
int subcode,
int size) {
927 EnsureSpace ensure_space(
this);
930 emit_operand(subcode, dst);
933 void Assembler::bswapl(Register dst) {
934 EnsureSpace ensure_space(
this);
937 emit(0xC8 + dst.low_bits());
940 void Assembler::bswapq(Register dst) {
941 EnsureSpace ensure_space(
this);
944 emit(0xC8 + dst.low_bits());
947 void Assembler::btq(Operand dst, Register src) {
948 EnsureSpace ensure_space(
this);
949 emit_rex_64(src, dst);
952 emit_operand(src, dst);
955 void Assembler::btsq(Operand dst, Register src) {
956 EnsureSpace ensure_space(
this);
957 emit_rex_64(src, dst);
960 emit_operand(src, dst);
963 void Assembler::btsq(Register dst, Immediate imm8) {
964 EnsureSpace ensure_space(
this);
968 emit_modrm(0x5, dst);
972 void Assembler::btrq(Register dst, Immediate imm8) {
973 EnsureSpace ensure_space(
this);
977 emit_modrm(0x6, dst);
981 void Assembler::bsrl(Register dst, Register src) {
982 EnsureSpace ensure_space(
this);
983 emit_optional_rex_32(dst, src);
986 emit_modrm(dst, src);
989 void Assembler::bsrl(Register dst, Operand src) {
990 EnsureSpace ensure_space(
this);
991 emit_optional_rex_32(dst, src);
994 emit_operand(dst, src);
998 void Assembler::bsrq(Register dst, Register src) {
999 EnsureSpace ensure_space(
this);
1000 emit_rex_64(dst, src);
1003 emit_modrm(dst, src);
1006 void Assembler::bsrq(Register dst, Operand src) {
1007 EnsureSpace ensure_space(
this);
1008 emit_rex_64(dst, src);
1011 emit_operand(dst, src);
1015 void Assembler::bsfl(Register dst, Register src) {
1016 EnsureSpace ensure_space(
this);
1017 emit_optional_rex_32(dst, src);
1020 emit_modrm(dst, src);
1023 void Assembler::bsfl(Register dst, Operand src) {
1024 EnsureSpace ensure_space(
this);
1025 emit_optional_rex_32(dst, src);
1028 emit_operand(dst, src);
1032 void Assembler::bsfq(Register dst, Register src) {
1033 EnsureSpace ensure_space(
this);
1034 emit_rex_64(dst, src);
1037 emit_modrm(dst, src);
1040 void Assembler::bsfq(Register dst, Operand src) {
1041 EnsureSpace ensure_space(
this);
1042 emit_rex_64(dst, src);
1045 emit_operand(dst, src);
1048 void Assembler::pshufw(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
1049 EnsureSpace ensure_space(
this);
1050 emit_optional_rex_32(dst, src);
1053 emit_sse_operand(dst, src);
1057 void Assembler::pshufw(XMMRegister dst, Operand src, uint8_t shuffle) {
1058 EnsureSpace ensure_space(
this);
1059 emit_optional_rex_32(dst, src);
1062 emit_operand(dst.code(), src);
1066 void Assembler::pblendw(XMMRegister dst, Operand src, uint8_t mask) {
1067 sse4_instr(dst, src, 0x66, 0x0F, 0x3A, 0x0E);
1071 void Assembler::pblendw(XMMRegister dst, XMMRegister src, uint8_t mask) {
1072 sse4_instr(dst, src, 0x66, 0x0F, 0x3A, 0x0E);
1076 void Assembler::palignr(XMMRegister dst, Operand src, uint8_t mask) {
1077 ssse3_instr(dst, src, 0x66, 0x0F, 0x3A, 0x0F);
1081 void Assembler::palignr(XMMRegister dst, XMMRegister src, uint8_t mask) {
1082 ssse3_instr(dst, src, 0x66, 0x0F, 0x3A, 0x0F);
1086 void Assembler::call(Label* L) {
1087 EnsureSpace ensure_space(
this);
1090 if (L->is_bound()) {
1091 int offset = L->pos() - pc_offset() -
sizeof(int32_t);
1092 DCHECK_LE(offset, 0);
1094 }
else if (L->is_linked()) {
1096 L->link_to(pc_offset() -
sizeof(int32_t));
1098 DCHECK(L->is_unused());
1099 int32_t current = pc_offset();
1101 L->link_to(current);
1106 void Assembler::call(Address entry, RelocInfo::Mode rmode) {
1107 DCHECK(RelocInfo::IsRuntimeEntry(rmode));
1108 EnsureSpace ensure_space(
this);
1111 emit_runtime_entry(entry, rmode);
1114 void Assembler::call(CodeStub* stub) {
1115 EnsureSpace ensure_space(
this);
1118 RequestHeapObject(HeapObjectRequest(stub));
1119 RecordRelocInfo(RelocInfo::CODE_TARGET);
1120 int code_target_index = AddCodeTarget(Handle<Code>());
1121 emitl(code_target_index);
1124 void Assembler::call(Handle<Code> target, RelocInfo::Mode rmode) {
1125 DCHECK(RelocInfo::IsCodeTarget(rmode));
1126 EnsureSpace ensure_space(
this);
1129 RecordRelocInfo(rmode);
1130 int code_target_index = AddCodeTarget(target);
1131 emitl(code_target_index);
1134 void Assembler::near_call(Address addr, RelocInfo::Mode rmode) {
1135 EnsureSpace ensure_space(
this);
1137 intptr_t value =
static_cast<intptr_t
>(addr);
1138 DCHECK(is_int32(value));
1139 RecordRelocInfo(rmode);
1140 emitl(static_cast<int32_t>(value));
1143 void Assembler::near_jmp(Address addr, RelocInfo::Mode rmode) {
1144 EnsureSpace ensure_space(
this);
1146 intptr_t value =
static_cast<intptr_t
>(addr);
1147 DCHECK(is_int32(value));
1148 RecordRelocInfo(rmode);
1149 emitl(static_cast<int32_t>(value));
1152 void Assembler::call(Register adr) {
1153 EnsureSpace ensure_space(
this);
1155 emit_optional_rex_32(adr);
1157 emit_modrm(0x2, adr);
1160 void Assembler::call(Operand op) {
1161 EnsureSpace ensure_space(
this);
1163 emit_optional_rex_32(op);
1165 emit_operand(0x2, op);
1173 void Assembler::call(Address target) {
1174 EnsureSpace ensure_space(
this);
1177 Address source =
reinterpret_cast<Address
>(pc_) + 4;
1178 intptr_t displacement = target - source;
1179 DCHECK(is_int32(displacement));
1180 emitl(static_cast<int32_t>(displacement));
1184 void Assembler::clc() {
1185 EnsureSpace ensure_space(
this);
1190 void Assembler::cld() {
1191 EnsureSpace ensure_space(
this);
1195 void Assembler::cdq() {
1196 EnsureSpace ensure_space(
this);
1201 void Assembler::cmovq(Condition cc, Register dst, Register src) {
1204 }
else if (cc == never) {
1210 EnsureSpace ensure_space(
this);
1212 emit_rex_64(dst, src);
1215 emit_modrm(dst, src);
1218 void Assembler::cmovq(Condition cc, Register dst, Operand src) {
1221 }
else if (cc == never) {
1225 EnsureSpace ensure_space(
this);
1227 emit_rex_64(dst, src);
1230 emit_operand(dst, src);
1234 void Assembler::cmovl(Condition cc, Register dst, Register src) {
1237 }
else if (cc == never) {
1241 EnsureSpace ensure_space(
this);
1243 emit_optional_rex_32(dst, src);
1246 emit_modrm(dst, src);
1249 void Assembler::cmovl(Condition cc, Register dst, Operand src) {
1252 }
else if (cc == never) {
1256 EnsureSpace ensure_space(
this);
1258 emit_optional_rex_32(dst, src);
1261 emit_operand(dst, src);
1265 void Assembler::cmpb_al(Immediate imm8) {
1266 DCHECK(is_int8(imm8.value_) || is_uint8(imm8.value_));
1267 EnsureSpace ensure_space(
this);
1272 void Assembler::lock() {
1273 EnsureSpace ensure_space(
this);
1277 void Assembler::cmpxchgb(Operand dst, Register src) {
1278 EnsureSpace ensure_space(
this);
1279 if (!src.is_byte_register()) {
1281 emit_rex_32(src, dst);
1283 emit_optional_rex_32(src, dst);
1287 emit_operand(src, dst);
1290 void Assembler::cmpxchgw(Operand dst, Register src) {
1291 EnsureSpace ensure_space(
this);
1293 emit_optional_rex_32(src, dst);
1296 emit_operand(src, dst);
1299 void Assembler::emit_cmpxchg(Operand dst, Register src,
int size) {
1300 EnsureSpace ensure_space(
this);
1301 emit_rex(src, dst, size);
1304 emit_operand(src, dst);
1307 void Assembler::lfence() {
1308 EnsureSpace ensure_space(
this);
1314 void Assembler::cpuid() {
1315 EnsureSpace ensure_space(
this);
1321 void Assembler::cqo() {
1322 EnsureSpace ensure_space(
this);
1328 void Assembler::emit_dec(Register dst,
int size) {
1329 EnsureSpace ensure_space(
this);
1330 emit_rex(dst, size);
1332 emit_modrm(0x1, dst);
1335 void Assembler::emit_dec(Operand dst,
int size) {
1336 EnsureSpace ensure_space(
this);
1337 emit_rex(dst, size);
1339 emit_operand(1, dst);
1343 void Assembler::decb(Register dst) {
1344 EnsureSpace ensure_space(
this);
1345 if (!dst.is_byte_register()) {
1350 emit_modrm(0x1, dst);
1353 void Assembler::decb(Operand dst) {
1354 EnsureSpace ensure_space(
this);
1355 emit_optional_rex_32(dst);
1357 emit_operand(1, dst);
1361 void Assembler::enter(Immediate size) {
1362 EnsureSpace ensure_space(
this);
1369 void Assembler::hlt() {
1370 EnsureSpace ensure_space(
this);
1375 void Assembler::emit_idiv(Register src,
int size) {
1376 EnsureSpace ensure_space(
this);
1377 emit_rex(src, size);
1379 emit_modrm(0x7, src);
1383 void Assembler::emit_div(Register src,
int size) {
1384 EnsureSpace ensure_space(
this);
1385 emit_rex(src, size);
1387 emit_modrm(0x6, src);
1391 void Assembler::emit_imul(Register src,
int size) {
1392 EnsureSpace ensure_space(
this);
1393 emit_rex(src, size);
1395 emit_modrm(0x5, src);
1398 void Assembler::emit_imul(Operand src,
int size) {
1399 EnsureSpace ensure_space(
this);
1400 emit_rex(src, size);
1402 emit_operand(0x5, src);
1406 void Assembler::emit_imul(Register dst, Register src,
int size) {
1407 EnsureSpace ensure_space(
this);
1408 emit_rex(dst, src, size);
1411 emit_modrm(dst, src);
1414 void Assembler::emit_imul(Register dst, Operand src,
int size) {
1415 EnsureSpace ensure_space(
this);
1416 emit_rex(dst, src, size);
1419 emit_operand(dst, src);
1423 void Assembler::emit_imul(Register dst, Register src, Immediate imm,
int size) {
1424 EnsureSpace ensure_space(
this);
1425 emit_rex(dst, src, size);
1426 if (is_int8(imm.value_)) {
1428 emit_modrm(dst, src);
1432 emit_modrm(dst, src);
1437 void Assembler::emit_imul(Register dst, Operand src, Immediate imm,
int size) {
1438 EnsureSpace ensure_space(
this);
1439 emit_rex(dst, src, size);
1440 if (is_int8(imm.value_)) {
1442 emit_operand(dst, src);
1446 emit_operand(dst, src);
1452 void Assembler::emit_inc(Register dst,
int size) {
1453 EnsureSpace ensure_space(
this);
1454 emit_rex(dst, size);
1456 emit_modrm(0x0, dst);
1459 void Assembler::emit_inc(Operand dst,
int size) {
1460 EnsureSpace ensure_space(
this);
1461 emit_rex(dst, size);
1463 emit_operand(0, dst);
1467 void Assembler::int3() {
1468 EnsureSpace ensure_space(
this);
1473 void Assembler::j(Condition cc, Label* L, Label::Distance distance) {
1477 }
else if (cc == never) {
1480 EnsureSpace ensure_space(
this);
1481 DCHECK(is_uint4(cc));
1482 if (L->is_bound()) {
1483 const int short_size = 2;
1484 const int long_size = 6;
1485 int offs = L->pos() - pc_offset();
1496 if (is_int8(offs - short_size) && !predictable_code_size()) {
1499 emit((offs - short_size) & 0xFF);
1504 emitl(offs - long_size);
1506 }
else if (distance == Label::kNear) {
1510 if (L->is_near_linked()) {
1511 int offset = L->near_link_pos() - pc_offset();
1512 DCHECK(is_int8(offset));
1513 disp =
static_cast<byte
>(offset & 0xFF);
1515 L->link_to(pc_offset(), Label::kNear);
1518 auto jump_opt = jump_optimization_info();
1519 if (V8_UNLIKELY(jump_opt)) {
1520 if (jump_opt->is_optimizing() && is_optimizable_farjmp(farjmp_num_++)) {
1523 record_farjmp_position(L, pc_offset());
1527 if (jump_opt->is_collecting()) {
1528 farjmp_positions_.push_back(pc_offset() + 2);
1531 if (L->is_linked()) {
1536 L->link_to(pc_offset() -
sizeof(int32_t));
1538 DCHECK(L->is_unused());
1541 int32_t current = pc_offset();
1543 L->link_to(current);
1549 void Assembler::j(Condition cc, Address entry, RelocInfo::Mode rmode) {
1550 DCHECK(RelocInfo::IsRuntimeEntry(rmode));
1551 EnsureSpace ensure_space(
this);
1552 DCHECK(is_uint4(cc));
1555 emit_runtime_entry(entry, rmode);
1559 void Assembler::j(Condition cc,
1560 Handle<Code> target,
1561 RelocInfo::Mode rmode) {
1565 }
else if (cc == never) {
1568 EnsureSpace ensure_space(
this);
1569 DCHECK(is_uint4(cc));
1573 DCHECK(RelocInfo::IsCodeTarget(rmode));
1574 RecordRelocInfo(rmode);
1575 int code_target_index = AddCodeTarget(target);
1576 emitl(code_target_index);
1580 void Assembler::jmp(Label* L, Label::Distance distance) {
1581 EnsureSpace ensure_space(
this);
1582 const int short_size =
sizeof(int8_t);
1583 const int long_size =
sizeof(int32_t);
1584 if (L->is_bound()) {
1585 int offs = L->pos() - pc_offset() - 1;
1587 if (is_int8(offs - short_size) && !predictable_code_size()) {
1590 emit((offs - short_size) & 0xFF);
1594 emitl(offs - long_size);
1596 }
else if (distance == Label::kNear) {
1599 if (L->is_near_linked()) {
1600 int offset = L->near_link_pos() - pc_offset();
1601 DCHECK(is_int8(offset));
1602 disp =
static_cast<byte
>(offset & 0xFF);
1604 L->link_to(pc_offset(), Label::kNear);
1607 auto jump_opt = jump_optimization_info();
1608 if (V8_UNLIKELY(jump_opt)) {
1609 if (jump_opt->is_optimizing() && is_optimizable_farjmp(farjmp_num_++)) {
1611 record_farjmp_position(L, pc_offset());
1615 if (jump_opt->is_collecting()) {
1616 farjmp_positions_.push_back(pc_offset() + 1);
1619 if (L->is_linked()) {
1623 L->link_to(pc_offset() - long_size);
1626 DCHECK(L->is_unused());
1628 int32_t current = pc_offset();
1630 L->link_to(current);
1636 void Assembler::jmp(Handle<Code> target, RelocInfo::Mode rmode) {
1637 DCHECK(RelocInfo::IsCodeTarget(rmode));
1638 EnsureSpace ensure_space(
this);
1641 RecordRelocInfo(rmode);
1642 int code_target_index = AddCodeTarget(target);
1643 emitl(code_target_index);
1647 void Assembler::jmp(Register target) {
1648 EnsureSpace ensure_space(
this);
1650 emit_optional_rex_32(target);
1652 emit_modrm(0x4, target);
1655 void Assembler::jmp(Operand src) {
1656 EnsureSpace ensure_space(
this);
1658 emit_optional_rex_32(src);
1660 emit_operand(0x4, src);
1663 void Assembler::emit_lea(Register dst, Operand src,
int size) {
1664 EnsureSpace ensure_space(
this);
1665 emit_rex(dst, src, size);
1667 emit_operand(dst, src);
1670 void Assembler::load_rax(Address value, RelocInfo::Mode mode) {
1671 EnsureSpace ensure_space(
this);
1672 if (kPointerSize == kInt64Size) {
1677 DCHECK_EQ(kPointerSize, kInt32Size);
1688 void Assembler::load_rax(ExternalReference ref) {
1689 load_rax(ref.address(), RelocInfo::EXTERNAL_REFERENCE);
1693 void Assembler::leave() {
1694 EnsureSpace ensure_space(
this);
1698 void Assembler::movb(Register dst, Operand src) {
1699 EnsureSpace ensure_space(
this);
1700 if (!dst.is_byte_register()) {
1702 emit_rex_32(dst, src);
1704 emit_optional_rex_32(dst, src);
1707 emit_operand(dst, src);
1711 void Assembler::movb(Register dst, Immediate imm) {
1712 EnsureSpace ensure_space(
this);
1713 if (!dst.is_byte_register()) {
1717 emit(0xB0 + dst.low_bits());
1721 void Assembler::movb(Operand dst, Register src) {
1722 EnsureSpace ensure_space(
this);
1723 if (!src.is_byte_register()) {
1725 emit_rex_32(src, dst);
1727 emit_optional_rex_32(src, dst);
1730 emit_operand(src, dst);
1733 void Assembler::movb(Operand dst, Immediate imm) {
1734 EnsureSpace ensure_space(
this);
1735 emit_optional_rex_32(dst);
1737 emit_operand(0x0, dst);
1738 emit(static_cast<byte>(imm.value_));
1741 void Assembler::movw(Register dst, Operand src) {
1742 EnsureSpace ensure_space(
this);
1744 emit_optional_rex_32(dst, src);
1746 emit_operand(dst, src);
1749 void Assembler::movw(Operand dst, Register src) {
1750 EnsureSpace ensure_space(
this);
1752 emit_optional_rex_32(src, dst);
1754 emit_operand(src, dst);
1757 void Assembler::movw(Operand dst, Immediate imm) {
1758 EnsureSpace ensure_space(
this);
1760 emit_optional_rex_32(dst);
1762 emit_operand(0x0, dst);
1763 emit(static_cast<byte>(imm.value_ & 0xFF));
1764 emit(static_cast<byte>(imm.value_ >> 8));
1767 void Assembler::emit_mov(Register dst, Operand src,
int size) {
1768 EnsureSpace ensure_space(
this);
1769 emit_rex(dst, src, size);
1771 emit_operand(dst, src);
1775 void Assembler::emit_mov(Register dst, Register src,
int size) {
1776 EnsureSpace ensure_space(
this);
1777 if (src.low_bits() == 4) {
1778 emit_rex(src, dst, size);
1780 emit_modrm(src, dst);
1782 emit_rex(dst, src, size);
1784 emit_modrm(dst, src);
1788 void Assembler::emit_mov(Operand dst, Register src,
int size) {
1789 EnsureSpace ensure_space(
this);
1790 emit_rex(src, dst, size);
1792 emit_operand(src, dst);
1796 void Assembler::emit_mov(Register dst, Immediate value,
int size) {
1797 EnsureSpace ensure_space(
this);
1798 emit_rex(dst, size);
1799 if (size == kInt64Size) {
1801 emit_modrm(0x0, dst);
1803 DCHECK_EQ(size, kInt32Size);
1804 emit(0xB8 + dst.low_bits());
1809 void Assembler::emit_mov(Operand dst, Immediate value,
int size) {
1810 EnsureSpace ensure_space(
this);
1811 emit_rex(dst, size);
1813 emit_operand(0x0, dst);
1817 void Assembler::movp(Register dst, Address value, RelocInfo::Mode rmode) {
1818 if (constpool_.TryRecordEntry(value, rmode)) {
1821 emit_mov(dst, Operand(&label, 0), kPointerSize);
1824 EnsureSpace ensure_space(
this);
1825 emit_rex(dst, kPointerSize);
1826 emit(0xB8 | dst.low_bits());
1827 emitp(value, rmode);
1831 void Assembler::movp_heap_number(Register dst,
double value) {
1832 EnsureSpace ensure_space(
this);
1833 emit_rex(dst, kPointerSize);
1834 emit(0xB8 | dst.low_bits());
1835 RequestHeapObject(HeapObjectRequest(value));
1836 emitp(0, RelocInfo::EMBEDDED_OBJECT);
1839 void Assembler::movp_string(Register dst,
const StringConstantBase* str) {
1840 EnsureSpace ensure_space(
this);
1841 emit_rex(dst, kPointerSize);
1842 emit(0xB8 | dst.low_bits());
1843 RequestHeapObject(HeapObjectRequest(str));
1844 emitp(0, RelocInfo::EMBEDDED_OBJECT);
1847 void Assembler::movq(Register dst,
int64_t value, RelocInfo::Mode rmode) {
1848 if (constpool_.TryRecordEntry(value, rmode)) {
1851 emit_mov(dst, Operand(&label, 0), kPointerSize);
1854 EnsureSpace ensure_space(
this);
1856 emit(0xB8 | dst.low_bits());
1857 if (!RelocInfo::IsNone(rmode)) {
1858 RecordRelocInfo(rmode, value);
1864 void Assembler::movq(Register dst, uint64_t value, RelocInfo::Mode rmode) {
1865 movq(dst, static_cast<int64_t>(value), rmode);
1870 void Assembler::movl(Operand dst, Label* src) {
1871 EnsureSpace ensure_space(
this);
1872 emit_optional_rex_32(dst);
1874 emit_operand(0, dst);
1875 if (src->is_bound()) {
1876 int offset = src->pos() - pc_offset() -
sizeof(int32_t);
1877 DCHECK_LE(offset, 0);
1879 }
else if (src->is_linked()) {
1881 src->link_to(pc_offset() -
sizeof(int32_t));
1883 DCHECK(src->is_unused());
1884 int32_t current = pc_offset();
1886 src->link_to(current);
1891 void Assembler::movsxbl(Register dst, Register src) {
1892 EnsureSpace ensure_space(
this);
1893 if (!src.is_byte_register()) {
1895 emit_rex_32(dst, src);
1897 emit_optional_rex_32(dst, src);
1901 emit_modrm(dst, src);
1904 void Assembler::movsxbl(Register dst, Operand src) {
1905 EnsureSpace ensure_space(
this);
1906 emit_optional_rex_32(dst, src);
1909 emit_operand(dst, src);
1912 void Assembler::movsxbq(Register dst, Operand src) {
1913 EnsureSpace ensure_space(
this);
1914 emit_rex_64(dst, src);
1917 emit_operand(dst, src);
1920 void Assembler::movsxbq(Register dst, Register src) {
1921 EnsureSpace ensure_space(
this);
1922 emit_rex_64(dst, src);
1925 emit_modrm(dst, src);
1928 void Assembler::movsxwl(Register dst, Register src) {
1929 EnsureSpace ensure_space(
this);
1930 emit_optional_rex_32(dst, src);
1933 emit_modrm(dst, src);
1936 void Assembler::movsxwl(Register dst, Operand src) {
1937 EnsureSpace ensure_space(
this);
1938 emit_optional_rex_32(dst, src);
1941 emit_operand(dst, src);
1944 void Assembler::movsxwq(Register dst, Operand src) {
1945 EnsureSpace ensure_space(
this);
1946 emit_rex_64(dst, src);
1949 emit_operand(dst, src);
1952 void Assembler::movsxwq(Register dst, Register src) {
1953 EnsureSpace ensure_space(
this);
1954 emit_rex_64(dst, src);
1957 emit_modrm(dst, src);
1960 void Assembler::movsxlq(Register dst, Register src) {
1961 EnsureSpace ensure_space(
this);
1962 emit_rex_64(dst, src);
1964 emit_modrm(dst, src);
1967 void Assembler::movsxlq(Register dst, Operand src) {
1968 EnsureSpace ensure_space(
this);
1969 emit_rex_64(dst, src);
1971 emit_operand(dst, src);
1974 void Assembler::emit_movzxb(Register dst, Operand src,
int size) {
1975 EnsureSpace ensure_space(
this);
1978 emit_optional_rex_32(dst, src);
1981 emit_operand(dst, src);
1985 void Assembler::emit_movzxb(Register dst, Register src,
int size) {
1986 EnsureSpace ensure_space(
this);
1989 if (!src.is_byte_register()) {
1991 emit_rex_32(dst, src);
1993 emit_optional_rex_32(dst, src);
1997 emit_modrm(dst, src);
2000 void Assembler::emit_movzxw(Register dst, Operand src,
int size) {
2001 EnsureSpace ensure_space(
this);
2004 emit_optional_rex_32(dst, src);
2007 emit_operand(dst, src);
2011 void Assembler::emit_movzxw(Register dst, Register src,
int size) {
2012 EnsureSpace ensure_space(
this);
2015 emit_optional_rex_32(dst, src);
2018 emit_modrm(dst, src);
2022 void Assembler::repmovsb() {
2023 EnsureSpace ensure_space(
this);
2029 void Assembler::repmovsw() {
2030 EnsureSpace ensure_space(
this);
2037 void Assembler::emit_repmovs(
int size) {
2038 EnsureSpace ensure_space(
this);
2045 void Assembler::mull(Register src) {
2046 EnsureSpace ensure_space(
this);
2047 emit_optional_rex_32(src);
2049 emit_modrm(0x4, src);
2052 void Assembler::mull(Operand src) {
2053 EnsureSpace ensure_space(
this);
2054 emit_optional_rex_32(src);
2056 emit_operand(0x4, src);
2060 void Assembler::mulq(Register src) {
2061 EnsureSpace ensure_space(
this);
2064 emit_modrm(0x4, src);
2068 void Assembler::emit_neg(Register dst,
int size) {
2069 EnsureSpace ensure_space(
this);
2070 emit_rex(dst, size);
2072 emit_modrm(0x3, dst);
2075 void Assembler::emit_neg(Operand dst,
int size) {
2076 EnsureSpace ensure_space(
this);
2079 emit_operand(3, dst);
2083 void Assembler::nop() {
2084 EnsureSpace ensure_space(
this);
2089 void Assembler::emit_not(Register dst,
int size) {
2090 EnsureSpace ensure_space(
this);
2091 emit_rex(dst, size);
2093 emit_modrm(0x2, dst);
2096 void Assembler::emit_not(Operand dst,
int size) {
2097 EnsureSpace ensure_space(
this);
2098 emit_rex(dst, size);
2100 emit_operand(2, dst);
2104 void Assembler::Nop(
int n) {
2119 EnsureSpace ensure_space(
this);
2186 void Assembler::popq(Register dst) {
2187 EnsureSpace ensure_space(
this);
2188 emit_optional_rex_32(dst);
2189 emit(0x58 | dst.low_bits());
2192 void Assembler::popq(Operand dst) {
2193 EnsureSpace ensure_space(
this);
2194 emit_optional_rex_32(dst);
2196 emit_operand(0, dst);
2200 void Assembler::popfq() {
2201 EnsureSpace ensure_space(
this);
2206 void Assembler::pushq(Register src) {
2207 EnsureSpace ensure_space(
this);
2208 emit_optional_rex_32(src);
2209 emit(0x50 | src.low_bits());
2212 void Assembler::pushq(Operand src) {
2213 EnsureSpace ensure_space(
this);
2214 emit_optional_rex_32(src);
2216 emit_operand(6, src);
2220 void Assembler::pushq(Immediate value) {
2221 EnsureSpace ensure_space(
this);
2222 if (is_int8(value.value_)) {
2227 emitl(value.value_);
2232 void Assembler::pushq_imm32(int32_t imm32) {
2233 EnsureSpace ensure_space(
this);
2239 void Assembler::pushfq() {
2240 EnsureSpace ensure_space(
this);
2245 void Assembler::ret(
int imm16) {
2246 EnsureSpace ensure_space(
this);
2247 DCHECK(is_uint16(imm16));
2253 emit((imm16 >> 8) & 0xFF);
2258 void Assembler::ud2() {
2259 EnsureSpace ensure_space(
this);
2265 void Assembler::setcc(Condition cc, Register reg) {
2266 if (cc > last_condition) {
2267 movb(reg, Immediate(cc == always ? 1 : 0));
2270 EnsureSpace ensure_space(
this);
2271 DCHECK(is_uint4(cc));
2272 if (!reg.is_byte_register()) {
2278 emit_modrm(0x0, reg);
2282 void Assembler::shld(Register dst, Register src) {
2283 EnsureSpace ensure_space(
this);
2284 emit_rex_64(src, dst);
2287 emit_modrm(src, dst);
2291 void Assembler::shrd(Register dst, Register src) {
2292 EnsureSpace ensure_space(
this);
2293 emit_rex_64(src, dst);
2296 emit_modrm(src, dst);
2299 void Assembler::xchgb(Register reg, Operand op) {
2300 EnsureSpace ensure_space(
this);
2301 if (!reg.is_byte_register()) {
2303 emit_rex_32(reg, op);
2305 emit_optional_rex_32(reg, op);
2308 emit_operand(reg, op);
2311 void Assembler::xchgw(Register reg, Operand op) {
2312 EnsureSpace ensure_space(
this);
2314 emit_optional_rex_32(reg, op);
2316 emit_operand(reg, op);
2319 void Assembler::emit_xchg(Register dst, Register src,
int size) {
2320 EnsureSpace ensure_space(
this);
2321 if (src == rax || dst == rax) {
2322 Register other = src == rax ? dst : src;
2323 emit_rex(other, size);
2324 emit(0x90 | other.low_bits());
2325 }
else if (dst.low_bits() == 4) {
2326 emit_rex(dst, src, size);
2328 emit_modrm(dst, src);
2330 emit_rex(src, dst, size);
2332 emit_modrm(src, dst);
2336 void Assembler::emit_xchg(Register dst, Operand src,
int size) {
2337 EnsureSpace ensure_space(
this);
2338 emit_rex(dst, src, size);
2340 emit_operand(dst, src);
2343 void Assembler::store_rax(Address dst, RelocInfo::Mode mode) {
2344 EnsureSpace ensure_space(
this);
2345 if (kPointerSize == kInt64Size) {
2350 DCHECK_EQ(kPointerSize, kInt32Size);
2361 void Assembler::store_rax(ExternalReference ref) {
2362 store_rax(ref.address(), RelocInfo::EXTERNAL_REFERENCE);
2365 void Assembler::sub_sp_32(
uint32_t imm) {
2368 emit_modrm(0x5, rsp);
2372 void Assembler::testb(Register dst, Register src) {
2373 EnsureSpace ensure_space(
this);
2374 emit_test(dst, src,
sizeof(int8_t));
2377 void Assembler::testb(Register reg, Immediate mask) {
2378 DCHECK(is_int8(mask.value_) || is_uint8(mask.value_));
2379 emit_test(reg, mask,
sizeof(int8_t));
2382 void Assembler::testb(Operand op, Immediate mask) {
2383 DCHECK(is_int8(mask.value_) || is_uint8(mask.value_));
2384 emit_test(op, mask,
sizeof(int8_t));
2387 void Assembler::testb(Operand op, Register reg) {
2388 emit_test(op, reg,
sizeof(int8_t));
2391 void Assembler::testw(Register dst, Register src) {
2392 emit_test(dst, src,
sizeof(uint16_t));
2395 void Assembler::testw(Register reg, Immediate mask) {
2396 emit_test(reg, mask,
sizeof(int16_t));
2399 void Assembler::testw(Operand op, Immediate mask) {
2400 emit_test(op, mask,
sizeof(int16_t));
2403 void Assembler::testw(Operand op, Register reg) {
2404 emit_test(op, reg,
sizeof(int16_t));
2407 void Assembler::emit_test(Register dst, Register src,
int size) {
2408 EnsureSpace ensure_space(
this);
2409 if (src.low_bits() == 4) std::swap(dst, src);
2410 if (size ==
sizeof(int16_t)) {
2412 size =
sizeof(int32_t);
2414 bool byte_operand = size ==
sizeof(int8_t);
2416 size =
sizeof(int32_t);
2417 if (!src.is_byte_register() || !dst.is_byte_register()) {
2418 emit_rex_32(dst, src);
2421 emit_rex(dst, src, size);
2423 emit(byte_operand ? 0x84 : 0x85);
2424 emit_modrm(dst, src);
2428 void Assembler::emit_test(Register reg, Immediate mask,
int size) {
2429 if (is_uint8(mask.value_)) {
2430 size =
sizeof(int8_t);
2431 }
else if (is_uint16(mask.value_)) {
2432 size =
sizeof(int16_t);
2434 EnsureSpace ensure_space(
this);
2435 bool half_word = size ==
sizeof(int16_t);
2438 size =
sizeof(int32_t);
2440 bool byte_operand = size ==
sizeof(int8_t);
2442 size =
sizeof(int32_t);
2443 if (!reg.is_byte_register()) emit_rex_32(reg);
2445 emit_rex(reg, size);
2448 emit(byte_operand ? 0xA8 : 0xA9);
2450 emit(byte_operand ? 0xF6 : 0xF7);
2451 emit_modrm(0x0, reg);
2455 }
else if (half_word) {
2462 void Assembler::emit_test(Operand op, Immediate mask,
int size) {
2463 if (is_uint8(mask.value_)) {
2464 size =
sizeof(int8_t);
2465 }
else if (is_uint16(mask.value_)) {
2466 size =
sizeof(int16_t);
2468 EnsureSpace ensure_space(
this);
2469 bool half_word = size ==
sizeof(int16_t);
2472 size =
sizeof(int32_t);
2474 bool byte_operand = size ==
sizeof(int8_t);
2476 size =
sizeof(int32_t);
2478 emit_rex(rax, op, size);
2479 emit(byte_operand ? 0xF6 : 0xF7);
2480 emit_operand(rax, op);
2483 }
else if (half_word) {
2490 void Assembler::emit_test(Operand op, Register reg,
int size) {
2491 EnsureSpace ensure_space(
this);
2492 if (size ==
sizeof(int16_t)) {
2494 size =
sizeof(int32_t);
2496 bool byte_operand = size ==
sizeof(int8_t);
2498 size =
sizeof(int32_t);
2499 if (!reg.is_byte_register()) {
2501 emit_rex_32(reg, op);
2503 emit_optional_rex_32(reg, op);
2506 emit_rex(reg, op, size);
2508 emit(byte_operand ? 0x84 : 0x85);
2509 emit_operand(reg, op);
2516 void Assembler::fld(
int i) {
2517 EnsureSpace ensure_space(
this);
2518 emit_farith(0xD9, 0xC0,
i);
2522 void Assembler::fld1() {
2523 EnsureSpace ensure_space(
this);
2529 void Assembler::fldz() {
2530 EnsureSpace ensure_space(
this);
2536 void Assembler::fldpi() {
2537 EnsureSpace ensure_space(
this);
2543 void Assembler::fldln2() {
2544 EnsureSpace ensure_space(
this);
2549 void Assembler::fld_s(Operand adr) {
2550 EnsureSpace ensure_space(
this);
2551 emit_optional_rex_32(adr);
2553 emit_operand(0, adr);
2556 void Assembler::fld_d(Operand adr) {
2557 EnsureSpace ensure_space(
this);
2558 emit_optional_rex_32(adr);
2560 emit_operand(0, adr);
2563 void Assembler::fstp_s(Operand adr) {
2564 EnsureSpace ensure_space(
this);
2565 emit_optional_rex_32(adr);
2567 emit_operand(3, adr);
2570 void Assembler::fstp_d(Operand adr) {
2571 EnsureSpace ensure_space(
this);
2572 emit_optional_rex_32(adr);
2574 emit_operand(3, adr);
2578 void Assembler::fstp(
int index) {
2579 DCHECK(is_uint3(index));
2580 EnsureSpace ensure_space(
this);
2581 emit_farith(0xDD, 0xD8, index);
2584 void Assembler::fild_s(Operand adr) {
2585 EnsureSpace ensure_space(
this);
2586 emit_optional_rex_32(adr);
2588 emit_operand(0, adr);
2591 void Assembler::fild_d(Operand adr) {
2592 EnsureSpace ensure_space(
this);
2593 emit_optional_rex_32(adr);
2595 emit_operand(5, adr);
2598 void Assembler::fistp_s(Operand adr) {
2599 EnsureSpace ensure_space(
this);
2600 emit_optional_rex_32(adr);
2602 emit_operand(3, adr);
2605 void Assembler::fisttp_s(Operand adr) {
2606 DCHECK(IsEnabled(SSE3));
2607 EnsureSpace ensure_space(
this);
2608 emit_optional_rex_32(adr);
2610 emit_operand(1, adr);
2613 void Assembler::fisttp_d(Operand adr) {
2614 DCHECK(IsEnabled(SSE3));
2615 EnsureSpace ensure_space(
this);
2616 emit_optional_rex_32(adr);
2618 emit_operand(1, adr);
2621 void Assembler::fist_s(Operand adr) {
2622 EnsureSpace ensure_space(
this);
2623 emit_optional_rex_32(adr);
2625 emit_operand(2, adr);
2628 void Assembler::fistp_d(Operand adr) {
2629 EnsureSpace ensure_space(
this);
2630 emit_optional_rex_32(adr);
2632 emit_operand(7, adr);
2636 void Assembler::fabs() {
2637 EnsureSpace ensure_space(
this);
2643 void Assembler::fchs() {
2644 EnsureSpace ensure_space(
this);
2650 void Assembler::fcos() {
2651 EnsureSpace ensure_space(
this);
2657 void Assembler::fsin() {
2658 EnsureSpace ensure_space(
this);
2664 void Assembler::fptan() {
2665 EnsureSpace ensure_space(
this);
2671 void Assembler::fyl2x() {
2672 EnsureSpace ensure_space(
this);
2678 void Assembler::f2xm1() {
2679 EnsureSpace ensure_space(
this);
2685 void Assembler::fscale() {
2686 EnsureSpace ensure_space(
this);
2692 void Assembler::fninit() {
2693 EnsureSpace ensure_space(
this);
2699 void Assembler::fadd(
int i) {
2700 EnsureSpace ensure_space(
this);
2701 emit_farith(0xDC, 0xC0,
i);
2705 void Assembler::fsub(
int i) {
2706 EnsureSpace ensure_space(
this);
2707 emit_farith(0xDC, 0xE8,
i);
2710 void Assembler::fisub_s(Operand adr) {
2711 EnsureSpace ensure_space(
this);
2712 emit_optional_rex_32(adr);
2714 emit_operand(4, adr);
2718 void Assembler::fmul(
int i) {
2719 EnsureSpace ensure_space(
this);
2720 emit_farith(0xDC, 0xC8,
i);
2724 void Assembler::fdiv(
int i) {
2725 EnsureSpace ensure_space(
this);
2726 emit_farith(0xDC, 0xF8,
i);
2730 void Assembler::faddp(
int i) {
2731 EnsureSpace ensure_space(
this);
2732 emit_farith(0xDE, 0xC0,
i);
2736 void Assembler::fsubp(
int i) {
2737 EnsureSpace ensure_space(
this);
2738 emit_farith(0xDE, 0xE8,
i);
2742 void Assembler::fsubrp(
int i) {
2743 EnsureSpace ensure_space(
this);
2744 emit_farith(0xDE, 0xE0,
i);
2748 void Assembler::fmulp(
int i) {
2749 EnsureSpace ensure_space(
this);
2750 emit_farith(0xDE, 0xC8,
i);
2754 void Assembler::fdivp(
int i) {
2755 EnsureSpace ensure_space(
this);
2756 emit_farith(0xDE, 0xF8,
i);
2760 void Assembler::fprem() {
2761 EnsureSpace ensure_space(
this);
2767 void Assembler::fprem1() {
2768 EnsureSpace ensure_space(
this);
2774 void Assembler::fxch(
int i) {
2775 EnsureSpace ensure_space(
this);
2776 emit_farith(0xD9, 0xC8,
i);
2780 void Assembler::fincstp() {
2781 EnsureSpace ensure_space(
this);
2787 void Assembler::ffree(
int i) {
2788 EnsureSpace ensure_space(
this);
2789 emit_farith(0xDD, 0xC0,
i);
2793 void Assembler::ftst() {
2794 EnsureSpace ensure_space(
this);
2800 void Assembler::fucomp(
int i) {
2801 EnsureSpace ensure_space(
this);
2802 emit_farith(0xDD, 0xE8,
i);
2806 void Assembler::fucompp() {
2807 EnsureSpace ensure_space(
this);
2813 void Assembler::fucomi(
int i) {
2814 EnsureSpace ensure_space(
this);
2820 void Assembler::fucomip() {
2821 EnsureSpace ensure_space(
this);
2827 void Assembler::fcompp() {
2828 EnsureSpace ensure_space(
this);
2834 void Assembler::fnstsw_ax() {
2835 EnsureSpace ensure_space(
this);
2841 void Assembler::fwait() {
2842 EnsureSpace ensure_space(
this);
2847 void Assembler::frndint() {
2848 EnsureSpace ensure_space(
this);
2854 void Assembler::fnclex() {
2855 EnsureSpace ensure_space(
this);
2861 void Assembler::sahf() {
2864 DCHECK(IsEnabled(SAHF));
2865 EnsureSpace ensure_space(
this);
2870 void Assembler::emit_farith(
int b1,
int b2,
int i) {
2871 DCHECK(is_uint8(b1) && is_uint8(b2));
2872 DCHECK(is_uint3(
i));
2880 void Assembler::andps(XMMRegister dst, XMMRegister src) {
2881 EnsureSpace ensure_space(
this);
2882 emit_optional_rex_32(dst, src);
2885 emit_sse_operand(dst, src);
2888 void Assembler::andps(XMMRegister dst, Operand src) {
2889 EnsureSpace ensure_space(
this);
2890 emit_optional_rex_32(dst, src);
2893 emit_sse_operand(dst, src);
2897 void Assembler::orps(XMMRegister dst, XMMRegister src) {
2898 EnsureSpace ensure_space(
this);
2899 emit_optional_rex_32(dst, src);
2902 emit_sse_operand(dst, src);
2905 void Assembler::orps(XMMRegister dst, Operand src) {
2906 EnsureSpace ensure_space(
this);
2907 emit_optional_rex_32(dst, src);
2910 emit_sse_operand(dst, src);
2914 void Assembler::xorps(XMMRegister dst, XMMRegister src) {
2915 DCHECK(!IsEnabled(AVX));
2916 EnsureSpace ensure_space(
this);
2917 emit_optional_rex_32(dst, src);
2920 emit_sse_operand(dst, src);
2923 void Assembler::xorps(XMMRegister dst, Operand src) {
2924 DCHECK(!IsEnabled(AVX));
2925 EnsureSpace ensure_space(
this);
2926 emit_optional_rex_32(dst, src);
2929 emit_sse_operand(dst, src);
2933 void Assembler::addps(XMMRegister dst, XMMRegister src) {
2934 EnsureSpace ensure_space(
this);
2935 emit_optional_rex_32(dst, src);
2938 emit_sse_operand(dst, src);
2941 void Assembler::addps(XMMRegister dst, Operand src) {
2942 EnsureSpace ensure_space(
this);
2943 emit_optional_rex_32(dst, src);
2946 emit_sse_operand(dst, src);
2950 void Assembler::subps(XMMRegister dst, XMMRegister src) {
2951 EnsureSpace ensure_space(
this);
2952 emit_optional_rex_32(dst, src);
2955 emit_sse_operand(dst, src);
2958 void Assembler::subps(XMMRegister dst, Operand src) {
2959 EnsureSpace ensure_space(
this);
2960 emit_optional_rex_32(dst, src);
2963 emit_sse_operand(dst, src);
2967 void Assembler::mulps(XMMRegister dst, XMMRegister src) {
2968 EnsureSpace ensure_space(
this);
2969 emit_optional_rex_32(dst, src);
2972 emit_sse_operand(dst, src);
2975 void Assembler::mulps(XMMRegister dst, Operand src) {
2976 EnsureSpace ensure_space(
this);
2977 emit_optional_rex_32(dst, src);
2980 emit_sse_operand(dst, src);
2984 void Assembler::divps(XMMRegister dst, XMMRegister src) {
2985 EnsureSpace ensure_space(
this);
2986 emit_optional_rex_32(dst, src);
2989 emit_sse_operand(dst, src);
2992 void Assembler::divps(XMMRegister dst, Operand src) {
2993 EnsureSpace ensure_space(
this);
2994 emit_optional_rex_32(dst, src);
2997 emit_sse_operand(dst, src);
3003 void Assembler::movd(XMMRegister dst, Register src) {
3004 DCHECK(!IsEnabled(AVX));
3005 EnsureSpace ensure_space(
this);
3007 emit_optional_rex_32(dst, src);
3010 emit_sse_operand(dst, src);
3013 void Assembler::movd(XMMRegister dst, Operand src) {
3014 DCHECK(!IsEnabled(AVX));
3015 EnsureSpace ensure_space(
this);
3017 emit_optional_rex_32(dst, src);
3020 emit_sse_operand(dst, src);
3024 void Assembler::movd(Register dst, XMMRegister src) {
3025 DCHECK(!IsEnabled(AVX));
3026 EnsureSpace ensure_space(
this);
3028 emit_optional_rex_32(src, dst);
3031 emit_sse_operand(src, dst);
3035 void Assembler::movq(XMMRegister dst, Register src) {
3036 DCHECK(!IsEnabled(AVX));
3037 EnsureSpace ensure_space(
this);
3039 emit_rex_64(dst, src);
3042 emit_sse_operand(dst, src);
3046 void Assembler::movq(Register dst, XMMRegister src) {
3047 DCHECK(!IsEnabled(AVX));
3048 EnsureSpace ensure_space(
this);
3050 emit_rex_64(src, dst);
3053 emit_sse_operand(src, dst);
3057 void Assembler::movq(XMMRegister dst, XMMRegister src) {
3058 DCHECK(!IsEnabled(AVX));
3059 EnsureSpace ensure_space(
this);
3060 if (dst.low_bits() == 4) {
3063 emit_optional_rex_32(dst, src);
3066 emit_sse_operand(dst, src);
3069 emit_optional_rex_32(src, dst);
3072 emit_sse_operand(src, dst);
3076 void Assembler::movdqa(Operand dst, XMMRegister src) {
3077 EnsureSpace ensure_space(
this);
3079 emit_rex_64(src, dst);
3082 emit_sse_operand(src, dst);
3085 void Assembler::movdqa(XMMRegister dst, Operand src) {
3086 EnsureSpace ensure_space(
this);
3088 emit_rex_64(dst, src);
3091 emit_sse_operand(dst, src);
3094 void Assembler::movdqu(Operand dst, XMMRegister src) {
3095 EnsureSpace ensure_space(
this);
3097 emit_rex_64(src, dst);
3100 emit_sse_operand(src, dst);
3103 void Assembler::movdqu(XMMRegister dst, Operand src) {
3104 EnsureSpace ensure_space(
this);
3106 emit_rex_64(dst, src);
3109 emit_sse_operand(dst, src);
3113 void Assembler::extractps(Register dst, XMMRegister src, byte imm8) {
3114 DCHECK(IsEnabled(SSE4_1));
3115 DCHECK(is_uint8(imm8));
3116 EnsureSpace ensure_space(
this);
3118 emit_optional_rex_32(src, dst);
3122 emit_sse_operand(src, dst);
3126 void Assembler::pextrb(Register dst, XMMRegister src, int8_t imm8) {
3127 DCHECK(IsEnabled(SSE4_1));
3128 DCHECK(is_uint8(imm8));
3129 EnsureSpace ensure_space(
this);
3131 emit_optional_rex_32(src, dst);
3135 emit_sse_operand(src, dst);
3139 void Assembler::pextrb(Operand dst, XMMRegister src, int8_t imm8) {
3140 DCHECK(IsEnabled(SSE4_1));
3141 DCHECK(is_uint8(imm8));
3142 EnsureSpace ensure_space(
this);
3144 emit_optional_rex_32(src, dst);
3148 emit_sse_operand(src, dst);
3152 void Assembler::pinsrw(XMMRegister dst, Register src, int8_t imm8) {
3153 DCHECK(is_uint8(imm8));
3154 EnsureSpace ensure_space(
this);
3156 emit_optional_rex_32(dst, src);
3159 emit_sse_operand(dst, src);
3163 void Assembler::pinsrw(XMMRegister dst, Operand src, int8_t imm8) {
3164 DCHECK(is_uint8(imm8));
3165 EnsureSpace ensure_space(
this);
3167 emit_optional_rex_32(dst, src);
3170 emit_sse_operand(dst, src);
3174 void Assembler::pextrw(Register dst, XMMRegister src, int8_t imm8) {
3175 DCHECK(IsEnabled(SSE4_1));
3176 DCHECK(is_uint8(imm8));
3177 EnsureSpace ensure_space(
this);
3179 emit_optional_rex_32(src, dst);
3183 emit_sse_operand(src, dst);
3187 void Assembler::pextrw(Operand dst, XMMRegister src, int8_t imm8) {
3188 DCHECK(IsEnabled(SSE4_1));
3189 DCHECK(is_uint8(imm8));
3190 EnsureSpace ensure_space(
this);
3192 emit_optional_rex_32(src, dst);
3196 emit_sse_operand(src, dst);
3200 void Assembler::pextrd(Register dst, XMMRegister src, int8_t imm8) {
3201 DCHECK(IsEnabled(SSE4_1));
3202 EnsureSpace ensure_space(
this);
3204 emit_optional_rex_32(src, dst);
3208 emit_sse_operand(src, dst);
3212 void Assembler::pextrd(Operand dst, XMMRegister src, int8_t imm8) {
3213 DCHECK(IsEnabled(SSE4_1));
3214 EnsureSpace ensure_space(
this);
3216 emit_optional_rex_32(src, dst);
3220 emit_sse_operand(src, dst);
3224 void Assembler::pinsrd(XMMRegister dst, Register src, int8_t imm8) {
3225 DCHECK(IsEnabled(SSE4_1));
3226 EnsureSpace ensure_space(
this);
3228 emit_optional_rex_32(dst, src);
3232 emit_sse_operand(dst, src);
3236 void Assembler::pinsrd(XMMRegister dst, Operand src, int8_t imm8) {
3237 DCHECK(IsEnabled(SSE4_1));
3238 EnsureSpace ensure_space(
this);
3240 emit_optional_rex_32(dst, src);
3244 emit_sse_operand(dst, src);
3248 void Assembler::pinsrb(XMMRegister dst, Register src, int8_t imm8) {
3249 DCHECK(IsEnabled(SSE4_1));
3250 EnsureSpace ensure_space(
this);
3252 emit_optional_rex_32(dst, src);
3256 emit_sse_operand(dst, src);
3260 void Assembler::pinsrb(XMMRegister dst, Operand src, int8_t imm8) {
3261 DCHECK(IsEnabled(SSE4_1));
3262 EnsureSpace ensure_space(
this);
3264 emit_optional_rex_32(dst, src);
3268 emit_sse_operand(dst, src);
3272 void Assembler::insertps(XMMRegister dst, XMMRegister src, byte imm8) {
3273 DCHECK(CpuFeatures::IsSupported(SSE4_1));
3274 DCHECK(is_uint8(imm8));
3275 EnsureSpace ensure_space(
this);
3277 emit_optional_rex_32(dst, src);
3281 emit_sse_operand(dst, src);
3285 void Assembler::movsd(Operand dst, XMMRegister src) {
3286 DCHECK(!IsEnabled(AVX));
3287 EnsureSpace ensure_space(
this);
3289 emit_optional_rex_32(src, dst);
3292 emit_sse_operand(src, dst);
3296 void Assembler::movsd(XMMRegister dst, XMMRegister src) {
3297 DCHECK(!IsEnabled(AVX));
3298 EnsureSpace ensure_space(
this);
3300 emit_optional_rex_32(dst, src);
3303 emit_sse_operand(dst, src);
3306 void Assembler::movsd(XMMRegister dst, Operand src) {
3307 DCHECK(!IsEnabled(AVX));
3308 EnsureSpace ensure_space(
this);
3310 emit_optional_rex_32(dst, src);
3313 emit_sse_operand(dst, src);
3317 void Assembler::movaps(XMMRegister dst, XMMRegister src) {
3318 DCHECK(!IsEnabled(AVX));
3319 EnsureSpace ensure_space(
this);
3320 if (src.low_bits() == 4) {
3322 emit_optional_rex_32(src, dst);
3325 emit_sse_operand(src, dst);
3327 emit_optional_rex_32(dst, src);
3330 emit_sse_operand(dst, src);
3335 void Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) {
3336 DCHECK(is_uint8(imm8));
3337 EnsureSpace ensure_space(
this);
3338 emit_optional_rex_32(dst, src);
3341 emit_sse_operand(dst, src);
3346 void Assembler::movapd(XMMRegister dst, XMMRegister src) {
3347 DCHECK(!IsEnabled(AVX));
3348 EnsureSpace ensure_space(
this);
3349 if (src.low_bits() == 4) {
3352 emit_optional_rex_32(src, dst);
3355 emit_sse_operand(src, dst);
3358 emit_optional_rex_32(dst, src);
3361 emit_sse_operand(dst, src);
3365 void Assembler::movupd(XMMRegister dst, Operand src) {
3366 EnsureSpace ensure_space(
this);
3368 emit_optional_rex_32(dst, src);
3371 emit_sse_operand(dst, src);
3374 void Assembler::movupd(Operand dst, XMMRegister src) {
3375 EnsureSpace ensure_space(
this);
3377 emit_optional_rex_32(src, dst);
3380 emit_sse_operand(src, dst);
3383 void Assembler::addss(XMMRegister dst, XMMRegister src) {
3384 EnsureSpace ensure_space(
this);
3386 emit_optional_rex_32(dst, src);
3389 emit_sse_operand(dst, src);
3392 void Assembler::addss(XMMRegister dst, Operand src) {
3393 EnsureSpace ensure_space(
this);
3395 emit_optional_rex_32(dst, src);
3398 emit_sse_operand(dst, src);
3402 void Assembler::subss(XMMRegister dst, XMMRegister src) {
3403 EnsureSpace ensure_space(
this);
3405 emit_optional_rex_32(dst, src);
3408 emit_sse_operand(dst, src);
3411 void Assembler::subss(XMMRegister dst, Operand src) {
3412 EnsureSpace ensure_space(
this);
3414 emit_optional_rex_32(dst, src);
3417 emit_sse_operand(dst, src);
3421 void Assembler::mulss(XMMRegister dst, XMMRegister src) {
3422 EnsureSpace ensure_space(
this);
3424 emit_optional_rex_32(dst, src);
3427 emit_sse_operand(dst, src);
3430 void Assembler::mulss(XMMRegister dst, Operand src) {
3431 EnsureSpace ensure_space(
this);
3433 emit_optional_rex_32(dst, src);
3436 emit_sse_operand(dst, src);
3440 void Assembler::divss(XMMRegister dst, XMMRegister src) {
3441 EnsureSpace ensure_space(
this);
3443 emit_optional_rex_32(dst, src);
3446 emit_sse_operand(dst, src);
3449 void Assembler::divss(XMMRegister dst, Operand src) {
3450 EnsureSpace ensure_space(
this);
3452 emit_optional_rex_32(dst, src);
3455 emit_sse_operand(dst, src);
3459 void Assembler::maxss(XMMRegister dst, XMMRegister src) {
3460 EnsureSpace ensure_space(
this);
3462 emit_optional_rex_32(dst, src);
3465 emit_sse_operand(dst, src);
3468 void Assembler::maxss(XMMRegister dst, Operand src) {
3469 EnsureSpace ensure_space(
this);
3471 emit_optional_rex_32(dst, src);
3474 emit_sse_operand(dst, src);
3478 void Assembler::minss(XMMRegister dst, XMMRegister src) {
3479 EnsureSpace ensure_space(
this);
3481 emit_optional_rex_32(dst, src);
3484 emit_sse_operand(dst, src);
3487 void Assembler::minss(XMMRegister dst, Operand src) {
3488 EnsureSpace ensure_space(
this);
3490 emit_optional_rex_32(dst, src);
3493 emit_sse_operand(dst, src);
3497 void Assembler::sqrtss(XMMRegister dst, XMMRegister src) {
3498 EnsureSpace ensure_space(
this);
3500 emit_optional_rex_32(dst, src);
3503 emit_sse_operand(dst, src);
3506 void Assembler::sqrtss(XMMRegister dst, Operand src) {
3507 EnsureSpace ensure_space(
this);
3509 emit_optional_rex_32(dst, src);
3512 emit_sse_operand(dst, src);
3516 void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {
3517 DCHECK(!IsEnabled(AVX));
3518 EnsureSpace ensure_space(
this);
3519 emit_optional_rex_32(dst, src);
3522 emit_sse_operand(dst, src);
3525 void Assembler::ucomiss(XMMRegister dst, Operand src) {
3526 DCHECK(!IsEnabled(AVX));
3527 EnsureSpace ensure_space(
this);
3528 emit_optional_rex_32(dst, src);
3531 emit_sse_operand(dst, src);
3535 void Assembler::movss(XMMRegister dst, XMMRegister src) {
3536 DCHECK(!IsEnabled(AVX));
3537 EnsureSpace ensure_space(
this);
3539 emit_optional_rex_32(dst, src);
3542 emit_sse_operand(dst, src);
3545 void Assembler::movss(XMMRegister dst, Operand src) {
3546 DCHECK(!IsEnabled(AVX));
3547 EnsureSpace ensure_space(
this);
3549 emit_optional_rex_32(dst, src);
3552 emit_sse_operand(dst, src);
3555 void Assembler::movss(Operand src, XMMRegister dst) {
3556 DCHECK(!IsEnabled(AVX));
3557 EnsureSpace ensure_space(
this);
3559 emit_optional_rex_32(dst, src);
3562 emit_sse_operand(dst, src);
3566 void Assembler::psllq(XMMRegister reg, byte imm8) {
3567 DCHECK(!IsEnabled(AVX));
3568 EnsureSpace ensure_space(
this);
3570 emit_optional_rex_32(reg);
3573 emit_sse_operand(rsi, reg);
3578 void Assembler::psrlq(XMMRegister reg, byte imm8) {
3579 DCHECK(!IsEnabled(AVX));
3580 EnsureSpace ensure_space(
this);
3582 emit_optional_rex_32(reg);
3585 emit_sse_operand(rdx, reg);
3589 void Assembler::psllw(XMMRegister reg, byte imm8) {
3590 EnsureSpace ensure_space(
this);
3592 emit_optional_rex_32(reg);
3595 emit_sse_operand(rsi, reg);
3599 void Assembler::pslld(XMMRegister reg, byte imm8) {
3600 EnsureSpace ensure_space(
this);
3602 emit_optional_rex_32(reg);
3605 emit_sse_operand(rsi, reg);
3609 void Assembler::psrlw(XMMRegister reg, byte imm8) {
3610 EnsureSpace ensure_space(
this);
3612 emit_optional_rex_32(reg);
3615 emit_sse_operand(rdx, reg);
3619 void Assembler::psrld(XMMRegister reg, byte imm8) {
3620 EnsureSpace ensure_space(
this);
3622 emit_optional_rex_32(reg);
3625 emit_sse_operand(rdx, reg);
3629 void Assembler::psraw(XMMRegister reg, byte imm8) {
3630 EnsureSpace ensure_space(
this);
3632 emit_optional_rex_32(reg);
3635 emit_sse_operand(rsp, reg);
3639 void Assembler::psrad(XMMRegister reg, byte imm8) {
3640 EnsureSpace ensure_space(
this);
3642 emit_optional_rex_32(reg);
3645 emit_sse_operand(rsp, reg);
3649 void Assembler::cmpps(XMMRegister dst, XMMRegister src, int8_t cmp) {
3650 EnsureSpace ensure_space(
this);
3651 emit_optional_rex_32(dst, src);
3654 emit_sse_operand(dst, src);
3658 void Assembler::cmpps(XMMRegister dst, Operand src, int8_t cmp) {
3659 EnsureSpace ensure_space(
this);
3660 emit_optional_rex_32(dst, src);
3663 emit_sse_operand(dst, src);
3667 void Assembler::cmppd(XMMRegister dst, XMMRegister src, int8_t cmp) {
3668 EnsureSpace ensure_space(
this);
3669 emit_optional_rex_32(dst, src);
3673 emit_sse_operand(dst, src);
3677 void Assembler::cmppd(XMMRegister dst, Operand src, int8_t cmp) {
3678 EnsureSpace ensure_space(
this);
3679 emit_optional_rex_32(dst, src);
3683 emit_sse_operand(dst, src);
3687 void Assembler::cvttss2si(Register dst, Operand src) {
3688 DCHECK(!IsEnabled(AVX));
3689 EnsureSpace ensure_space(
this);
3691 emit_optional_rex_32(dst, src);
3694 emit_operand(dst, src);
3698 void Assembler::cvttss2si(Register dst, XMMRegister src) {
3699 DCHECK(!IsEnabled(AVX));
3700 EnsureSpace ensure_space(
this);
3702 emit_optional_rex_32(dst, src);
3705 emit_sse_operand(dst, src);
3708 void Assembler::cvttsd2si(Register dst, Operand src) {
3709 DCHECK(!IsEnabled(AVX));
3710 EnsureSpace ensure_space(
this);
3712 emit_optional_rex_32(dst, src);
3715 emit_operand(dst, src);
3719 void Assembler::cvttsd2si(Register dst, XMMRegister src) {
3720 DCHECK(!IsEnabled(AVX));
3721 EnsureSpace ensure_space(
this);
3723 emit_optional_rex_32(dst, src);
3726 emit_sse_operand(dst, src);
3730 void Assembler::cvttss2siq(Register dst, XMMRegister src) {
3731 DCHECK(!IsEnabled(AVX));
3732 EnsureSpace ensure_space(
this);
3734 emit_rex_64(dst, src);
3737 emit_sse_operand(dst, src);
3740 void Assembler::cvttss2siq(Register dst, Operand src) {
3741 DCHECK(!IsEnabled(AVX));
3742 EnsureSpace ensure_space(
this);
3744 emit_rex_64(dst, src);
3747 emit_sse_operand(dst, src);
3751 void Assembler::cvttsd2siq(Register dst, XMMRegister src) {
3752 DCHECK(!IsEnabled(AVX));
3753 EnsureSpace ensure_space(
this);
3755 emit_rex_64(dst, src);
3758 emit_sse_operand(dst, src);
3761 void Assembler::cvttsd2siq(Register dst, Operand src) {
3762 DCHECK(!IsEnabled(AVX));
3763 EnsureSpace ensure_space(
this);
3765 emit_rex_64(dst, src);
3768 emit_sse_operand(dst, src);
3771 void Assembler::cvttps2dq(XMMRegister dst, Operand src) {
3772 EnsureSpace ensure_space(
this);
3774 emit_rex_64(dst, src);
3777 emit_sse_operand(dst, src);
3780 void Assembler::cvttps2dq(XMMRegister dst, XMMRegister src) {
3781 EnsureSpace ensure_space(
this);
3783 emit_rex_64(dst, src);
3786 emit_sse_operand(dst, src);
3789 void Assembler::cvtlsi2sd(XMMRegister dst, Operand src) {
3790 DCHECK(!IsEnabled(AVX));
3791 EnsureSpace ensure_space(
this);
3793 emit_optional_rex_32(dst, src);
3796 emit_sse_operand(dst, src);
3800 void Assembler::cvtlsi2sd(XMMRegister dst, Register src) {
3801 DCHECK(!IsEnabled(AVX));
3802 EnsureSpace ensure_space(
this);
3804 emit_optional_rex_32(dst, src);
3807 emit_sse_operand(dst, src);
3810 void Assembler::cvtlsi2ss(XMMRegister dst, Operand src) {
3811 DCHECK(!IsEnabled(AVX));
3812 EnsureSpace ensure_space(
this);
3814 emit_optional_rex_32(dst, src);
3817 emit_sse_operand(dst, src);
3821 void Assembler::cvtlsi2ss(XMMRegister dst, Register src) {
3822 EnsureSpace ensure_space(
this);
3824 emit_optional_rex_32(dst, src);
3827 emit_sse_operand(dst, src);
3830 void Assembler::cvtqsi2ss(XMMRegister dst, Operand src) {
3831 DCHECK(!IsEnabled(AVX));
3832 EnsureSpace ensure_space(
this);
3834 emit_rex_64(dst, src);
3837 emit_sse_operand(dst, src);
3841 void Assembler::cvtqsi2ss(XMMRegister dst, Register src) {
3842 DCHECK(!IsEnabled(AVX));
3843 EnsureSpace ensure_space(
this);
3845 emit_rex_64(dst, src);
3848 emit_sse_operand(dst, src);
3851 void Assembler::cvtqsi2sd(XMMRegister dst, Operand src) {
3852 DCHECK(!IsEnabled(AVX));
3853 EnsureSpace ensure_space(
this);
3855 emit_rex_64(dst, src);
3858 emit_sse_operand(dst, src);
3862 void Assembler::cvtqsi2sd(XMMRegister dst, Register src) {
3863 DCHECK(!IsEnabled(AVX));
3864 EnsureSpace ensure_space(
this);
3866 emit_rex_64(dst, src);
3869 emit_sse_operand(dst, src);
3873 void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) {
3874 DCHECK(!IsEnabled(AVX));
3875 EnsureSpace ensure_space(
this);
3877 emit_optional_rex_32(dst, src);
3880 emit_sse_operand(dst, src);
3883 void Assembler::cvtss2sd(XMMRegister dst, Operand src) {
3884 DCHECK(!IsEnabled(AVX));
3885 EnsureSpace ensure_space(
this);
3887 emit_optional_rex_32(dst, src);
3890 emit_sse_operand(dst, src);
3894 void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) {
3895 DCHECK(!IsEnabled(AVX));
3896 EnsureSpace ensure_space(
this);
3898 emit_optional_rex_32(dst, src);
3901 emit_sse_operand(dst, src);
3904 void Assembler::cvtsd2ss(XMMRegister dst, Operand src) {
3905 DCHECK(!IsEnabled(AVX));
3906 EnsureSpace ensure_space(
this);
3908 emit_optional_rex_32(dst, src);
3911 emit_sse_operand(dst, src);
3915 void Assembler::cvtsd2si(Register dst, XMMRegister src) {
3916 DCHECK(!IsEnabled(AVX));
3917 EnsureSpace ensure_space(
this);
3919 emit_optional_rex_32(dst, src);
3922 emit_sse_operand(dst, src);
3926 void Assembler::cvtsd2siq(Register dst, XMMRegister src) {
3927 DCHECK(!IsEnabled(AVX));
3928 EnsureSpace ensure_space(
this);
3930 emit_rex_64(dst, src);
3933 emit_sse_operand(dst, src);
3937 void Assembler::addsd(XMMRegister dst, XMMRegister src) {
3938 EnsureSpace ensure_space(
this);
3940 emit_optional_rex_32(dst, src);
3943 emit_sse_operand(dst, src);
3946 void Assembler::addsd(XMMRegister dst, Operand src) {
3947 EnsureSpace ensure_space(
this);
3949 emit_optional_rex_32(dst, src);
3952 emit_sse_operand(dst, src);
3956 void Assembler::mulsd(XMMRegister dst, XMMRegister src) {
3957 EnsureSpace ensure_space(
this);
3959 emit_optional_rex_32(dst, src);
3962 emit_sse_operand(dst, src);
3965 void Assembler::mulsd(XMMRegister dst, Operand src) {
3966 EnsureSpace ensure_space(
this);
3968 emit_optional_rex_32(dst, src);
3971 emit_sse_operand(dst, src);
3975 void Assembler::subsd(XMMRegister dst, XMMRegister src) {
3976 EnsureSpace ensure_space(
this);
3978 emit_optional_rex_32(dst, src);
3981 emit_sse_operand(dst, src);
3984 void Assembler::subsd(XMMRegister dst, Operand src) {
3985 EnsureSpace ensure_space(
this);
3987 emit_optional_rex_32(dst, src);
3990 emit_sse_operand(dst, src);
3994 void Assembler::divsd(XMMRegister dst, XMMRegister src) {
3995 EnsureSpace ensure_space(
this);
3997 emit_optional_rex_32(dst, src);
4000 emit_sse_operand(dst, src);
4003 void Assembler::divsd(XMMRegister dst, Operand src) {
4004 EnsureSpace ensure_space(
this);
4006 emit_optional_rex_32(dst, src);
4009 emit_sse_operand(dst, src);
4013 void Assembler::maxsd(XMMRegister dst, XMMRegister src) {
4014 EnsureSpace ensure_space(
this);
4016 emit_optional_rex_32(dst, src);
4019 emit_sse_operand(dst, src);
4022 void Assembler::maxsd(XMMRegister dst, Operand src) {
4023 EnsureSpace ensure_space(
this);
4025 emit_optional_rex_32(dst, src);
4028 emit_sse_operand(dst, src);
4032 void Assembler::minsd(XMMRegister dst, XMMRegister src) {
4033 EnsureSpace ensure_space(
this);
4035 emit_optional_rex_32(dst, src);
4038 emit_sse_operand(dst, src);
4041 void Assembler::minsd(XMMRegister dst, Operand src) {
4042 EnsureSpace ensure_space(
this);
4044 emit_optional_rex_32(dst, src);
4047 emit_sse_operand(dst, src);
4051 void Assembler::andpd(XMMRegister dst, XMMRegister src) {
4052 EnsureSpace ensure_space(
this);
4054 emit_optional_rex_32(dst, src);
4057 emit_sse_operand(dst, src);
4060 void Assembler::andpd(XMMRegister dst, Operand src) {
4061 EnsureSpace ensure_space(
this);
4063 emit_optional_rex_32(dst, src);
4066 emit_sse_operand(dst, src);
4070 void Assembler::orpd(XMMRegister dst, XMMRegister src) {
4071 EnsureSpace ensure_space(
this);
4073 emit_optional_rex_32(dst, src);
4076 emit_sse_operand(dst, src);
4079 void Assembler::orpd(XMMRegister dst, Operand src) {
4080 EnsureSpace ensure_space(
this);
4082 emit_optional_rex_32(dst, src);
4085 emit_sse_operand(dst, src);
4089 void Assembler::xorpd(XMMRegister dst, XMMRegister src) {
4090 DCHECK(!IsEnabled(AVX));
4091 EnsureSpace ensure_space(
this);
4093 emit_optional_rex_32(dst, src);
4096 emit_sse_operand(dst, src);
4099 void Assembler::xorpd(XMMRegister dst, Operand src) {
4100 DCHECK(!IsEnabled(AVX));
4101 EnsureSpace ensure_space(
this);
4103 emit_optional_rex_32(dst, src);
4106 emit_sse_operand(dst, src);
4110 void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {
4111 DCHECK(!IsEnabled(AVX));
4112 EnsureSpace ensure_space(
this);
4114 emit_optional_rex_32(dst, src);
4117 emit_sse_operand(dst, src);
4120 void Assembler::sqrtsd(XMMRegister dst, Operand src) {
4121 DCHECK(!IsEnabled(AVX));
4122 EnsureSpace ensure_space(
this);
4124 emit_optional_rex_32(dst, src);
4127 emit_sse_operand(dst, src);
4130 void Assembler::haddps(XMMRegister dst, XMMRegister src) {
4131 DCHECK(IsEnabled(SSE3));
4132 EnsureSpace ensure_space(
this);
4134 emit_optional_rex_32(dst, src);
4137 emit_sse_operand(dst, src);
4140 void Assembler::haddps(XMMRegister dst, Operand src) {
4141 DCHECK(IsEnabled(SSE3));
4142 EnsureSpace ensure_space(
this);
4144 emit_optional_rex_32(dst, src);
4147 emit_sse_operand(dst, src);
4150 void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {
4151 DCHECK(!IsEnabled(AVX));
4152 EnsureSpace ensure_space(
this);
4154 emit_optional_rex_32(dst, src);
4157 emit_sse_operand(dst, src);
4160 void Assembler::ucomisd(XMMRegister dst, Operand src) {
4161 DCHECK(!IsEnabled(AVX));
4162 EnsureSpace ensure_space(
this);
4164 emit_optional_rex_32(dst, src);
4167 emit_sse_operand(dst, src);
4171 void Assembler::cmpltsd(XMMRegister dst, XMMRegister src) {
4172 EnsureSpace ensure_space(
this);
4174 emit_optional_rex_32(dst, src);
4177 emit_sse_operand(dst, src);
4182 void Assembler::roundss(XMMRegister dst, XMMRegister src, RoundingMode mode) {
4183 DCHECK(!IsEnabled(AVX));
4184 DCHECK(IsEnabled(SSE4_1));
4185 EnsureSpace ensure_space(
this);
4187 emit_optional_rex_32(dst, src);
4191 emit_sse_operand(dst, src);
4193 emit(static_cast<byte>(mode) | 0x8);
4197 void Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) {
4198 DCHECK(!IsEnabled(AVX));
4199 DCHECK(IsEnabled(SSE4_1));
4200 EnsureSpace ensure_space(
this);
4202 emit_optional_rex_32(dst, src);
4206 emit_sse_operand(dst, src);
4208 emit(static_cast<byte>(mode) | 0x8);
4212 void Assembler::movmskpd(Register dst, XMMRegister src) {
4213 EnsureSpace ensure_space(
this);
4215 emit_optional_rex_32(dst, src);
4218 emit_sse_operand(dst, src);
4222 void Assembler::movmskps(Register dst, XMMRegister src) {
4223 EnsureSpace ensure_space(
this);
4224 emit_optional_rex_32(dst, src);
4227 emit_sse_operand(dst, src);
4232 void Assembler::vfmasd(byte op, XMMRegister dst, XMMRegister src1,
4234 DCHECK(IsEnabled(FMA3));
4235 EnsureSpace ensure_space(
this);
4236 emit_vex_prefix(dst, src1, src2, kLIG, k66, k0F38, kW1);
4238 emit_sse_operand(dst, src2);
4241 void Assembler::vfmasd(byte op, XMMRegister dst, XMMRegister src1,
4243 DCHECK(IsEnabled(FMA3));
4244 EnsureSpace ensure_space(
this);
4245 emit_vex_prefix(dst, src1, src2, kLIG, k66, k0F38, kW1);
4247 emit_sse_operand(dst, src2);
4251 void Assembler::vfmass(byte op, XMMRegister dst, XMMRegister src1,
4253 DCHECK(IsEnabled(FMA3));
4254 EnsureSpace ensure_space(
this);
4255 emit_vex_prefix(dst, src1, src2, kLIG, k66, k0F38, kW0);
4257 emit_sse_operand(dst, src2);
4260 void Assembler::vfmass(byte op, XMMRegister dst, XMMRegister src1,
4262 DCHECK(IsEnabled(FMA3));
4263 EnsureSpace ensure_space(
this);
4264 emit_vex_prefix(dst, src1, src2, kLIG, k66, k0F38, kW0);
4266 emit_sse_operand(dst, src2);
4270 void Assembler::vmovd(XMMRegister dst, Register src) {
4271 DCHECK(IsEnabled(AVX));
4272 EnsureSpace ensure_space(
this);
4273 XMMRegister isrc = XMMRegister::from_code(src.code());
4274 emit_vex_prefix(dst, xmm0, isrc, kL128, k66, k0F, kW0);
4276 emit_sse_operand(dst, src);
4279 void Assembler::vmovd(XMMRegister dst, Operand src) {
4280 DCHECK(IsEnabled(AVX));
4281 EnsureSpace ensure_space(
this);
4282 emit_vex_prefix(dst, xmm0, src, kL128, k66, k0F, kW0);
4284 emit_sse_operand(dst, src);
4288 void Assembler::vmovd(Register dst, XMMRegister src) {
4289 DCHECK(IsEnabled(AVX));
4290 EnsureSpace ensure_space(
this);
4291 XMMRegister idst = XMMRegister::from_code(dst.code());
4292 emit_vex_prefix(src, xmm0, idst, kL128, k66, k0F, kW0);
4294 emit_sse_operand(src, dst);
4298 void Assembler::vmovq(XMMRegister dst, Register src) {
4299 DCHECK(IsEnabled(AVX));
4300 EnsureSpace ensure_space(
this);
4301 XMMRegister isrc = XMMRegister::from_code(src.code());
4302 emit_vex_prefix(dst, xmm0, isrc, kL128, k66, k0F, kW1);
4304 emit_sse_operand(dst, src);
4307 void Assembler::vmovq(XMMRegister dst, Operand src) {
4308 DCHECK(IsEnabled(AVX));
4309 EnsureSpace ensure_space(
this);
4310 emit_vex_prefix(dst, xmm0, src, kL128, k66, k0F, kW1);
4312 emit_sse_operand(dst, src);
4316 void Assembler::vmovq(Register dst, XMMRegister src) {
4317 DCHECK(IsEnabled(AVX));
4318 EnsureSpace ensure_space(
this);
4319 XMMRegister idst = XMMRegister::from_code(dst.code());
4320 emit_vex_prefix(src, xmm0, idst, kL128, k66, k0F, kW1);
4322 emit_sse_operand(src, dst);
4325 void Assembler::vinstr(byte op, XMMRegister dst, XMMRegister src1,
4326 XMMRegister src2, SIMDPrefix pp, LeadingOpcode m,
4328 DCHECK(IsEnabled(AVX));
4329 EnsureSpace ensure_space(
this);
4330 emit_vex_prefix(dst, src1, src2, kLIG, pp, m, w);
4332 emit_sse_operand(dst, src2);
4335 void Assembler::vinstr(byte op, XMMRegister dst, XMMRegister src1, Operand src2,
4336 SIMDPrefix pp, LeadingOpcode m, VexW w) {
4337 DCHECK(IsEnabled(AVX));
4338 EnsureSpace ensure_space(
this);
4339 emit_vex_prefix(dst, src1, src2, kLIG, pp, m, w);
4341 emit_sse_operand(dst, src2);
4345 void Assembler::vps(byte op, XMMRegister dst, XMMRegister src1,
4347 DCHECK(IsEnabled(AVX));
4348 EnsureSpace ensure_space(
this);
4349 emit_vex_prefix(dst, src1, src2, kL128, kNone, k0F, kWIG);
4351 emit_sse_operand(dst, src2);
4354 void Assembler::vps(byte op, XMMRegister dst, XMMRegister src1, Operand src2) {
4355 DCHECK(IsEnabled(AVX));
4356 EnsureSpace ensure_space(
this);
4357 emit_vex_prefix(dst, src1, src2, kL128, kNone, k0F, kWIG);
4359 emit_sse_operand(dst, src2);
4363 void Assembler::vpd(byte op, XMMRegister dst, XMMRegister src1,
4365 DCHECK(IsEnabled(AVX));
4366 EnsureSpace ensure_space(
this);
4367 emit_vex_prefix(dst, src1, src2, kL128, k66, k0F, kWIG);
4369 emit_sse_operand(dst, src2);
4372 void Assembler::vpd(byte op, XMMRegister dst, XMMRegister src1, Operand src2) {
4373 DCHECK(IsEnabled(AVX));
4374 EnsureSpace ensure_space(
this);
4375 emit_vex_prefix(dst, src1, src2, kL128, k66, k0F, kWIG);
4377 emit_sse_operand(dst, src2);
4381 void Assembler::vucomiss(XMMRegister dst, XMMRegister src) {
4382 DCHECK(IsEnabled(AVX));
4383 EnsureSpace ensure_space(
this);
4384 emit_vex_prefix(dst, xmm0, src, kLIG, kNone, k0F, kWIG);
4386 emit_sse_operand(dst, src);
4389 void Assembler::vucomiss(XMMRegister dst, Operand src) {
4390 DCHECK(IsEnabled(AVX));
4391 EnsureSpace ensure_space(
this);
4392 emit_vex_prefix(dst, xmm0, src, kLIG, kNone, k0F, kWIG);
4394 emit_sse_operand(dst, src);
4398 void Assembler::vss(byte op, XMMRegister dst, XMMRegister src1,
4400 DCHECK(IsEnabled(AVX));
4401 EnsureSpace ensure_space(
this);
4402 emit_vex_prefix(dst, src1, src2, kLIG, kF3, k0F, kWIG);
4404 emit_sse_operand(dst, src2);
4407 void Assembler::vss(byte op, XMMRegister dst, XMMRegister src1, Operand src2) {
4408 DCHECK(IsEnabled(AVX));
4409 EnsureSpace ensure_space(
this);
4410 emit_vex_prefix(dst, src1, src2, kLIG, kF3, k0F, kWIG);
4412 emit_sse_operand(dst, src2);
4416 void Assembler::bmi1q(byte op, Register reg, Register vreg, Register rm) {
4417 DCHECK(IsEnabled(BMI1));
4418 EnsureSpace ensure_space(
this);
4419 emit_vex_prefix(reg, vreg, rm, kLZ, kNone, k0F38, kW1);
4421 emit_modrm(reg, rm);
4424 void Assembler::bmi1q(byte op, Register reg, Register vreg, Operand rm) {
4425 DCHECK(IsEnabled(BMI1));
4426 EnsureSpace ensure_space(
this);
4427 emit_vex_prefix(reg, vreg, rm, kLZ, kNone, k0F38, kW1);
4429 emit_operand(reg, rm);
4433 void Assembler::bmi1l(byte op, Register reg, Register vreg, Register rm) {
4434 DCHECK(IsEnabled(BMI1));
4435 EnsureSpace ensure_space(
this);
4436 emit_vex_prefix(reg, vreg, rm, kLZ, kNone, k0F38, kW0);
4438 emit_modrm(reg, rm);
4441 void Assembler::bmi1l(byte op, Register reg, Register vreg, Operand rm) {
4442 DCHECK(IsEnabled(BMI1));
4443 EnsureSpace ensure_space(
this);
4444 emit_vex_prefix(reg, vreg, rm, kLZ, kNone, k0F38, kW0);
4446 emit_operand(reg, rm);
4450 void Assembler::tzcntq(Register dst, Register src) {
4451 DCHECK(IsEnabled(BMI1));
4452 EnsureSpace ensure_space(
this);
4454 emit_rex_64(dst, src);
4457 emit_modrm(dst, src);
4460 void Assembler::tzcntq(Register dst, Operand src) {
4461 DCHECK(IsEnabled(BMI1));
4462 EnsureSpace ensure_space(
this);
4464 emit_rex_64(dst, src);
4467 emit_operand(dst, src);
4471 void Assembler::tzcntl(Register dst, Register src) {
4472 DCHECK(IsEnabled(BMI1));
4473 EnsureSpace ensure_space(
this);
4475 emit_optional_rex_32(dst, src);
4478 emit_modrm(dst, src);
4481 void Assembler::tzcntl(Register dst, Operand src) {
4482 DCHECK(IsEnabled(BMI1));
4483 EnsureSpace ensure_space(
this);
4485 emit_optional_rex_32(dst, src);
4488 emit_operand(dst, src);
4492 void Assembler::lzcntq(Register dst, Register src) {
4493 DCHECK(IsEnabled(LZCNT));
4494 EnsureSpace ensure_space(
this);
4496 emit_rex_64(dst, src);
4499 emit_modrm(dst, src);
4502 void Assembler::lzcntq(Register dst, Operand src) {
4503 DCHECK(IsEnabled(LZCNT));
4504 EnsureSpace ensure_space(
this);
4506 emit_rex_64(dst, src);
4509 emit_operand(dst, src);
4513 void Assembler::lzcntl(Register dst, Register src) {
4514 DCHECK(IsEnabled(LZCNT));
4515 EnsureSpace ensure_space(
this);
4517 emit_optional_rex_32(dst, src);
4520 emit_modrm(dst, src);
4523 void Assembler::lzcntl(Register dst, Operand src) {
4524 DCHECK(IsEnabled(LZCNT));
4525 EnsureSpace ensure_space(
this);
4527 emit_optional_rex_32(dst, src);
4530 emit_operand(dst, src);
4534 void Assembler::popcntq(Register dst, Register src) {
4535 DCHECK(IsEnabled(POPCNT));
4536 EnsureSpace ensure_space(
this);
4538 emit_rex_64(dst, src);
4541 emit_modrm(dst, src);
4544 void Assembler::popcntq(Register dst, Operand src) {
4545 DCHECK(IsEnabled(POPCNT));
4546 EnsureSpace ensure_space(
this);
4548 emit_rex_64(dst, src);
4551 emit_operand(dst, src);
4555 void Assembler::popcntl(Register dst, Register src) {
4556 DCHECK(IsEnabled(POPCNT));
4557 EnsureSpace ensure_space(
this);
4559 emit_optional_rex_32(dst, src);
4562 emit_modrm(dst, src);
4565 void Assembler::popcntl(Register dst, Operand src) {
4566 DCHECK(IsEnabled(POPCNT));
4567 EnsureSpace ensure_space(
this);
4569 emit_optional_rex_32(dst, src);
4572 emit_operand(dst, src);
4576 void Assembler::bmi2q(SIMDPrefix pp, byte op, Register reg, Register vreg,
4578 DCHECK(IsEnabled(BMI2));
4579 EnsureSpace ensure_space(
this);
4580 emit_vex_prefix(reg, vreg, rm, kLZ, pp, k0F38, kW1);
4582 emit_modrm(reg, rm);
4585 void Assembler::bmi2q(SIMDPrefix pp, byte op, Register reg, Register vreg,
4587 DCHECK(IsEnabled(BMI2));
4588 EnsureSpace ensure_space(
this);
4589 emit_vex_prefix(reg, vreg, rm, kLZ, pp, k0F38, kW1);
4591 emit_operand(reg, rm);
4595 void Assembler::bmi2l(SIMDPrefix pp, byte op, Register reg, Register vreg,
4597 DCHECK(IsEnabled(BMI2));
4598 EnsureSpace ensure_space(
this);
4599 emit_vex_prefix(reg, vreg, rm, kLZ, pp, k0F38, kW0);
4601 emit_modrm(reg, rm);
4604 void Assembler::bmi2l(SIMDPrefix pp, byte op, Register reg, Register vreg,
4606 DCHECK(IsEnabled(BMI2));
4607 EnsureSpace ensure_space(
this);
4608 emit_vex_prefix(reg, vreg, rm, kLZ, pp, k0F38, kW0);
4610 emit_operand(reg, rm);
4614 void Assembler::rorxq(Register dst, Register src, byte imm8) {
4615 DCHECK(IsEnabled(BMI2));
4616 DCHECK(is_uint8(imm8));
4617 Register vreg = Register::from_code<0>();
4618 EnsureSpace ensure_space(
this);
4619 emit_vex_prefix(dst, vreg, src, kLZ, kF2, k0F3A, kW1);
4621 emit_modrm(dst, src);
4625 void Assembler::rorxq(Register dst, Operand src, byte imm8) {
4626 DCHECK(IsEnabled(BMI2));
4627 DCHECK(is_uint8(imm8));
4628 Register vreg = Register::from_code<0>();
4629 EnsureSpace ensure_space(
this);
4630 emit_vex_prefix(dst, vreg, src, kLZ, kF2, k0F3A, kW1);
4632 emit_operand(dst, src);
4637 void Assembler::rorxl(Register dst, Register src, byte imm8) {
4638 DCHECK(IsEnabled(BMI2));
4639 DCHECK(is_uint8(imm8));
4640 Register vreg = Register::from_code<0>();
4641 EnsureSpace ensure_space(
this);
4642 emit_vex_prefix(dst, vreg, src, kLZ, kF2, k0F3A, kW0);
4644 emit_modrm(dst, src);
4648 void Assembler::rorxl(Register dst, Operand src, byte imm8) {
4649 DCHECK(IsEnabled(BMI2));
4650 DCHECK(is_uint8(imm8));
4651 Register vreg = Register::from_code<0>();
4652 EnsureSpace ensure_space(
this);
4653 emit_vex_prefix(dst, vreg, src, kLZ, kF2, k0F3A, kW0);
4655 emit_operand(dst, src);
4659 void Assembler::pause() {
4664 void Assembler::minps(XMMRegister dst, XMMRegister src) {
4665 EnsureSpace ensure_space(
this);
4666 emit_optional_rex_32(dst, src);
4669 emit_sse_operand(dst, src);
4672 void Assembler::minps(XMMRegister dst, Operand src) {
4673 EnsureSpace ensure_space(
this);
4674 emit_optional_rex_32(dst, src);
4677 emit_sse_operand(dst, src);
4680 void Assembler::maxps(XMMRegister dst, XMMRegister src) {
4681 EnsureSpace ensure_space(
this);
4682 emit_optional_rex_32(dst, src);
4685 emit_sse_operand(dst, src);
4688 void Assembler::maxps(XMMRegister dst, Operand src) {
4689 EnsureSpace ensure_space(
this);
4690 emit_optional_rex_32(dst, src);
4693 emit_sse_operand(dst, src);
4696 void Assembler::rcpps(XMMRegister dst, XMMRegister src) {
4697 EnsureSpace ensure_space(
this);
4698 emit_optional_rex_32(dst, src);
4701 emit_sse_operand(dst, src);
4704 void Assembler::rcpps(XMMRegister dst, Operand src) {
4705 EnsureSpace ensure_space(
this);
4706 emit_optional_rex_32(dst, src);
4709 emit_sse_operand(dst, src);
4712 void Assembler::rsqrtps(XMMRegister dst, XMMRegister src) {
4713 EnsureSpace ensure_space(
this);
4714 emit_optional_rex_32(dst, src);
4717 emit_sse_operand(dst, src);
4720 void Assembler::rsqrtps(XMMRegister dst, Operand src) {
4721 EnsureSpace ensure_space(
this);
4722 emit_optional_rex_32(dst, src);
4725 emit_sse_operand(dst, src);
4728 void Assembler::sqrtps(XMMRegister dst, XMMRegister src) {
4729 EnsureSpace ensure_space(
this);
4730 emit_optional_rex_32(dst, src);
4733 emit_sse_operand(dst, src);
4736 void Assembler::sqrtps(XMMRegister dst, Operand src) {
4737 EnsureSpace ensure_space(
this);
4738 emit_optional_rex_32(dst, src);
4741 emit_sse_operand(dst, src);
4744 void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {
4745 EnsureSpace ensure_space(
this);
4746 emit_optional_rex_32(dst, src);
4749 emit_sse_operand(dst, src);
4752 void Assembler::cvtdq2ps(XMMRegister dst, Operand src) {
4753 EnsureSpace ensure_space(
this);
4754 emit_optional_rex_32(dst, src);
4757 emit_sse_operand(dst, src);
4760 void Assembler::movups(XMMRegister dst, XMMRegister src) {
4761 EnsureSpace ensure_space(
this);
4762 if (src.low_bits() == 4) {
4764 emit_optional_rex_32(src, dst);
4767 emit_sse_operand(src, dst);
4769 emit_optional_rex_32(dst, src);
4772 emit_sse_operand(dst, src);
4776 void Assembler::movups(XMMRegister dst, Operand src) {
4777 EnsureSpace ensure_space(
this);
4778 emit_optional_rex_32(dst, src);
4781 emit_sse_operand(dst, src);
4784 void Assembler::movups(Operand dst, XMMRegister src) {
4785 EnsureSpace ensure_space(
this);
4786 emit_optional_rex_32(src, dst);
4789 emit_sse_operand(src, dst);
4792 void Assembler::sse2_instr(XMMRegister dst, XMMRegister src, byte prefix,
4793 byte escape, byte opcode) {
4794 EnsureSpace ensure_space(
this);
4796 emit_optional_rex_32(dst, src);
4799 emit_sse_operand(dst, src);
4802 void Assembler::sse2_instr(XMMRegister dst, Operand src, byte prefix,
4803 byte escape, byte opcode) {
4804 EnsureSpace ensure_space(
this);
4806 emit_optional_rex_32(dst, src);
4809 emit_sse_operand(dst, src);
4812 void Assembler::ssse3_instr(XMMRegister dst, XMMRegister src, byte prefix,
4813 byte escape1, byte escape2, byte opcode) {
4814 DCHECK(IsEnabled(SSSE3));
4815 EnsureSpace ensure_space(
this);
4817 emit_optional_rex_32(dst, src);
4821 emit_sse_operand(dst, src);
4824 void Assembler::ssse3_instr(XMMRegister dst, Operand src, byte prefix,
4825 byte escape1, byte escape2, byte opcode) {
4826 DCHECK(IsEnabled(SSSE3));
4827 EnsureSpace ensure_space(
this);
4829 emit_optional_rex_32(dst, src);
4833 emit_sse_operand(dst, src);
4836 void Assembler::sse4_instr(XMMRegister dst, XMMRegister src, byte prefix,
4837 byte escape1, byte escape2, byte opcode) {
4838 DCHECK(IsEnabled(SSE4_1));
4839 EnsureSpace ensure_space(
this);
4841 emit_optional_rex_32(dst, src);
4845 emit_sse_operand(dst, src);
4848 void Assembler::sse4_instr(XMMRegister dst, Operand src, byte prefix,
4849 byte escape1, byte escape2, byte opcode) {
4850 DCHECK(IsEnabled(SSE4_1));
4851 EnsureSpace ensure_space(
this);
4853 emit_optional_rex_32(dst, src);
4857 emit_sse_operand(dst, src);
4860 void Assembler::lddqu(XMMRegister dst, Operand src) {
4861 DCHECK(IsEnabled(SSE3));
4862 EnsureSpace ensure_space(
this);
4864 emit_optional_rex_32(dst, src);
4867 emit_sse_operand(dst, src);
4870 void Assembler::psrldq(XMMRegister dst, uint8_t shift) {
4871 EnsureSpace ensure_space(
this);
4873 emit_optional_rex_32(dst);
4876 emit_sse_operand(dst);
4880 void Assembler::pshufhw(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
4881 EnsureSpace ensure_space(
this);
4883 emit_optional_rex_32(dst, src);
4886 emit_sse_operand(dst, src);
4890 void Assembler::pshuflw(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
4891 EnsureSpace ensure_space(
this);
4893 emit_optional_rex_32(dst, src);
4896 emit_sse_operand(dst, src);
4900 void Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
4901 EnsureSpace ensure_space(
this);
4903 emit_optional_rex_32(dst, src);
4906 emit_sse_operand(dst, src);
4910 void Assembler::pshufd(XMMRegister dst, Operand src, uint8_t shuffle) {
4911 EnsureSpace ensure_space(
this);
4913 emit_optional_rex_32(dst, src);
4916 emit_sse_operand(dst, src);
4920 void Assembler::emit_sse_operand(XMMRegister reg, Operand adr) {
4921 Register ireg = Register::from_code(reg.code());
4922 emit_operand(ireg, adr);
4925 void Assembler::emit_sse_operand(Register reg, Operand adr) {
4926 emit_operand(reg, adr);
4930 void Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) {
4931 emit(0xC0 | (dst.low_bits() << 3) | src.low_bits());
4935 void Assembler::emit_sse_operand(XMMRegister dst, Register src) {
4936 emit(0xC0 | (dst.low_bits() << 3) | src.low_bits());
4940 void Assembler::emit_sse_operand(Register dst, XMMRegister src) {
4941 emit(0xC0 | (dst.low_bits() << 3) | src.low_bits());
4944 void Assembler::emit_sse_operand(XMMRegister dst) {
4945 emit(0xD8 | dst.low_bits());
4948 void Assembler::db(uint8_t data) {
4949 EnsureSpace ensure_space(
this);
4954 void Assembler::dd(
uint32_t data) {
4955 EnsureSpace ensure_space(
this);
4960 void Assembler::dq(uint64_t data) {
4961 EnsureSpace ensure_space(
this);
4966 void Assembler::dq(Label* label) {
4967 EnsureSpace ensure_space(
this);
4968 if (label->is_bound()) {
4969 internal_reference_positions_.push_back(pc_offset());
4970 emitp(reinterpret_cast<Address>(buffer_) + label->pos(),
4971 RelocInfo::INTERNAL_REFERENCE);
4973 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE);
4975 if (label->is_linked()) {
4976 emitl(label->pos());
4977 label->link_to(pc_offset() -
sizeof(int32_t));
4979 DCHECK(label->is_unused());
4980 int32_t current = pc_offset();
4982 label->link_to(current);
4990 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
4991 if (!ShouldRecordRelocInfo(rmode))
return;
4992 RelocInfo rinfo(reinterpret_cast<Address>(pc_), rmode, data, Code());
4993 reloc_info_writer.Write(&rinfo);
4996 const int RelocInfo::kApplyMask =
4997 RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
4998 RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
4999 RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
5000 RelocInfo::ModeMask(RelocInfo::WASM_CALL);
5002 bool RelocInfo::IsCodedSpecially() {
5006 return (1 << rmode_) & kApplyMask;
5010 bool RelocInfo::IsInConstantPool() {
5014 int RelocInfo::GetDeoptimizationId(Isolate* isolate, DeoptimizeKind kind) {
5015 DCHECK(IsRuntimeEntry(rmode_));
5016 return Deoptimizer::GetDeoptimizationId(isolate, target_address(), kind);
5022 #endif // V8_TARGET_ARCH_X64